I put AI agents into real products and ship the full stack around them.
Senior full-stack engineer (React, Next.js, Node.js) with 12 years building software for companies in the US, Sweden and Argentina. Most recently Tech Lead at KitchenSync, where our accounting platform for restaurants integrated QuickBooks, Slack and LLMs from OpenAI, Anthropic and Gemini.
Here I write about what actually works when LLMs meet production: structured outputs, validation, cost, evals and agents. More about me.
Work
Topics
- AI in production9LLM features that survive real users: contracts, evals, cost.
- Agents & automation4Agents, MCP servers and bots that do real work.
- Architecture6Frontend and backend structure that scales with the team.
- Backend, security & infra3Auth, data pipelines and the infrastructure under it all.
- Leadership & delivery3Leading small teams and shipping under constraints.
Latest writing
No evidence, no done: a governance framework for coding agents
An open-source set of rules and Claude Code hooks that runs an agent through plan, build, review, test and ship, and won't let it call any step finished without proof.
Reviewing AI-generated code: the checklist I use as a tech lead
Agents write code fast and make it look finished. Here's what I check before I merge a pull request an agent opened, and what I leave to CI.
How I use Terraform on my projects: a boring AWS setup that holds up
Remote state, small modules, one directory per environment, plan on every PR, and the rules that keep Terraform on AWS from turning into a mess. With this blog's own infrastructure as the worked example.
One backend, five identity providers: a walkthrough of auth-reference
A tour of auth-reference, a small TypeScript API that verifies tokens from Firebase Auth, Amazon Cognito, Supabase Auth, Clerk and any OIDC provider behind one interface, built one provider per commit.
WhatsApp chatbots, part 1: the setup nobody documents well
Start of a hands-on series on building a WhatsApp chatbot with Meta's Cloud API. Part 1: the account model, creating the app, the test number, your first message from the terminal, and the webhook that receives replies.
