Models orchestrated
- Claude
- OpenAI / Codex / GPT-4o
- Groq
- Gemini vision
- local Ollama
- Stable Diffusion
Selected work
Seven in detail, then the full catalogue of 29 — live products, eval harnesses, pipelines, safety tooling and ops dashboards.
Every entry below links to something you can open: the running product, a demo on sample data, or the writeup explaining how it was built. Where no demo honestly demonstrates a system, you get the writeup instead of the nearest available demo — a link that misrepresents the work is worse than no link.
A tutored exam-prep product with Stripe billing, spaced-repetition scheduling and bilingual English/Spanish content. The localisation pipeline moves roughly 3,400 items through a five-stage QA gate; it is resumable and cost-capped, so a bad run is cheap to abandon rather than something I have to babysit to the end.
What I did: Built and shipped end to end — billing, scheduling algorithm, content pipeline, and the QA gate that decides whether a translation batch is allowed through.
One blog topic fans out to a Facebook caption, an Instagram caption with hashtags, and an email subject and body, from a single model call on a nightly cron. It runs as an admin tool in production, which means it fails in front of someone who will tell me.
What I did: Designed the fan-out, wrote the publish integrations, and put it in the hands of non-technical staff who use it daily.
Type an address, get ranked candidate matches drawn from 25+ public-record sources, with a per-issue score breakdown a voter can read and argue with. Determinism-audited: the same inputs produce the same ranking every run.
What I did: Built the scoring engine and the determinism audit. For anything touching an election, a ranking nobody can explain is not a feature.
One item routed to Ollama, Groq and Codex in parallel. A non-LLM scoring layer picks the winner, then a person approves before anything is written to SQL. Runs at zero marginal cost locally, which is the reason it actually gets used.
What I did: Designed the routing and the scoring layer. The cost work is the governance work: controls that are expensive get quietly dropped in month nine.
A portable safety fence for AI coding agents: it blocks the dangerous actions — leaking secrets, deleting things, claiming done without proof, rewriting history — and lets the safe ones through. Stdlib-only Python, no dependencies, 53 tests.
What I did: Wrote it as a standalone reusable layer. Off by default and on purpose; it only enforces once you explicitly activate it.
One model generates assets, a second verifies them, and the run fails closed if centroid drift crosses a fixed threshold. It exists because a single model generating a large asset run will drift confidently and quietly, and nobody notices until the whole set is wrong.
What I did: Built the consensus gate and the status board that makes a long run inspectable while it is still running.
A model call per dish returns a carb and calorie range, and an eval loop computes MAPE against ground truth in real time, on screen, while you use it. The offline fallback says on its face that it is a fallback.
What I did: Built the eval harness first and the feature second. The live product is not linked here by choice — it sits behind a login over personal data.
The full catalogue
Everything with a demo, a written case study, or a live domain. Each line leads with the outcome that matters for the job, not the technology — the technology is on the card underneath it.
Shipped SaaS · Stripe billing · ~3,400 items through a 5-stage QA gate
Tutored exam-prep product with spaced-repetition scheduling and bilingual EN/ES content. The localisation pipeline is resumable and cost-capped, so a bad run is cheap to abandon.
Groq · Next.js · Supabase · TypeScript · Stripe · SM-2
4-issue weighted match · transparent per-issue score breakdown · determinism-audited
Address in, ranked candidate matches out, drawn from 25+ public-record sources. Same inputs produce the same ranking every run — for anything touching an election, an unexplainable ranking is not a feature.
Next.js · TypeScript · determinism audit · 25+ record sources
1 topic → 4 channel outputs · nightly cron · in production
One blog topic fans out to a Facebook caption, an Instagram caption with hashtags, and an email subject and body from a single model call. Runs as an admin tool used daily by non-technical staff.
Groq · Next.js · publish API · nightly cron
3-role ops portal · Owner KPIs / Manager exception queue / Tech checklist
Role-aware field-service operations: portfolio KPIs and threshold alerts for the owner, a one-click assignment queue for the manager, today's jobs with photo-evidence capture for the tech.
Next.js · field ops · role-based UI · dashboards
Live margin · per-SKU gross profit · print-to-PDF
Food-vendor cost and margin calculator: edit menu items inline and watch per-SKU margin move. Unit economics a vendor can actually operate, not a spreadsheet they abandon.
Next.js · unit economics · margin modelling
4 operator tools behind 1 gated interface
Gated owner toolset: AI business briefing, walk-site estimator, quote builder, and admin controls in one place.
Next.js · Groq · estimator · quote builder
6 underwriting tools · live GO / HOLD / NO-GO verdict
NorCal affordable-housing underwriting suite: HCV rent-cap screen, RCFE calculator, and deal screens that return a verdict rather than a number to interpret.
Next.js · TypeScript · real-estate underwriting
Brand blurb + image prompt + cost sheet, generated locally
Local-AI packaging studio: brand positioning copy and Stable Diffusion image prompts, with an SSRF-safe image API. Runs on local Ollama, so the marginal cost is zero.
Ollama · Stable Diffusion · Next.js · cost engine
Two partners, one synced session, source-grounded
Guided communication exercises with both screens synced live. The content is source-grounded rather than model-improvised, which is the whole point in this domain.
Supabase Realtime · Next.js · TypeScript
Live on its own domain
Shipped and serving users. It is the one live product with no writeup or demo in this repo, so it is listed as a domain rather than described from guesswork.
Next.js
Live MAPE vs labelled ground truth, on screen while you use it
A model call per dish returns a carb and calorie range, and an eval loop computes mean absolute percentage error against a 5,800-image nutrition dataset in real time. The eval harness came first; the feature came second. The live app is not linked — it sits behind a login over personal data.
Groq · llama-3.3-70b · dataset-backed eval · MAPE
~3,400 items EN→ES · 5-stage QA gate · resumable · cost-capped
Translation at volume where the interesting problem is not the translation but knowing which batches are safe to ship. Every stage is a gate with a written pass condition.
multi-model · staged QA gates · resumable runs
Meta-tooling: scores this portfolio's own projects
The tool I used to audit my own work — which is how several of the defects on this site were found, including demos that claimed to be live while making no model call.
Next.js · scoring rubric · audit harness
Scenario projections with the assumptions visible
A model whose inputs you can argue with. Numbers you cannot interrogate are numbers nobody should act on.
TypeScript · scenario modelling
3 providers in parallel · non-LLM scoring picks the winner · $0 to run locally
One item routed to Ollama, Groq and Codex at once. A deterministic scoring layer picks the winner, then a person approves before anything is written to SQL. The cost work is the governance work — controls that are expensive get quietly dropped in month nine.
Ollama · Groq · Codex · deterministic scoring · human-in-the-loop
Fails closed at 85px centroid drift
One model generates assets, a second verifies them, and the run halts if drift crosses a fixed threshold. It exists because a single model generating a large asset run drifts confidently and quietly, and nobody notices until the whole set is wrong.
GPT-4o · Gemini vision · consensus gate · spec-driven pipeline
Turn-by-turn pass-probability coaching
A Socratic tutor for the CSLB contractor licence exam: the learner picks an answer and then has to explain why, which is where the actual teaching happens.
Groq · Socratic prompting · exam prep
3 game modes + per-mode suitability scoring · human playtest loop
Turns flashcards into playable Match, Order or MCQ mini-games, and scores which mode actually suits the material rather than generating all three and hoping.
deterministic generation · suitability scoring · HITL playtest
todo → generating → verify → placed, inspectable mid-run
A status board that makes a long generation run auditable while it is still running, instead of after it has finished going wrong.
spec-driven pipeline · status board
Prompt → asset with the workflow captured, not ad-hoc
Image generation as a repeatable pipeline with recorded settings, so a result can be reproduced rather than re-improvised.
image generation · workflow capture
53 tests · fail-closed · stdlib-only, zero dependencies
A portable safety fence for AI coding agents. It blocks the dangerous actions — leaking secrets, deleting things, claiming done without proof, rewriting history — and lets the safe ones through. Off by default and on purpose.
Python · deterministic rules · fail-closed · 53 tests
Typed JSON workbench the next stage reads back
Human-in-the-loop review as a first-class component: the reviewer's decisions are structured output the pipeline consumes, not a comment thread someone has to interpret later.
typed JSON · review gates · human-in-the-loop
Scaffold to deployed in 5 minutes · model-tier routing built in
One command scaffolds a repo, a Vercel deploy and an agent-ready kit, with a router that sends each job to the cheapest model tier that succeeds. Governance that is expensive to run stops getting run.
Next.js · scaffolding · agent kit · model-tier routing
6 tracked devices · geofence breach alerts · history scrubber
Real-time asset tracking on an SVG floor plan, with breach alerts and a scrubber to replay what happened and when. Built for the moment after the incident, when someone asks where things actually were.
SVG mapping · geofencing · realtime · history replay
6-step intake → tax estimate + benefits-eligibility worksheet
A wizard that collects filing status, income, household and deductions, then returns an estimate alongside benefits eligibility (including CalFresh) — the two questions people actually need answered together.
Next.js · multi-step wizard · eligibility rules
Schema → form → typed JSON payload
A JS object defines the sections, field types and conditional logic; the form and its typed output follow from it. Change the schema, not the form.
schema-driven · conditional fields · typed JSON export
Reading room + writing stats + drafting assistant
A themed chapter reader alongside manuscript tracking and an LLM drafting assistant, in one workspace rather than three tabs.
Next.js · manuscript tracking · LLM assist
Reconciliation surfaced rather than buried in a spreadsheet
Transactions matched and exceptions raised where someone will see them, which is the only place a reconciliation tool earns its keep.
TypeScript · reconciliation · exception surfacing
5-tab shared dashboard: focus · parenting · plans · check-ins · exercises
A shared relationship workspace: weekly focus and load tracking, structured check-ins, requests, agreements and repair flows. The demo runs on fictional data and ships no images; the live app is not linked, by a standing privacy decision.
Next.js · TypeScript · Supabase
Stack
Listed because a recruiter needs to match keywords, and pretending otherwise helps nobody.
The rest of it
The same demos with a capability-based filter over them, plus the older case studies. It is a different, older interface from this site — a working archive rather than a showcase, and I would rather tell you that than restyle it and call it new.
Next step
If any of this looks like the shape of the problem you are hiring for, the form comes straight to me. The resume has the compressed version and opens without an email wall.