Systems that survive contact with reality
I build multi-agent orchestration, retrieval grounded in schemas that actually exist, and inference that keeps working with the network unplugged.
Multi-agent system · 2026 · Live
PrismOS
Seven agents that are required to disagree before any code ships.
Step 1 of 7
Parses the GitHub repo, stack description and any URLs deterministically — no model call. Emits a structured ProductContextSummary injected at system-prompt level. Target: under five seconds.
- Context Analystagent 0 · pre-LLM
- Product ManagerPRD · classify
- ArchitectpositionEngineerpositionQAposition · flags
- Release Managerbinding rulings
- UI/UX Designerfrontend only
- Engineerbuilds the ruling
- Verdictbinding verdict
Five systems, one argument
Each one is a different answer to the same question: what has to be true for a language model to be trusted inside a system that has to be correct?
- Atlas AIAutonomous data engineering · 2026 · Live
Natural language to production dbt models, grounded in the catalog your organization already has.

- FinSightDocument intelligence · SaaS · 2025 — 2026 · Live
Turning a messy bank statement into clean rows, for a market that bank-linking APIs do not serve.

- FarmTwinOffline-first local inference · 2026 · 7-day sprint · Submitted
A cited agronomic advisor that runs entirely on a 2014 laptop with the network unplugged.

- FlowMindAI product · SaaS · 2025 — 2026 · Live
Removing the triage tax that kills productivity systems.

How the work changed
Each stage moved the line on what I was accountable for.
Freelance AI Engineer
NowIndependent · 2025 — Present
Owning the system, not just the surface.
Building LLM-backed products end to end, for clients and for myself: FinSight, FlowMind, PrismOS, Atlas AI, FarmTwin.
From delivering interfaces to being accountable for everything behind them.
Freelance Web Developer
Independent · 2023 — 2024
Learning to ship on someone else's terms.
Websites and web apps for small businesses and early-stage founders: landing pages, booking and contact flows, dashboards and content-managed sites, built with React, Next.js and Tailwind CSS.
From building what I wanted to build to building what someone had agreed to pay for.
Grouped by what I do with them
A list of logos tells you what someone has installed. This is organized by the job each layer is doing.
- Orchestrating models
- LangGraph · LangChain · LlamaIndex · MCP · Multi-agent systems · SSE · WebSockets · Structured output
- Running inference
- Groq · LLaMA · Mistral · Qwen · llama.cpp · Q4_K_M quantization · gpt-oss
- Grounding retrieval
- RAG pipelines · Semantic chunking · sqlite-vec · DataHub knowledge graphs · Citation enforcement · Benchmark rubrics
- Serving it
- FastAPI · Python · Node.js · Express · Next.js · TypeScript
- Storing it safely
- PostgreSQL · Supabase · Row-level security · SQLAlchemy async · asyncpg · SQLite
- Building the product around it
- Next.js · React · TypeScript · Tailwind CSS · Motion · Recharts · Design systems
- Shipping it
- Docker · Vercel · Railway · Render · Neon · Alibaba Cloud SAE · Git · Paystack
Seven things that cost me something
Every principle below came from something that went wrong. None of them are opinions I arrived at in the abstract, and I would not trust them if they were.
The bugs I remember all have the same shape. Nothing throws. Nothing logs. The system returns something plausible and you carry on.
Fixed-size chunking split a transaction table mid-row, so the model got an amount with no date attached and answered confidently. An environment variable set at runtime where Next.js needs it at build time made a frontend fall back silently to fixtures, and the application looked like it was working. A Tailwind v4 migration compiled cleanly and simply did not apply any styles.
So I have stopped treating a green run as evidence. The question is not whether it completed. It is whether I can name what it would look like if it were quietly wrong.
Learned on FinSight · Semantic chunking around section headers, row boundaries as hard splits

I am an AI engineer. Most of what I build sits in the same place: the layer between a language model and a system that has to be correct.
That layer is where the interesting failures live. A model that writes fluent SQL against columns nobody has. A retrieval step that splits a transaction table mid-row and hands back an amount with no date attached. A pipeline that reports success because the frontend quietly fell back to mock data. None of these throw an error. They return something plausible, which is worse.
So the work is rarely the model call. It is the chunking strategy, the schema the output has to survive, the gate that stops a run before it writes to production, the isolation policy that lives in the database instead of in a code path someone can forget. I care about the parts that hold when conditions are not ideal — which, in the market I build for, is most of the time.
Tell me what breaks
I am most useful on systems where a wrong answer is expensive and the failure does not announce itself. Open to AI engineering roles and selected contract work.