We migrated eighteen client codebases to Next 16 over six weeks. Most of it was painless. A handful of patterns deserved the time. These are the notes I wish we had on day one.
Async params are the upgrade that catches every team off-guard. The runtime cost is negligible; the migration cost is high if you have hundreds of dynamic routes. Lean into a codemod and a Friday afternoon.
Turbopack production builds are the headline. Compile times dropped roughly 40% across our portfolio. Where they regressed, it was always a single client component importing the entire icon library — a problem that existed before Next 16 and is now louder.
The new image pipeline is a quiet win. Switching to AVIF + WebP by default reduced our P75 LCP image bytes by 28%. Combine with the new `minimumCacheTTL` and you shave another 10–15% on repeat visits.
If we were doing it again, we'd batch the migration by client tier — high-traffic apps first, internal tools second — and run smoke tests on the dynamic route fan-out before flipping production.