02Enterprise Pharmaceutical Compliance Platform
Live at 3 US pharma companiesHigh-stakes review, validated against expert ground truth
A safety-critical task in a regulated domain: before a company files with the FDA, an expert reads the entire submission — 100 to 200+ documents, thousands of pages — and flags compliance gaps. Getting it wrong has real consequences, so the system had to be measured against human ground truth, not inspection. Expert review took 2 to 3 months; the platform does it in 3 to 4 days.
- Validated against a human gold standard rather than by eyeballing outputs: 85–90% agreement with expert reviewers on a held-out set of submissions they had already assessed.
- Kept every flagged gap auditable and faithful — traceable to its source passage — so a regulated reviewer can verify rather than trust, with no unsupported claims.
- Diagnosed a concrete failure mode (embedding-only retrieval silently missing exact regulatory terminology) and fixed it with hybrid dense + lexical retrieval merged by Reciprocal Rank Fusion.
- Built a fully on-prem pipeline — data could not leave the client's infrastructure — with semantic chunking, table reconstruction and vision-model OCR over multi-thousand-page submissions, treating reliability and data security as first-class constraints.
▸What was hard
A wrong flag has real regulatory consequences, so it's validated against a human gold standard rather than eyeballed, and every flag stays traceable to its source passage. Embedding-only retrieval kept missing exact regulatory terminology; fixing that needed hybrid dense + lexical retrieval merged by Reciprocal Rank Fusion — all running fully on-prem, since the data could never leave the client's infrastructure, over multi-thousand-page submissions with tables and hierarchy preserved.
FastAPIVision LLMsHybrid RAGReciprocal Rank FusionQdrantCeleryRedisLogfirePostHog
03Long-Context Multi-Document Reasoning Platform
Agentic reasoning over context far beyond the window
Answers hard questions over document sets far larger than any context window — by planning, generating and running code, and calling tools, rather than a single retrieval-and-answer pass. Reused across pharmaceutical, legal and finance clients.
- Built on a recursive reasoning architecture (Recursive Language Model) that reasons over large multi-document context directly instead of a lossy multi-hop retrieval loop — ~10× lower token cost and latency, with higher answer accuracy and fewer citation errors.
- Wired regression benchmarking into the development loop: every architectural change validated against a fixed held-out set (internal APEX Agents, Vals.AI Finance) at 85–90% reasoning accuracy — improvements measured, not asserted.
- Designed a document-aware knowledge index preserving hierarchy and cross-references, so retrieval returns structurally coherent, verifiable context instead of isolated chunks.
- Agentic execution — planning, code generation and tool calls — over restart-safe, checkpointed orchestration that survives container crashes with zero lost or duplicated work.
▸What was hard
Reasoning over document sets far larger than any context window without a lossy, expensive multi-hop retrieval loop — so it reasons over the context directly via a recursive architecture, with a document-aware index that keeps hierarchy and cross-references intact. And every architectural change had to be proven on a fixed held-out set through regression benchmarking, not by impression, while keeping token cost and latency ~10× lower and citations faithful.
FastAPIPydanticAIAgentic tool-usePostgreSQLRedisCeleryDockerLogfirePostHog
04Autonomous Real-Estate Sales Platform
Multi-agent orchestration with human oversight where it matters
A multi-agent system orchestrating the full seller-to-buyer lifecycle — lead qualification, omnichannel outreach, buyer matching, negotiation and deal closure — with autonomy where it's safe and human control where it isn't.
- Cut manual broker workload an estimated 70–90% through autonomous outreach, follow-ups, CRM updates and negotiation — while keeping high-stakes pricing decisions human-in-the-loop by design.
- Intent-aware orchestration engine with persistent conversational memory and deterministic tool calls across CRM, Email, SMS, Voice and valuation services, using Buy-Box scoring.
▸What was hard
Every write to a system you don't own is irreversible, so autonomy had to be bounded: mutations split into a pure preview step and a separate executor, approval carried across turns, and high-stakes pricing kept human-in-the-loop. An already-approved action must never be silently redone — 'do it, but change one thing' is treated as a new request, not an approval.
FastAPIPydanticAIMulti-agentHuman-in-the-loopTwilioVapiRedisLogfirePostHog
05Property-Maintenance Concierge & Field-Service App
Shipped to the App StoreAn agentic backend plus a shipped cross-platform mobile client
An end-to-end property-maintenance platform: an event-driven multi-agent backend that runs vendor discovery, outreach, negotiation, scheduling and quotation, paired with a cross-platform mobile client — shipped to the App Store — covering the property portfolio, an owner and vendor directory, and the full lifecycle of service jobs across 46 screens.
- Event-driven multi-agent backend (Communication, Routing, Calendar and Relationship agents) processing thousands of communication events with failure-aware fallbacks — reliability under real-world conditions, not demos.
- Semantic, location-scoped vendor discovery plus structured extraction of quotes and scheduling from open-ended, multi-turn conversations.
- Shipped a React Native client to the App Store — 46 screens over a REST backend, a connected calendar, and device-contact import behind an explicit second consent gate.
- Notification action buttons that resolve a business decision without ever foregrounding the app: the handler authenticates and posts to the backend directly, with distinct paths for an action press, a plain tap and an unrecognised action id.
- A 16-state job lifecycle surfaced as a stepper — where a status change invalidates cache keys the mutation site can't name statically, so invalidation runs by predicate-matching over the query cache.
▸What was hard
The decisions outlive the app session, so notification action buttons authenticate and post to the backend without ever foregrounding the app, with distinct paths for an action press, a plain tap and an unrecognised action id. A 16-state job lifecycle surfaced as a stepper meant a status change invalidates cache keys the mutation site can't name statically — so invalidation runs by predicate-matching over the query cache — and native modules load lazily inside try/catch so the bundle still works where they're absent.
FastAPIPydanticAIMulti-agentReact NativeExpoTanStack QueryAPNs / FCMLogfirePostHog
A few more, with client and product names withheld — sector, architecture and engineering kept, plus a scope note where the work was one part of a larger team.
Construction operations
Conversational agent layer over a project-management platform
A chat surface that lets site and office staff read and write project records — RFIs, daily logs, inspections, budgets, change orders — in natural language instead of navigating roughly ninety separate screens. Rather than hand-writing the tool surface, a generator reflects 131 ORM models, classifies them by column shape, and emits ~520 intent tools plus the agents that own them, so the tools track a schema that keeps moving.
▸What was hard
No single model call can choose sensibly among 520 tools, so requests route through an orchestrator-worker tree — a router, ten domain coordinators and 86 object-level workers — with per-turn tool selection capped at eight and context isolated per subagent. Every mutating action stops for human approval; since the graph library can only interrupt inside the graph that owns the checkpointer, mutating tools were inverted into proposers that return a proposal, and one confirm-and-execute tool at the router carries the approval gate. Identity and tenancy bind from request-scoped context and never enter the model-facing signature — so the model can't set who owns a row or widen an organisation's scope, even by editing a proposal.
PythonFastAPILangGraphLangChainPostgresSQLAlchemySSEReactLogfirePostHog
Legal · regulated market
Case management with national court-record sync
A practice platform that imports and continuously re-syncs matters from a national court-records API — tracking docket movements, official notices and filing deadlines — with an agent that produces versioned document artefacts. Access is governed by firm-level roles, per-matter team assignments with row-level visibility, and a confidentiality seal for restricted matters.
▸What was hard
The upstream API is asynchronous, credit-metered and weakly documented, and every call costs real money — so the interface had to make that asynchrony legible rather than hide it. Long lookups start a job and poll on an interval written to survive a transient not-yet-visible state that would otherwise read as failure; bulk import is a job → preview → confirm flow so credits are only spent on confirm. The agent's tool-call trace streams through a hand-written frame reader whose error type distinguishes a connection failure before anything persisted (safe to retry) from a mid-stream failure (where retrying would write the turn twice).
Scope — Led the frontend — agent chat surface, matter pages, deadlines with calendar sync, role-based member management — and contributed the backend streaming and persistence of agent step traces and versioned artefacts. The court-sync service layer was largely a colleague's.
ReactTypeScriptTanStack QueryFastAPIPostgresRedisCelerySSELogfirePostHog
Consumer fintech · wealth advisory
Two-sided platform for personal finance and advisers
One application with two role surfaces over a shared design system: a dashboard where people with irregular income see aggregated net worth, linked accounts, cash flow, goals and debt payoff; and an adviser workspace for managing a client book through decisions, alerts, an advice ledger and execution tracking — 46 routed pages behind a single token layer.
▸What was hard
Header-based auth sessions can't attach a token to the browser's own EventSource, so both live surfaces needed hand-rolled readers over fetch: one reassembles multi-line frames for a tool-calling chat that renders typed payload cards, the other does sequence-number gap detection and backoff reconnection for an adviser event feed. Retiring the design-file sample data was its own discipline — three line-by-line audits classifying every rendered value as live, mocked or locally derived before replacing it, including optimistic mutations that walk every cached list containing a row, patch it in place, snapshot for rollback, and invalidate on settle.
Scope — Largest line contribution in the repo and dominant author of the adviser surface, the design-token layer, and the migration from raw fetch to a cached query layer. The projection and tax engines were a colleague's; I redesigned and extended their interface.
ReactNext.jsTypeScriptTailwindTanStack QueryWeb WorkersFastAPILogfirePostHog