Build1 distinct publisher3 min readPublished
Async params, a flipped caching default, Turbopack builds and the proxy.ts rename all land in one release. The guide's first real move is running the type checker by hand, because many projects told the build to skip it.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
Follow any of these and your For You feed starts watching them — no settings page required.
build
Next.js 'use cache' claims 700ms TTFB down to 60ms. Every deploy hands the bill back1 distinct publisher
build
Next.js 16.3's memory claim didn't reproduce; its TypeScript handoff cut a build by two thirds1 distinct publisher
build
A strict CSP killed one form in production, and every monitor stayed green1 distinct publisher
build
The soft 404 that returns 200, declares lang=ar, and renders English1 distinct publisher
The promise marks a seam in the render. The stated reason for making params async is that it lets the framework start rendering the static shell before the dynamic values resolve, which improves streaming [10]. Awaiting the value is how you tell the renderer where the dynamic part of the tree begins.
The typing follows the value, and it follows it transitively. `params` and `searchParams` are promises in pages, layouts, route handlers and metadata [2], so every signature that receives one has to be typed as a promise and awaited: a `generateMetadata` you wrote by hand, a shared layout helper, a server component two frames down [9]. The dev.to guide recommends grepping for every `params:` and `searchParams:` annotation and confirming each one is a promise, and calls that the highest-leverage hour of the migration [12]. The harder case is the client boundary. A `'use client'` component cannot await a prop, so the await moves up into the nearest server component and the resolved string comes down, or you unwrap it with `use()` [11]. That is an edit to where the boundary sits, not to a type annotation.
The codemod's own coverage claim sets the size of the manual tail. `npx @next/codemod@latest upgrade latest` pulls matching `next`, `react` and `react-dom` versions and performs the mechanical rewrites [8], and the guide describes it as the first 80% because it wraps the obvious shapes and skips the indirect ones [9]. Take that at face value and roughly one read site in five needs a hand [2]. That ratio is a claim about their codebases. It transfers only if your params reads are shaped like theirs, destructured in page signatures rather than threaded through helpers, and a codebase fond of passing a context object down should expect worse.
Then the config line that decides how you find the rest. The guide's next step is `rm -rf node_modules .next && npm install && npx tsc --noEmit`, and the reason given is that with `typescript.ignoreBuildErrors` set, as it is on many projects, the build will not catch these [13]. That flag is the difference between a migration CI can enumerate and one your users enumerate for you.
Caching is the part that fails without producing an error. Dynamic code in a page, layout or route handler now runs at request time unless you opt in [5], where earlier versions cached aggressively and surprised people with stale data, deduped fetches and routes that went static when you expected them dynamic [c5b]. Opting back in means Cache Components and a `use cache` directive on the data that is genuinely safe [6], which in practice means sorting each dependency into cache it, revalidate on a timer, or never cache [16]. The guide is blunt that an app which felt fast because it was accidentally cached can get slower after the upgrade [15]. That latency was never visible enough to generate a ticket, so the bill arrives only after the deploy.
The ordering in the guide is the part worth copying: codemod, type check, async fixes, deliberate caching, renamed files last [7]. It is sorted by how diffusely each change fails rather than by how big the diff looks, because the four changes touch almost every dynamic route at once and a rushed upgrade breaks in a dozen small places instead of one [14][1]. The author says they run their own site on 16 and have taken client projects across the same gap, and that apps still on 13 or 14 follow the same steps with more of them to work through [17][18].
Ranked by verification strength, evidence, and original report placement.
The guide describes Next.js 16 as the biggest release since the App Router landed, and says the upgrade is not a one-line bump.
In Next.js 16, params and searchParams are promises in pages, layouts, route handlers and metadata, so every place they are read must await.
middleware.ts is on its way out in Next.js 16 in favour of proxy.ts.
Next.js 16 flips the caching default: dynamic code in any page, layout or route handler runs at request time unless you opt into caching.
Earlier versions cached aggressively by default and surprised people with stale data, fetches that were quietly deduped and frozen, and routes that went static when developers expected them dynamic.
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 28, 2026
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Checkable claims, one unchecked voice
The technical substance is unusually falsifiable — a command you can run, a signature you can type, a directive you can grep for — and it is internally consistent, with code samples that match the prose. But every load-carrying statement about what version 16 actually does arrives from the same self-published dev.to post, with no release notes, docs link or second practitioner behind it. Verifiable is not the same as verified.
One author's site, unnamed clients
The only usage anyone attests to is the author's own: this site runs on 16, and some client projects were moved across. That is real production use and worth something, but it comes with no client names, no project count, no traffic scale and no before-and-after numbers. Nothing in our coverage speaks to how many teams have taken the upgrade, or how many are sitting on 14 waiting.
Sober guide, one soft number
The guide mostly argues against its own excitement: it warns the upgrade can make your app slower, calls the codemod not magic, and tells you the failures will be scattered and small. Two things push it slightly past its evidence. 'Biggest release since the App Router landed' is a superlative with nothing measured under it, and the 80% coverage figure is doing quantitative work it was never earned to do. Modest overstatement, no more.
The guide advertises the service it describes
'We have moved client projects across the same gap' is both a credential and a sales line. A migration guide published by someone who does migrations for money, on a platform where the post is the marketing, has an obvious reason to make the upgrade sound intricate enough to need help — and to sound like the person who has already done it. Nothing here is misleading, but no editor stood between the author's practice and the advice, and the author is not named or affiliated in what we hold.
Plausible throughout, corroborated nowhere
We hold one source, so confidence is capped low by arithmetic before judgement enters. What lifts it off the floor is that the claims are the kind that would be loudly contradicted if wrong — thousands of developers are running these exact commands. What holds it down is that no such corroboration exists in our coverage, and the operational consequences of the caching flip, the part with real money attached, are asserted rather than measured.