Writing
Notes from shipping React/Node.js products and putting LLMs and agents into production. New here? Start with these.
Start here
- Building an LLM feature, end to endA hands-on series on planning, designing and shipping an LLM feature, using the transaction categorizer in my finance app Nora. Part 1: the problem, the success criteria, and deciding where the model belongs.
- LLMs in production: the hard part is the contract around the modelWhat I learned putting OpenAI, Anthropic and Gemini behind an accounting product: schemas, deterministic checks, confidence thresholds and a human review queue.
- Designing an MCP server an LLM can use safelyLessons from exposing market data, account data and a trade journal to Claude through MCP: grouping tools, failing clearly, and never letting the model place an order.
- A dev team of agents, each in its own git worktreeHow I turned Claude Code into a small team: a project manager, backend, frontend, database and QA agents working in parallel without stepping on each other.
- One backend, five identity providers: a walkthrough of auth-referenceA 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.
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.
All 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.
A dev team of agents, each in its own git worktree
How I turned Claude Code into a small team: a project manager, backend, frontend, database and QA agents working in parallel without stepping on each other.
Backend for frontend: one API per kind of client
At Doktor24, patients, practitioners and configurators needed very different things from the same platform. Node.js BFF services gave each client an API shaped for it.
Dashboards from JSON schemas: replacing spreadsheet reports
At LeoVegas I built a Node.js service and a schema-driven dashboard framework with pluggable database connectors, so product managers could stop building reports by hand.
Designing an MCP server an LLM can use safely
Lessons from exposing market data, account data and a trade journal to Claude through MCP: grouping tools, failing clearly, and never letting the model place an order.
Five levers for LLM cost that matter more than a clever prompt
Model per task, fewer tokens, caching, batching and measuring every request: the cost controls I rely on when LLMs run inside a real product.
LLMs in production: the hard part is the contract around the model
What I learned putting OpenAI, Anthropic and Gemini behind an accounting product: schemas, deterministic checks, confidence thresholds and a human review queue.
Micro-frontends with Module Federation: what we gained and what it cost
At Doktor24 we split a healthcare web platform into micro-frontends so teams could ship on their own schedule. Here's the reasoning, the trade-offs, and when I wouldn't do it.
One shared TypeScript library for every service, without a god library
At KitchenSync I designed a shared TypeScript library with more than 16 modules used across the whole platform. Here's how to keep something like that useful instead of dangerous.
Reading bank notification emails to track spending in Colombia
Colombian banks don't offer open APIs to regular developers, so Nora reads the transaction alerts they already send by email. Here's how the pipeline works.
Rules as data: onboarding customers without shipping code
At KitchenSync every restaurant had its own accounting rules. Moving those rules out of code and into configuration changed how we onboarded customers.
Rules first, LLM second: categorizing Colombian bank transactions
In Nora, my personal-finance app, the LLM is the last resort, not the first step. Here's the pipeline and why every AI answer becomes a rule.
Shipping software under IEC 62304
What building a triage module for a digital healthcare platform taught me about traceability, risk and documented change, and why those habits are worth keeping outside healthcare.
Three ways LLMs fail in production, and what to do about each
API errors, broken output and answers that look right but aren't. Each one needs a different defense.
Turning a mobile app into a white-label SaaS
How we refactored Doktor24's mobile app so partners could get their own branded version from configuration, with a CI/CD pipeline that builds each brand.
What I learned leading a team of four engineers
Small pull requests, mandatory review, CI, quality audits and settling technical debates with data: the habits that kept quality up at KitchenSync.
Building an LLM feature, end to end (5-part series)
A hands-on series on planning, designing and shipping an LLM feature, using the transaction categorizer in my finance app Nora. Part 1: the problem, the success criteria, and deciding where the model belongs.