Writing
Notes on building and shipping web software — mostly the parts that went wrong first.
When a headless CMS is the right backend for an internal tool
Using Strapi as the backend for operational software sounds like a shortcut you'll regret. Sometimes it is. Here's where it has held up for fleet and booking tools, and the signals that it's time to move off it.
Server or client component? The question I actually ask
'Does it need interactivity?' is the textbook test and it's not wrong, just incomplete. The questions I actually work through when deciding where a component runs in the Next.js App Router.
Modeling money in PostgreSQL: the rules I hold to
Money bugs don't crash, they drift. The handful of schema and transaction rules I follow whenever a table stores a balance — learned building a multi-branch money transfer system.
Where AI actually helps me write code (and where it doesn't)
A year of using AI tools daily as a full-stack engineer, minus the hype — what they're genuinely good at, and the three places I still don't trust them.
What actually moved the needle on this site's performance
Most performance advice is generic. Here's the short list of changes that actually mattered on a real Next.js site, in the order I'd do them again.
The authorization pattern I default to, and why
Role checks scattered through controllers work fine until the second role. Here's the guard-and-policy pattern I reach for by default in NestJS, and the alternative I keep rejecting.