SYSTEM 02
NEXT.JS — DELIVERY.
My default when a project needs routing, server rendering and a sane deployment story. Also the framework I've argued with most, which I think is a reasonable sign of familiarity.

//What it's genuinely good at#
Giving you a per-route choice about where rendering happens. On Velocity that mattered enormously: product pages cached at the edge and revalidated by webhook, the basket rendered on the client because it's inherently per-visitor, and personalised blocks streamed in as holes in otherwise static markup. Getting that mixture right took the time to interactive from nine seconds to under two, and almost none of it was optimisation in the usual sense — it was deciding where each piece should run.
//What bites people#
The boundary between server and client code is easy to cross without noticing. One import of a component that uses a hook, and a subtree you believed was server-rendered ships to the browser. I check bundle composition per route on every build rather than trusting my mental model, because my mental model has been wrong often enough to stop trusting it.
Caching is the other one. The defaults changed meaningfully across versions, and code written against one set of assumptions behaves differently after an upgrade in ways that are hard to spot — nothing errors, the data is just staler than you intended. I now write caching behaviour down per route, explicitly, as documentation.
//When I don't reach for it#
Single-purpose interactive pieces, where the framework is most of the payload and none of the value. A standalone WebGL experience or a self-contained tool is usually better as a hand-built page — which is, not coincidentally, how this site is built.