Build in Public
What I'm building, what broke, what I learned. AI agents, full-stack systems, and the messy reality of shipping software.
Claude Code config is a team asset, not a personal file
On the robbed monorepo I set up Claude Code the way you'd set up CI or CODEOWNERS: a shared, version-controlled, enforced config so every engineer and every AI agent inherits the same conventions, ownership boundaries, and guardrails.
We Gave Our Agent a Third Tool. Then We Deleted It.
Melio's meal-plan agent runs on exactly two tools. We eval-tested a third — a deterministic self-check — and it tripled cost per plan and made accuracy worse. Here's the data that got it deleted.
The Prompt Cache That Silently Did Nothing
We shipped Anthropic prompt caching with green unit tests — and it did nothing in production. The culprit: model-specific cache floors and per-day content ahead of the breakpoint. Here's the diagnosis and the fix.
Query-based CDC over WAL: keeping a CQRS Postgres → ClickHouse read model fresh
Query-based CDC vs log-based (WAL) for a CQRS Postgres→ClickHouse read model: watermark polling, ReplacingMergeTree, reconcile-by-key-diff, and freshness-lag alerts.
Two planes of quality: making meal-plan generation both evaluable and observable
How Melio's meal-plan pipeline splits quality into two planes — online validation and offline evaluation — plus the observability layer that makes them measure the same things, and the reasoning behind which metrics are allowed to block a deploy.
How I Redesigned a Meal Planning App UX: From Panel to Modern Food-First Design
Melio worked, but looked like a back-office admin panel. Here's how I redesigned the entire meal-planning app UX across 47 routes — a research-driven, 9-wave approach that kept every feature intact.
Building an AI Content Engine for a Gov Contracting Platform
Government contracting is jargon-heavy and the content gap is huge. Here's the four-layer AI content engine I built for GovChime: a research agent, rubric scoring, an approval queue, and SEO-ready Next.js publishing.
PostgreSQL + ClickHouse: The Dual-Database Pattern That Made 90M-Row Dashboards Instant
Running analytics on 90M+ rows in PostgreSQL made our dashboards unusable — queries took seconds, joins killed performance. Here's the dual-database architecture we run at GovChime, and the query times I measured: 13.6 s → ~1 s.
Why I Moved AI Out of NestJS and Into a Dedicated Python LangGraph Service
Our NestJS AI chain hit a wall — unreliable outputs, no observability, zero crash recovery. Here's how I replaced it with a 5-node LangGraph StateGraph in Python FastAPI, and why splitting AI into its own service was the right architectural call.
Agent Builders Are Changing How I Ship Code — Here's My Actual Workflow
I've been shipping production features as the main developer on a complex multi-service codebase. The secret isn't working harder — it's building custom AI agents that know my architecture. Here's the exact setup I use with Claude Code.
Hello World — Welcome to My Blog
First post on my new blog. Here I'll share thoughts on software engineering, AI development, and lessons learned building products.