Blog
Thoughts on software engineering, building products, and lessons learned along the way.
React Compiler: The End of Manual Memoization
The React Compiler automatically optimizes your components at build time. Here's how it works, what it replaces, and what can still break it.
Tailwind CSS v4: A CSS-First Revolution
Tailwind v4 replaces JavaScript config with native CSS, ships a Rust-based compiler that's 100x faster on incremental builds, and introduces modern CSS features. Here's what changed.
Server vs Client Components: A Practical Decision Framework
The 'use client' directive isn't a switch you flip when things break. Here's a systematic way to decide where your component boundaries should be.
Why I Replaced ESLint and Prettier with Biome
One tool instead of two. One config file instead of four. 25x faster linting. Here's why Biome won and what you lose by switching.
TypeScript Patterns That Changed How I Write Code
Five TypeScript patterns I use daily — from satisfies to discriminated unions — and why they make code safer without adding complexity.