Blog
Notes on frontend, full-stack, AI-assisted engineering, and building for the web.
Why I chose Astro over Next.js for this portfolio
This site is a portfolio and blog, not an app behind a login. Here's why that shape pointed at Astro instead of Next.js.
Going full-stack after ten years on the frontend
What actually changed when I moved from frontend specialist to full-stack, and the lessons from a decade and 80+ projects that carried over.
True full-stack context engineering
The complete version: two monorepos, a Dockerized backend with a database, API, and Mailpit, and Chrome DevTools MCP watching both the UI and the API traffic. One system the agent sees end to end.
Why we moved from Cursor to Claude Code
Cursor is a great AI editor. Our workflow shifted from in-editor assistance to delegating whole tasks to an agent, and that is where Claude Code fit better.
The agent-skills workflow I actually ship with
Spec to plan to build with TDD, then review and a performance pass. How I use Claude Code's agent-skills to move fast without breaking things.
AI that reaches into Linear and Figma
The best thing about MCP is not the model, it is the access. Connecting Linear and Figma to my AI agent means it works from the real ticket and the real design, not my paraphrase.
Context engineering: giving an AI agent the whole stack
Running the frontend and backend together, a monorepo, and a typed GraphQL contract turn an AI coding agent from a guesser into a teammate.
A Dockerized backend for full-stack context engineering
Running the database, Mailpit, and the whole backend in Docker gives me and my AI agent one real, reproducible stack to work against. Add Chrome DevTools MCP and the loop is closed.
How I use the PostHog MCP in my dev loop
Connecting PostHog to my AI coding agent means product data is one question away, right where I write the code that changes it.
Lessons from leading frontend
A few things a decade of frontend work and years of leading it taught me, mostly about leverage and people, not code.
How our startup survives without a QA team
No QA team does not mean no QA. Here is the setup that lets a small team ship with confidence: Vitest, Playwright, and an AI agent with Chrome DevTools MCP doing the manual pass.
Killing flaky tests with hermetic Playwright
Flaky end-to-end tests almost always come from depending on something you do not control. The fix is to make each test own its entire world.
Vitest and Playwright: a testing stack that fits Vite
When your apps build with Vite, Vitest is the unit runner that shares its pipeline, and Playwright covers the rest. Here is why that pairing works.
How we run multiple frontend apps in one Turborepo monorepo
One repo, several apps, a shared design system, and Turborepo keeping builds fast. Here is how it fits together and why it is worth it.
Why my design system runs on shadcn/ui, React, and Zod
A design system is a pile of tool choices. Here is the reasoning behind mine, and the one problem each piece actually solves.
Why we chose Vite over Next.js
Next.js is excellent, but our apps are authenticated SPAs and an embeddable widget backed by a GraphQL API. Here is why Vite was the better fit.