Data scientist · Based in Australia · Open to remote

Charlie
O'Sullivan

I turn messy data into tools people use every week.

I build analytics products end to end: getting the data clean, modelling it properly, and shipping it as an app, dashboard or report that runs without me. I use AI coding tools to build quickly, and tests and written methods to make sure the numbers are right. Open to remote roles and contract work.

Selected work

3 case studies
Own product · Solo · Aug 2026 to now

Strengthly

Training analytics for people who log their lifting in the Strong app.

Problem
Workout apps record every set but say very little about what years of logs add up to. Lifters stall without knowing whether it's their volume, their intensity, how often they train, or the running they do alongside.
What I built
A free web app. Upload a Strong export (and optionally Strava) and it shows:
  • which muscle groups are actually getting stronger;
  • where the weak links and stalled lifts are;
  • a periodised training block built from the lifter's own maxes.
There are no accounts. Data stays in the user's browser.
Result
Launched publicly on LinkedIn with 100+ visitors in the first weeks. Around 9,300 lines of Python, with a test suite and an in-app Methods paper that documents every formula.
Strengthly's body-part growth page: headline growth figures per muscle group, a radar chart of strength growth and a treemap of training volume coloured by growth.
Body-part growth: how much stronger each muscle group has got, against how much training it gets.
Squat, bench and deadlift estimated maxes with monthly trend and a 6-month projection.
Squat, bench and deadlift trends, projected 6 months ahead at the current rate.
Block builder: an 8-week deadlift block with RPE rising 7, 8, 9, 10 in two waves and volume bars per week.
Block builder: loads set from the lifter's history, in RPE 7 → 10 waves.
Table and bar chart testing whether higher running mileage months change squat, bench and deadlift strength, with a shaded band for normal variation.
Does running cost you strength? A permutation test against normal month-to-month variation.

Demo data All screenshots show the app's built-in sample lifter, a made-up three-year training history.

Messy input, one clean schema

Reads three different Strong export formats, removes warm-up sets, and separates loaded, bodyweight and assisted sets. Each format has its own test.

Honest strength estimates

Estimated maxes come from the fewest-rep evidence available, so high-rep sets don't inflate them. Growth compares equal numbers of sessions at each end to remove a best-of-N bias.

Statistics that can say "no effect"

The running test removes each lift's long-term trend, then uses a permutation test. A chart only claims an effect when the gap is bigger than chance produces.

Built to run cheaply

Fits a free 1 GB server by sharing one copy of the demo data. Partial page reloads keep scroll position steady, and cookie-free analytics run on a background thread.

Client work · FMCG supplier · Field sales team

Sales dashboard for a field team

A web app that shows each rep how their own stores and products are tracking.

Problem
Sales reps received retail sales data as large spreadsheets. Finding which of their stores were growing, which were slipping and which products were missing from shelves took hours, so it mostly didn't happen.
What I built
A Python Dash app with a login for each rep, drilling down from territory to store to product. It compares moving annual and year-to-date totals and writes plain-English prompts for each store. A monthly pipeline refreshes the data, reconciles product codes and checks totals before release.
Result
Live and in monthly use by the sales team. I tuned it for a small cloud server (compressed responses, a multi-worker setup) and filmed a how-to video for reps using a training copy with simulated figures.

Illustration Store names and figures are invented. The real dashboard and its data are confidential.

Client work · FMCG supplier · Monthly and quarterly reporting

Automated retail and market reporting

Repeatable pipelines that turn raw data exports into the charts, workbooks and slides a sales team presents to retailers.

Problem
Every month and quarter, sales and market-share reports were rebuilt by hand in Excel and PowerPoint from several data providers. They took days, and broke whenever a provider renamed a product or changed its export layout.
What I built
Python notebooks for each report that read the raw exports and map product codes to brands and categories. They build rolling 52-week and quarterly comparisons and check every total against the provider's own figures. Outputs are print-quality charts, Excel workbooks and slide-ready figures. The run stops if an unknown product code appears, instead of quietly dropping it.
Result
Reports now run the same way every cycle. When a provider changes its format, I update one parser instead of rebuilding a report. The checks catch delisted lines, new launches and duplicate product rows before anyone presents the numbers.
  1. Read raw exportsWide or long layouts, weekly or monthly, from several providers.
  2. Map codesProduct codes to brands and categories, with fixed lists under version control.
  3. CheckTotals tie out to the source. Unknown codes stop the run.
  4. CompareRolling 52 weeks and quarters against last year, over equal periods.
  5. PublishCharts, Excel workbooks and slide figures, with date ranges on every chart.

Also built

Automation · Personal project

Marketplace listing monitor

A tool that watched online marketplace listings for a stolen campervan. It checked new listings as they appeared and flagged likely matches for a person to review.

Outcome: the van was found.

How I work

Start from the decision

Before building anything, I work out who will use the output and what they need to decide. A rep visiting a store needs the one shelf gap worth raising, not a table of 40 products.

Check against the source

Every pipeline ties its totals back to the raw data, and tests cover each input format. If the numbers don't reconcile, the run stops.

Write the method down

Formulas, thresholds and caveats are documented where users can read them. AI tools make me fast, and this keeps the speed from costing accuracy.

PythonpandasNumPyPlotlyStreamlitDashHerokuExcel automationPlaywrightGitHTML / CSS / JSGoogle Apps Script