Engineering
Why we ship on Next.js 16 and what we learned from 16
Six months and 16 production sites on Next.js 16. What worked, what broke, and how to decide whether to migrate from Next.js 14 or 15.
Next.js 16 is a meaningful step forward. We have shipped 16 production sites on it. This article walks through what worked, what broke, and how to decide whether to migrate.
What changed
Turbopack stable. React 19.2. A redesigned caching model. Edge runtime as a first-class choice. Server actions as the default for mutations. These are not small changes. They change how you build.
What worked
### Turbopack stability
After 18 months in beta, Turbopack is now stable. We use it on every project. Cold start is 5 to 10x faster than Webpack. HMR is sub-100ms on most pages. Build time is 30 to 60 percent faster. There are no showstopper issues.
The only catch: a few niche Webpack loaders do not have Turbopack equivalents. If you use one, check first.
### Edge runtime by default
Middleware runs on the edge. Dynamic pages can opt into edge runtime with one line. We run all marketing sites on the edge now. TTFB under 100ms in most regions, even on cold cache.
### Server actions
Mutations without an API route. Form submissions, database writes, third-party API calls. Server actions replace 70 percent of our API routes. The code is shorter, the security model is better, and TypeScript inference works across the entire stack.
### React 19.2
The compiler removes the need for useMemo and useCallback in most cases. Server components work the same. forwardRef is no longer needed for function components. The use hook replaces some useEffect patterns. Most components need small updates, not rewrites.
What broke
### params and searchParams are Promises
This is the biggest migration cost. Every dynamic route must be async. We wrote a codemod that handles 80 percent of the migration. The remaining 20 percent is manual: components that used params synchronously in render logic.
### Caching is no longer implicit
fetch is no longer cached by default. You must add cache force-cache explicitly. This breaks sites that relied on implicit caching. The fix is a one-line addition, but you need to audit every fetch call.
### React 19.2 strictness
useEffect dependencies are checked more strictly. Strict mode effects run twice in dev. Class component lifecycles have new warnings. None of these are breaking changes, but you will see new warnings in dev mode.
When to migrate
Migrate now if you are starting a new project, have an active project with more than six months of runway, want edge runtime for marketing sites, or want server actions for forms.
Defer the migration if your site is in maintenance mode, you have a critical production release in the next two weeks, or you use a niche Webpack loader without a Turbopack equivalent.
The migration path
Day 1: Update next and react to 16. Day 2: Run the codemod for params and searchParams. Fix manual cases. Day 3: Audit fetch calls. Add explicit cache directives. Day 3: Test in dev mode. Watch for new warnings.
Total: one to three days for most sites.
What we are building with it
- Marketing websites with edge runtime and ISR.
- Internal dashboards with server actions.
- API routes that proxy to third-party services.
- Headless CMS frontends with on-demand revalidation.
The combination of Turbopack, edge runtime and server actions is the most productive web stack we have used.
Questions
Frequently asked questions
Common questions about why we ship on next.js 16 and what we learned from 16, answered plainly.
Was this helpful?
One tap. No email, no signup.