Links
Upgrade
# Automated upgrade
npx @next/codemod@canary upgrade latest
# Manual upgrade
npm install next@latest react@latest react-dom@latest
# New project
npx create-next-app@latest
Codemod covers (high-level): moves Turbopack config, migrates next lint → ESLint CLI, migrates middleware → proxy, removes some unstable_ prefixes, removes route-level experimental_ppr.
TypeScript: also upgrade @types/react and @types/react-dom.
What’s New (v16)
- Cache Components: opt-in caching via the
"use cache" directive; evolves/absorbs PPR.
- Next.js DevTools MCP: Model Context Protocol integration for AI-assisted debugging.
proxy.ts: clearer network boundary; middleware.ts deprecated for most use.
- Better logs/metrics: more detailed
next dev and build timing output.
Performance / DX
- Turbopack: stable; default bundler (opt out with
next dev --webpack, next build --webpack).
- If you have a custom
webpack config, next build may fail (to prevent misconfiguration). Fix by migrating config, using next build --webpack, or using Turbopack and removing/ignoring the webpack config.
- Turbopack config moved:
experimental.turbopack → top-level turbopack in next.config.*.
- Turbopack migration gotchas:
- Sass imports: remove the Webpack-only
~ prefix (e.g. @import 'bootstrap/...';).
- Browser bundles must not import Node built-ins (e.g.
fs). If unavoidable, use turbopack.resolveAlias as a stopgap.
- Turbopack filesystem cache (dev, beta):
experimental.turbopackFileSystemCacheForDev: true.
- React Compiler support: stable opt-in via
reactCompiler: true (expect higher build/compile cost).
- Build Adapters API: alpha (custom build adapters).
- Routing/prefetching rewrite: layout deduplication + incremental prefetching.
Caching APIs (key signatures)
revalidateTag(tag, profile) now requires a cacheLife profile (or { expire }) for SWR behavior.
updateTag(tag) (Server Actions only): read-your-writes semantics.
refresh() (Server Actions only): refresh uncached data; does not mutate cache.
cacheLife and cacheTag are stable (no unstable_ prefix).
Requirements (v16)
- Node.js: 20.9+ (Node 18 not supported)
- TypeScript: 5.1+
- Browsers: Chrome/Edge/Firefox 111+, Safari 16.4+
Breaking / Behavior Changes (high-impact)
- Async Request APIs: sync access removed. Use
await params, await searchParams, await cookies(), await headers(), await draftMode().
- Tip (TypeScript):
npx next typegen can generate helpers like PageProps, LayoutProps, RouteContext to migrate params/searchParams types safely.
- Metadata images:
opengraph-image, twitter-image, icon, apple-icon now receive params (and id) as Promises in the image function.
- Sitemaps:
sitemap({ id }) now receives id as a Promise when using generateSitemaps.
- Parallel routes: slots require explicit
default.js.
next/image defaults changed (cache TTL, sizes/qualities); local src with query strings requires images.localPatterns.
Other notable behavior changes:
next dev and next build use separate output dirs (next dev → .next/dev) and a lockfile prevents concurrent instances.
- Scroll behavior: Next.js no longer overrides global
scroll-behavior: smooth during navigations; add data-scroll-behavior="smooth" on <html> to restore the previous override behavior.
- ESLint:
@next/eslint-plugin-next defaults to ESLint Flat Config; legacy .eslintrc projects may need migration.
Removed / Deprecated (high-level)
- Removed: AMP support;
next lint (use ESLint/Biome directly); eslint option in next.config.*; serverRuntimeConfig/publicRuntimeConfig (use env vars); experimental.ppr + route-level experimental_ppr; unstable_rootParams.
- Deprecated:
middleware.ts filename (prefer proxy.ts); next/legacy/image; images.domains (prefer images.remotePatterns); revalidateTag(tag) single-arg form.
proxy.ts note: proxy runs on nodejs only; Edge runtime is not supported in proxy. Keep middleware.ts if you must stay on Edge.
- Config rename example:
skipMiddlewareUrlNormalize → skipProxyUrlNormalize.
1---2name: nextjs16-skills3description: Key facts and links for Next.js 16. Use for planning, writing, and troubleshooting Next.js 16 changes.4---5
6## Links
7
8- Docs: https://nextjs.org/docs
9- Upgrade guide (v16): https://nextjs.org/docs/app/guides/upgrading/version-16
10- Release notes/blog: https://nextjs.org/blog/next-16
11
12## Upgrade
13
14```sh
15# Automated upgrade
16npx @next/codemod@canary upgrade latest
17
18# Manual upgrade
19npm install next@latest react@latest react-dom@latest
20
21# New project
22npx create-next-app@latest
23```
24
25Codemod covers (high-level): moves Turbopack config, migrates `next lint` → ESLint CLI, migrates `middleware` → `proxy`, removes some `unstable_` prefixes, removes route-level `experimental_ppr`.
26
27TypeScript: also upgrade `@types/react` and `@types/react-dom`.
28
29## What’s New (v16)
30
31- Cache Components: opt-in caching via the `"use cache"` directive; evolves/absorbs PPR.
32- Next.js DevTools MCP: Model Context Protocol integration for AI-assisted debugging.
33- `proxy.ts`: clearer network boundary; `middleware.ts` deprecated for most use.
34- Better logs/metrics: more detailed `next dev` and build timing output.
35
36## Performance / DX
37
38- Turbopack: stable; default bundler (opt out with `next dev --webpack`, `next build --webpack`).
39- If you have a custom `webpack` config, `next build` may fail (to prevent misconfiguration). Fix by migrating config, using `next build --webpack`, or using Turbopack and removing/ignoring the webpack config.
40- Turbopack config moved: `experimental.turbopack` → top-level `turbopack` in `next.config.*`.
41- Turbopack migration gotchas:
42 - Sass imports: remove the Webpack-only `~` prefix (e.g. `@import 'bootstrap/...';`).
43 - Browser bundles must not import Node built-ins (e.g. `fs`). If unavoidable, use `turbopack.resolveAlias` as a stopgap.
44- Turbopack filesystem cache (dev, beta): `experimental.turbopackFileSystemCacheForDev: true`.
45- React Compiler support: stable opt-in via `reactCompiler: true` (expect higher build/compile cost).
46- Build Adapters API: alpha (custom build adapters).
47- Routing/prefetching rewrite: layout deduplication + incremental prefetching.
48
49## Caching APIs (key signatures)
50
51- `revalidateTag(tag, profile)` now requires a cacheLife profile (or `{ expire }`) for SWR behavior.
52- `updateTag(tag)` (Server Actions only): read-your-writes semantics.
53- `refresh()` (Server Actions only): refresh uncached data; does not mutate cache.
54- `cacheLife` and `cacheTag` are stable (no `unstable_` prefix).
55
56## Requirements (v16)
57
58- Node.js: 20.9+ (Node 18 not supported)
59- TypeScript: 5.1+
60- Browsers: Chrome/Edge/Firefox 111+, Safari 16.4+
61
62## Breaking / Behavior Changes (high-impact)
63
64- Async Request APIs: sync access removed. Use `await params`, `await searchParams`, `await cookies()`, `await headers()`, `await draftMode()`.
65- Tip (TypeScript): `npx next typegen` can generate helpers like `PageProps`, `LayoutProps`, `RouteContext` to migrate `params/searchParams` types safely.
66- Metadata images: `opengraph-image`, `twitter-image`, `icon`, `apple-icon` now receive `params` (and `id`) as Promises in the image function.
67- Sitemaps: `sitemap({ id })` now receives `id` as a Promise when using `generateSitemaps`.
68- Parallel routes: slots require explicit `default.js`.
69- `next/image` defaults changed (cache TTL, sizes/qualities); local `src` with query strings requires `images.localPatterns`.
70
71Other notable behavior changes:
72
73- `next dev` and `next build` use separate output dirs (`next dev` → `.next/dev`) and a lockfile prevents concurrent instances.
74- Scroll behavior: Next.js no longer overrides global `scroll-behavior: smooth` during navigations; add `data-scroll-behavior="smooth"` on `<html>` to restore the previous override behavior.
75- ESLint: `@next/eslint-plugin-next` defaults to ESLint Flat Config; legacy `.eslintrc` projects may need migration.
76
77## Removed / Deprecated (high-level)
78
79- Removed: AMP support; `next lint` (use ESLint/Biome directly); `eslint` option in `next.config.*`; `serverRuntimeConfig/publicRuntimeConfig` (use env vars); `experimental.ppr` + route-level `experimental_ppr`; `unstable_rootParams`.
80- Deprecated: `middleware.ts` filename (prefer `proxy.ts`); `next/legacy/image`; `images.domains` (prefer `images.remotePatterns`); `revalidateTag(tag)` single-arg form.
81- `proxy.ts` note: `proxy` runs on `nodejs` only; Edge runtime is not supported in `proxy`. Keep `middleware.ts` if you must stay on Edge.
82- Config rename example: `skipMiddlewareUrlNormalize` → `skipProxyUrlNormalize`.