Next.js 16 is the most significant release since the App Router landed. It's a refinement release: features that were experimental for the past year are now stable, defaults have changed, and the mental model is cleaner than ever.
Both next dev and next build use Turbopack out of the box. Cold dev starts are 4–10× faster than the Webpack era. Webpack is still available behind --webpack for the rare edge case.
The new "use cache" directive lets you mark a component, function, or file as cacheable. Combined with cacheTag and cacheLife, you get fine-grained, declarative caching that replaces the old fetch() cache options.
1"use cache";
2
3import { cacheLife, cacheTag } from "next/cache";
4
5export async function getCourse(slug: string) {
6 cacheTag("course", `course:${slug}`);
7 cacheLife("hours");
8 return db.course.findUnique({ where: { slug } });
9}Pages render a static shell instantly while dynamic holes stream in. No new APIs to learn — just opt in per-route with experimental_ppr (kept named for compatibility, now stable).
Next.js 16 ships React 19.2 with the React Compiler enabled by default. Most useMemo / useCallback calls become unnecessary.
Action results are typed end-to-end, useActionState (formerly useFormState) is stable, and progressive enhancement just works.
Metadata can now stream alongside the page body. No more blocking the document head on a slow database call.
| Change | Impact |
|---|---|
| Turbopack default | Some legacy webpack-only plugins won't work. |
next/image requires explicit sizes for fill | Build error in 16; warning in 15. |
unstable_cache deprecated | Use "use cache" instead. |
| Node 18 dropped | Minimum Node version is 20.9+. |
pages/ router maintenance-only | Still supported but no new features. |
If you're on 15.x, the upgrade path is short — most apps need only a few hours. If you're on 14 or earlier, plan a day per ~10 KLOC of app code. The codemod (npx @next/codemod@latest upgrade) handles 80% of the mechanical work.
By the final chapter, you will have built:
Welcome to Next.js 16 — let's go. 🚀