I build end-to-end production systems: apps, data pipelines, and the models they serve.
I'm an engineer who does data science. I started out in 2019 building web apps, APIs, and data infrastructure, and moved into modelling from there. Engineering came first, which is why I own the pipeline and the deployment as well as the model.
Current client work
- 2026.09 Job orchestration platform rebuilt as a React SPA client: Internal platform, used across the client estate The front end had accumulated bugs, a dated interface and changes that were risky to make. It is the tool the team uses to define, schedule and run pipeline jobs, built first in 2024 with task definitions, scheduling, webhook-call tasks with cloud auth and document-store state, so the rebuild went in seven phases: a contract snapshot and session hardening first, then the app shell, tasks, logs, jobs, schedules and admin. The new SPA ran alongside the old one until the last phase retired it. The same release closed a data-access gap, so job and instance records are now filtered by ownership.
- 2026.09 A customer-value modelling platform, templated for onboarding clients: A national fashion retailer · A global footwear brand · A Premier League football club · An international fine-art and collectables auction house A shared platform that predicts what a customer will be worth. Tracking and the model registry run on MLflow aliases, training sits behind one interface any model framework can implement, and hyperparameter search is temporal cross-validation with a horizon embargo, so folds cannot leak across the prediction window. A frozen metric set keeps runs comparable and a promotion gate blocks a model from the production alias unless it beats the incumbent. Each of the seven pipeline stages is a template repository with its infrastructure in Terraform, down to service accounts, budget alerts and quota requests, so onboarding a client is a configuration job. Most of that turns out to be agreeing definitions: when consent applies, whether revenue is quoted with or without VAT, which identity clusters are too stale to use. Predictions go back to the ad platforms as valued conversion events.
- 2026.09 A shared agent repository, with delivery wired into Azure DevOps client: Internal platform, used across the client estate Taking a work item from breakdown to merged pull request meant doing each step by hand: refining it, branching, implementing, reviewing, and moving the card across the board. I proposed making each one an agent, and built most of it: an orchestrator now chains them and moves the card as it goes. It sits in a shared repository for company-wide agents, which anyone can sync down to their local install.
Current personal work
- 2026.08 A trading system that manages its own strategies The system chooses which strategy runs, on which market, at which point, and with how much behind it. It decides when one has stopped earning its place, and whether to retire or rework it. The strategies it picks between come out of research into how much exploitable structure market data carries, across asset classes and timeframes from one second to one day.