Price the Match

A personal project combining two of the things I love most (girlfriend, dog and future baby aside): football and data. Start from what betting exchanges already believe about a football match, add the stories you think it has missed, and see how much of your view the price already contains.

  • Built an exchange collector: adaptive polling toward kickoff, request-weight budgeting against the API's limits, append-only gzipped raw capture with a derived SQLite mirror, streamed off-box to Cloudflare R2.
  • Wrote the pricing layer from scratch: Dixon-Coles goal model fitted to the exchange's own markets with a hand-rolled Nelder-Mead, separate de-vigs for bookmaker and exchange prices, and every output carrying its error bar.
  • Shipped a public web UI where you weight your own narratives against the market and log the view, so the model can be graded against actual xG after the match. One dict, two renderers: the browser computes nothing.
  • Owned every layer solo: ingestion, modelling, API, front end, hosting, monitoring, CI and the docs.

Python · SQLite · DuckDB · FastAPI · Vanilla JS/HTML · PostHog · Vultr

MaeveAI

I joined a B2B fashion startup with a very messy codebase: poorly written models, duplicated code across a duplicated pipeline that took over an hour to run, and an onboarding process that took up to a week. Pipeline failures caused entire app outages and a lot of time was spent being reactive to issues.

  • Implemented blue/green deployment for the database so that a pipeline failure led to slightly stale data rather than a complete outage.
  • Refactored the dbt project into a single pipeline and optimised the models so that a run takes under 20 minutes.
  • Redid the onboarding process so that a new client's data can be ingested and modelled in less than a day.
  • Built the backend for a Claude-powered analytics agent: natural-language-to-Cube queries, prompt caching, error recovery.

dbt · Snowflake · Cube.dev · Python · FastAPI · Postgres · AWS · React · Anthropic Claude

Skin+Me

I joined a DTC personalised skincare brand as their first dedicated data hire. The CTO, Mike, was a data science manager in a previous life so he'd been fulfilling lots of their requests, but it had reached a breaking point where he was a bottleneck.

  • Built and owned the AWS data platform end to end: Airbyte, Redshift, dbt, Superset.
  • Added tests and monitoring to the dbt project so upstream issues were caught before they hit exec dashboards.
  • Partnered with the CFO and growth leads on forecasting, segmentation and marketing performance, feeding directly into budget allocation.
  • Set up office hours and a triage meeting so a one-person function worked on the highest impact work rather than the loudest requests.
  • Ran retention and duplicate-account analysis that changed onboarding and subscription mechanics.

dbt · Airbyte · Redshift · Superset · AWS · Python

Schroders

I joined Schroders, an asset management company, to provide maternity cover and maintain a legacy pipeline serving the front-office investment teams.

  • Refactored a legacy pipeline into a three-step Snowflake process, saving several months of planned engineering time.
  • Improved reliability and timeliness of data delivered to portfolio managers.
  • Worked with Refinitiv/Eikon and QA Direct market data.

Snowflake · Python · dbt · Airflow · Jenkins