Skip to content
chornous.dev

Type two or more letters. Esc closes.

Index of sheets
Theme

Sheet 03 · Writing

All notes

Next.js 16.2 for teams that ship on it

Next.js 16.2 shipped on March 18, 2026 with faster dev startup, 25% to 60% faster HTML rendering from a React change, Server Fast Refresh, SRI in Turbopack, AGENTS.md in create-next-app and a dev server lock file. Notes from the three release posts.

Pl. 68 · pipeline drawing generated from the slug “nextjs-16-2-release-operational-notes”

The Next.js team released 16.2 on March 18, 2026, with three posts: the main release by Jimmy Lai and Tim Neutkens, a Turbopack post by Andrew Imm and Tim Neutkens, and an AI post by Jude Gao and Tim Neutkens. I read all three with an upgrade in mind and sorted the changes by where you'll notice them.

Rendering: a React fix pays for most of it

The Next.js team contributed a change to React that speeds up Server Components payload parsing by up to 350%. The old code passed a reviver callback to JSON.parse, and in V8 that callback crosses from C++ into JavaScript for each key-value pair. The team found that even an empty reviver makes JSON.parse about 4x slower. The new code runs a plain JSON.parse and then walks the result in JavaScript.

Server render time before and after Next.js 16.2
PageBeforeAfter
Server Component table, 1,000 rows19 ms15 ms
Nested Suspense80 ms60 ms
Payload CMS homepage43 ms32 ms
Payload CMS with rich text52 ms33 ms

Bigger RSC payloads gain more, and the team reports 25% to 60% faster rendering to HTML. If your pages ship large serialized props, such as CMS rich text or data tables, you'll see the top of that range for free.

Dev loop: startup and Server Fast Refresh

The post headlines next dev startup as about 400% faster, and the body puts it at about 87% faster than 16.1 on the default app. Either way, localhost:3000 comes up sooner.

Server Fast Refresh changes more. Before, editing a server file cleared require.cache for that module and its whole import chain, often including untouched node_modules. Turbopack now reloads only the changed module, the way Fast Refresh works in the browser. On a sample site, a server refresh went from 59 ms to 12.4 ms. Across real apps the team measured 67% to 100% faster refreshes and 400% to 900% faster compiles inside Next.js. It's on by default. Proxy and Route Handlers still use the old path for now.

Turbopack closes production gaps

Turbopack became the default bundler two releases earlier, and 16.2 brings more than 200 fixes. Four changes matter in production:

  • Subresource Integrity. Turbopack can hash your JavaScript at build time so browsers refuse modified files. That gives you a strict Content Security Policy without nonces, which force pages into dynamic rendering. This site skips a script-src policy for that reason, so SRI is the first thing I'll test.
  • Tree shaking for dynamic imports. const { cat } = await import("./lib") now drops the unused exports of ./lib, like a static import does.
  • Worker origin. Workers used to boot from a blob: URL with an empty origin, so WASM libraries that fetch relative paths failed. Now the origin matches your domain.
  • postcss.config.ts works next to the .js and .cjs versions.
// next.config.ts
const nextConfig = {
  experimental: { sri: { algorithm: "sha256" } },
  turbopack: {
    ignoreIssue: [{ path: "**/vendor/**" }],
  },
};

turbopack.ignoreIssue filters warnings from vendor code and generated files out of your logs and the error overlay.

Debugging gets specific

  • Server Functions log their name, arguments, duration and file in the dev terminal.
  • Hydration errors label each side of the diff with + Client and - Server.
  • The overlay shows Error.cause chains up to five levels deep.
  • next start --inspect attaches the Node.js debugger to a production server, for CPU and memory profiles.
  • The built-in 500 page got a redesign, for apps without their own error.tsx.

The experimental unstable_retry() in error.tsx calls router.refresh() and reset() inside a transition. The old reset() only re-rendered, which didn't help when the error came from data fetching. The team expects you to prefer unstable_retry() in most cases.

Agents get the same signals

create-next-app now writes an AGENTS.md that tells coding agents to read the docs bundled in node_modules/next/dist/docs/, which match your installed version. Vercel's evals found that bundled docs reached a 100% pass rate, while skill-based retrieval topped out at 79%. Existing projects on 16.2 add two files by hand, and older ones run npx @next/codemod@latest agents-md:

<!-- CLAUDE.md -->
@AGENTS.md

Browser errors now reach the terminal by default. Set logging.browserToTerminal to "warn" or true for more. And next dev writes its PID, port and URL to .next/dev/lock. Start a second dev server and you get the running server's URL and a kill command, which ends the "port 3000 in use" loop that agents fall into. The lock also stops two next build runs from corrupting each other.

The experimental next-browser CLI goes further: it lets an agent read the component tree, analyze partial pre-rendering shells and capture screenshots through shell commands.

Smaller changes

Adapters went stable. <Link transitionTypes={["slide"]}> passes View Transition types on navigation. ImageResponse runs 2x to 20x faster and switches its default font from Noto Sans to Geist Sans, which changes your OG images. icon.png and icon.svg can coexist.

This week

  1. Record next dev startup, a server-file refresh and server render time on your heaviest page before you upgrade, then after.
  2. Diff a sample of your OG images. The font change shows up there first.
  3. Add AGENTS.md and the CLAUDE.md import if anyone on the team uses a coding agent.
  4. Try experimental.sri on a preview deploy if you want a CSP without dynamic rendering.

Volodymyr Chornous