Work
The client work here is anonymised. The problems and the approach are real; the names are gone, and the figures come as ratios and shares. My own projects have nobody to protect, so they name things and print the real numbers. Either way, the thinking underneath it is in the slip-box.
What the work is built with
This list is built from the entries below: every tool in it appears in the stack of something on this page. Within a group, whatever is carrying the most current work comes first.
- Languages
- Python · C# / .NET
- Data pipelines & storage
- BigQuery · Apache Beam · Dataflow · Dataform · polars · dbt · Firestore · Pub/Sub · SFTP · FFmpeg · PostgreSQL · SQL Server
- Machine learning
- Vertex AI · XGBoost · Optuna · CatBoost · Kubeflow Pipelines · MLflow · EasyOCR · PyMC · scikit-learn · TensorFlow
- Cloud & infrastructure
- Cloud Run · Docker · Azure Functions · Cloud Functions · Terraform · AWS Batch · AWS Glue · Azure Pipelines · Step Functions · Azure AD · Azure Blob & Queue · Azure Durable Functions
- Clean rooms & ad platforms
- Google Ads API · Amazon Marketing Cloud · Search Console API · AWS Clean Rooms · Meta Ads · Meta Conversions API · LinkedIn API · Amazon Advertising API · Meta API
- Applications & front end
- Angular · React · Flask · ASP.NET Core · FastAPI · NgRx · Tableau
Client work
Eight years of it, most recently independent. The working history below is all of it, one entry per sustained piece of work.
Selected work
Newest first. The date is when it landed; the span is how long it ran.
- 2026.09 Job orchestration platform rebuilt as a React SPA The internal tool the team uses to define, schedule and run pipeline jobs. The front end was rebuilt 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 template-and-Terraform framework for client onboarding Every new client meant hand-building the same seven pipeline stages. Each stage became a template repository, and the infrastructure around it moved into Terraform: foundation, transformation, model application, user unification, orchestration and compute quotas. That included the per-client deployment definitions, which had been made by hand and had drifted apart.
- 2026.08 Two retail clients taken end to end onto the pipeline A national fashion retailer and a global footwear brand, each through all seven stages. A lot of it came down to agreeing definitions: when consent applies, whether revenue is quoted with or without VAT, which identity clusters are too stale to use. Moving into a European region also exposed a set of US defaults in job locations, registry hosts and machine-type quotas.
- 2026.06 Modelling stack rebuilt as an MLflow-native experiment platform A single-framework training path replaced with an MLflow-native one. Tracking and the model registry moved onto aliases instead of stages, two gradient-boosting frameworks went behind one interface, and hyperparameter search became temporal cross-validation with a horizon embargo, so folds cannot leak across the prediction window. A frozen metric set keeps runs comparable, a promotion gate blocks a model from the production alias unless it beats the incumbent, and compile-time provenance ties every run back to the code that produced it.
- 2026.06 First-party data pipeline with clean-room entity resolution Identity matching moved out of the pipeline and onto the clean room's own API, covering both batch and incremental runs, with per-client compute queues and per-environment state machines.
- 2026.03 Clean-room propensity models Churn and next-product classifiers that run inside a clean-room ML environment. All the models share one output schema, so downstream activation needs no per-model handling. The stack moved from pandas to polars.
- 2026.03 Estimated value model wired into paid social An auction house's ad account could only see account creation, so every campaign optimised for cheap registrations. The value sat further down: bids, purchases, consignments, much of it offline and none of it visible to the platform. Built a per-person value estimate that updates as evidence arrives, wrote it back as a valued conversion event, then A/B tested a model-scored audience against the visitor audience it replaced.
- 2026.03 Audience refresh made concurrent An audience service that refreshed sequentially and timed out. Parallelising it exposed a thread-pool deadlock, concurrent-DML failures and transient connection errors, all of which had to be fixed before the speed-up was usable.
- 2025.06 Stock availability forecasting A streaming pipeline forecasting stock availability for a bathroom retailer. Accuracy turned on merchandising logic: excluding parent SKUs, folding in bundle children, and moving materialised tables to views so downstream reads stay current.
- 2025.05 A shared data-science library The library the team's pipelines are built on: pipeline wrappers, warehouse and spreadsheet utilities, config generation, a shared mailer and auth handling. It ships to a private feed with versioned releases and a changelog, so pipelines pin a version instead of copying code between repositories.
- 2025.05 Job orchestration platform, original build The first version of the orchestration tool, rebuilt in 2026. Task definitions, scheduling, webhook-call tasks with cloud auth, job and instance screens, and document-store state.
- 2025.04 Order-level profitability for a bathroom retailer Profit per order, from analytics transactions and back-office data. Most of the work was policy: which orders count as paid, what to do with net-zero values, and how far back to look for orders that settle late.
- 2025.02 Predicted lifetime value pipeline Training and batch inference for a predicted-LTV model, with predictions pushed back into an ad platform as conversions carrying hashed identifiers. A good share of it was correctness work: zeroing negative predictions before they reach bidding, and keeping the inference preprocessor in step with the training one.
- 2025.02 Data import and profit upload services Two supporting services moved onto a newer architecture and a current Python runtime. Retry and timeout policy was made explicit after a run of transient failures.
- 2024.09 Google Ads microservice A service wrapping the Google Ads API for the rest of the estate: reporting, assets and asset sets, keyword plans and conversions. It was carried through several API version upgrades and extended to cover externally held accounts.
- 2024.02 SEO reporting platform Nearly five years of ownership. Ingestion from four search and ranking data providers, scheduled jobs, a reporting interface, and a long migration of storage and scheduling onto configurable infrastructure.
- 2024.02 Order-level profitability for a footwear retailer Streaming pipeline, SFTP connector, deployment pipelines and schema generation, from first commit to feature-complete in under a month.
- 2023.12 Link-building platform rebuilt Rebuilt on the service template below, with multi-tenant support, centralised front-end state, and the link-valuation tooling moved across.
- 2023.09 SERP and content analysis platform Content and search-results analysis jobs, readability scoring for non-English languages, URL comparison, reporting, and the job-result aggregation service behind it.
- 2023.09 A service template for the team's applications A template repository the team's services were built from: caching, global error handling, dialog and notification services, error pages, reusable components and deployment configuration.
- 2023.09 Tenant migration across the estate Applications moved onto a parent group's identity tenant and app registrations after an acquisition, with the auth-claim and user-matching breakage that involved, alongside a framework version upgrade.
- 2023.01 Price feed services consolidated Per-client price-feed services folded into one configurable service, with product filtering by target country and currency, and durable execution for the long-running parts.
- 2022.11 Paid media audit platform Audit definitions, alerting, scheduling and external account management, with sustained work on concurrency and performance under load.
- 2022.01 A family of third-party API microservices Small services fronting external APIs for search console access, warehouse extraction, semantic analysis and search volume. All of them moved onto a serverless runtime with generated client libraries, retry and exponential backoff.
- 2021.12 Paid media reporting platform Report building interface, spreadsheet templates, bulk campaign management, social webhook processing, and the campaign management front end that sat on the advertising microservice below.
- 2021.11 Amazon marketplaces microservice Sponsored Brands and Sponsored Display reporting, moved onto a serverless runtime with retry and visibility-timeout tuning.
- 2021.09 Content extraction with an image model Content and image extraction at scale, including a convolutional bottleneck model for image classification. Logging and retry were hardened around a flaky headless browser.
- 2020.08 LinkedIn advertising microservice Campaign, creative and share posting; campaign groups; lead-generation forms; account management; image hosting. A content validation processor catches malformed campaigns before they reach the API.
Personal work
Selected work
- 2024 - 2026 zeszyt-toolset What does it take to turn a paper scoreboard into a prediction system? A notebook of FIFA results kept by hand since 2020, rebuilt as a system. It reads match stats off screenshots, rates players on a custom ELO that accounts for the club they were dealt, draws fixtures balanced on skill and club strength, runs seasons and cups, and predicts scorelines two different ways.
- 2019 - 2025 Paving What happens to a side project when other people start using it? Six years of a Strava companion app. One ingestion layer feeding a set of unrelated tools: hyperlapse videos, route heatmaps, rule-based activity renaming, a newsletter and weekly performance emails. Most of the work arrived once other people started using it.