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.
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 ranking2024 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 architecture2025 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 architecture2021 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.
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 inference2023 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 reliability2021 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 systems2012 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.