Skip to content

Blog

Notes on frontend, full-stack, AI-assisted engineering, and building for the web.

2 min read

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.

#astro#frontend#architecture
3 min read

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.

#career#frontend#full-stack
3 min read

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.

#context-engineering#ai#full-stack
3 min read

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.

#ai#workflow#claude-code
2 min read

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#workflow#claude-code
2 min read

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.

#ai#mcp#linear
2 min read

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.

#context-engineering#ai#monorepo
3 min read

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.

#docker#context-engineering#full-stack
2 min read

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.

#posthog#mcp#observability
3 min read

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.

#career#leadership#frontend
3 min read

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.

#testing#ai#playwright
2 min read

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.

#testing#playwright#reliability
2 min read

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.

#testing#vitest#playwright
2 min read

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.

#monorepo#turborepo#frontend
3 min read

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.

#design-systems#react#tooling
2 min read

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.

#vite#react#frontend