Home

Case studies

Seven pieces of work across four companies, each written as problem, approach and outcome. Client and product names are left out on purpose. The problem is the part worth reading.

AI workflows and automation 2024 to 2026

Agent workflows replacing manual content operations

Problem

Content and moderation operations were manual. People read, judged and actioned the same categories of thing every day, which meant the work scaled with volume rather than with the team, and the decisions were only as consistent as whoever was on shift.

Approach

Built multi-step agent workflows that call tools rather than just generate text, so the system can look something up, decide, and act. Every external action is scoped and bounded, and every one is written to an audit trail. The model sits behind a provider-agnostic layer, so swapping it is a config change and not a rewrite.

Outcome

The workflows run in production inside a platform serving about 2.2M monthly active users. The manual queues they replaced no longer grow with volume.

  • LLM integration
  • Agent workflows
  • Tool calling
  • Python
  • Provider abstraction
  • Audit trails
Retrieval and ranking 2024 to 2026

Semantic search and retrieval over an existing corpus

Problem

Search was keyword based. It worked when someone typed the right word and failed quietly when they did not, which pushed people back to browsing and asking colleagues. Replacing the whole search stack was not an option, because the ranking behaviour it already had was worth keeping.

Approach

Layered embeddings and vector retrieval alongside the existing Elasticsearch keyword and ranking layer rather than instead of it, and used the same embeddings to drive recommendations. Hybrid retrieval means a query that keywords handle well still gets the old path.

Outcome

Semantic search and embedding-driven recommendation running in production for about 2.2M monthly active users, with the previous ranking behaviour intact.

  • Embeddings
  • RAG
  • Vector search
  • Elasticsearch
  • Python
  • Hybrid retrieval
AI-native product architecture 2025 to now

An AI system built to fail closed

Problem

An AI system that posts publicly on a brand's behalf is one bad generation away from a real problem. The usual answer is a human reviewing everything, which removes most of the value. The harder answer is a system that acts alone for the safe things and stops for the rest.

Approach

Built as a modular monolith on FastAPI with every AI capability behind a replaceable provider port. Generation is grounded on Postgres and pgvector so answers come from the brand's own material. Anything consequential requires a live, scoped, unexpired human approval, and the default when that is missing is to do nothing. Tools are exposed over MCP with scoped access, and quality is checked in CI.

Outcome

In production. The design principle it proved out, that a system should refuse to act rather than produce something plausible, is now how I build anything that runs unattended.

  • FastAPI
  • pgvector
  • RAG
  • MCP
  • Human-in-the-loop
  • Eval gates in CI
Platform architecture 2021 to 2026

A platform fifty other companies build on

Problem

The SDK compiled its screens and logic in. Changing anything meant a new version, which meant every company using it had to update, rebuild and get through app review on their own schedule. Nobody was ever on the same version, and onboarding a new customer was slow enough to lose deals.

Approach

Rebuilt it around server-driven UI, so the backend describes the experience and an already-shipped binary renders it. Added dependency injection so integrators substitute their own pieces instead of forking, and hard module boundaries so a customer only carries what they use. One behavioural contract across native, React Native and Flutter.

Outcome

Changes now reach every app without a client release. Onboarding time down about 80%, and the platform reached roughly 2.2M monthly active users.

BEFORE Product wants a layout change one screen, every customer app Layout + logic compiled into the SDK new SDK version, changelog, migration notes 50+ customer apps each integrate & rebuild on their own release schedule, not yours App Review, then a staged rollout weeks, and the fleet is never on one version AFTER, Server-Driven UI Product wants a layout change same request Config service emits a new UI description versioned, targetable, reversible SDK renders it, same binary, already shipped DI lets an integrator swap any component Live across the fleet no rebuild, no App Review, no version skew
SDUI did not remove the client release train. It removed the fleet’s dependency on it for everything except genuinely new capability. That is what cut integration onboarding time, and it’s also what made SDK binary size a budget worth defending.
  • Server-driven UI
  • Dependency injection
  • React Native
  • Flutter
  • Node.js
  • Go
  • Python
On-device inference 2023 to 2026

Running models on the phone instead of the cloud

Problem

Avatar generation and media effects needed to run somewhere. In the cloud, the per-user cost at 2.2M monthly actives is real money, the latency is worse, and sending someone's face to a server changes the privacy conversation entirely. On the device, a naive pipeline flattens the battery and thermally throttles within a minute.

Approach

Built it on MediaPipe and Apple's Vision framework for detection, Metal for GPU work, and FFmpeg for encoding. Most of the engineering was budget management: keeping per-frame cost inside a thermal envelope, and degrading quality rather than stalling when the phone is already hot.

Outcome

Shipped and running on device across the app fleet, with no per-user inference bill and no user media leaving the phone.

  • MediaPipe
  • Apple Vision
  • Metal
  • FFmpeg
  • GPU pipelines
Performance and reliability 2021 to 2024

Taking a crashing app back to stable

Problem

The flagship app crashed often enough that stability, not features, was what blocked growth. Startup was slow, playback and sign-in were unreliable, and there was no instrumentation to say which of those was actually costing sessions.

Approach

Instrumented first and optimised second. Crash triage, startup profiling and user-journey analytics before touching architecture, then rebuilt the streaming, auth, analytics and notification paths on what the data actually said.

Outcome

About 99% crash-free sessions and cold start down 60 to 70%. The stabilised architecture became the base for the SDK platform.

  • Profiling
  • Crash triage
  • Observability
  • Swift
  • Video streaming
Enterprise systems 2012 to 2019

Enterprise platforms across aviation, tax and retail

Problem

A run of enterprise engagements: an aviation training platform, a statutory tax filing system, analytics, order-to-cash, plus field and commerce apps for a national outdoor-gear retailer and several restaurant operators. Different domains, one recurring constraint.

Approach

Led architecture and delivery across the set. Workflow automation and reporting on secure backend APIs, designed around the integration surface each client was stuck with rather than the one we would have picked. Offline-first where the venue's connectivity could not be relied on.

Outcome

Delivered as technical lead across the portfolio, with multiple apps shipped to the App Store and Play.

  • Enterprise integration
  • Secure APIs
  • Workflow automation
  • Offline-first sync
  • Reporting

Next

The two products I built and shipped on my own, with the architecture behind them.