Field notes on building for the web — shipping AI features, front-end architecture, performance, and the craft of making software people trust.
An agent is just an LLM in a loop with tools and a goal. The hard part is not the loop — it is keeping it bounded, observable, and recoverable when the model is wrong.
Read article →Prompt engineering is not magic incantations. For developers it is interface design — clear contracts, worked examples, and treating prompts like code you can test.
Read article →React Server Components split your tree across the network. Once you see where the server/client boundary sits, the whole model — and when to reach for "use client" — clicks into place.
Read article →The best TypeScript is not the cleverest. It is the code where wrong states will not compile — using the type system as a design tool, not a chore you satisfy after the fact.
Read article →A model that is right 90% of the time can still feel broken if the other 10% shows up at the wrong moment. Trust is a product problem, not a model problem.
Read article →Performance is a feature you can measure, and most of the wins are unglamorous. Ship less, ship it later, and stop blocking the main thread.
Read article →A design system is not a component library. It is an agreement — and agreements break the moment they stop being convenient to keep.
Read article →