Next.js 15 became stable on October 21, 2024. It was a release about defaults: request APIs became async, caching became opt-in for several things that used to be cached, and Turbopack became stable for development. If you are on an older version, this is the checklist of what changed. If you are already past it, skip to the end for how Next.js 16 built on it.
What Is New in Next.js 15?
Next.js 15 added support for React 19, made cookies(), headers(), params and searchParams asynchronous, stopped caching fetch requests, GET route handlers and client router page segments by default, and marked next dev --turbo (Turbopack for development) stable. It also added the <Form> component, next.config.ts, a stable instrumentation.js and ESLint 9 support.
| Change | Type | What to do |
|---|---|---|
Async cookies(), headers(), params, searchParams | Breaking | await them, or run the codemod |
fetch and GET route handlers not cached by default | Breaking | Opt in with force-static or cache options |
Client router cache staleTime is 0 for pages | Breaking | Set experimental.staleTimes to restore it |
| React 19 for the App Router | Upgrade | Pages Router can stay on React 18 |
| Turbopack dev stable | New | Run next dev --turbo |
<Form> component, next.config.ts, instrumentation.js | New | Opt in |
Async Request APIs
The biggest breaking change. The APIs that depend on the incoming request (cookies, headers, draftMode, and the params and searchParams props) are now asynchronous. The reason is rendering: if the framework knows when your code needs the request, it can prepare everything else ahead of time.
import { cookies } from 'next/headers';
export async function AdminPanel() {
const cookieStore = await cookies();
const token = cookieStore.get('token');
// ...
}Next.js 15 still allowed synchronous access with a warning, and Next.js 16 removed it. A codemod handles most of the migration:
npx @next/codemod@canary next-async-request-api .Caching Defaults Changed
Next.js 15 reversed several implicit caching defaults that had confused people since the App Router launched.
fetchrequests are no longer cached by default.GETroute handlers are no longer cached by default. You can still opt in withexport const dynamic = 'force-static'.- The client router cache no longer reuses page segments by default:
staleTimeis0for pages. Shared layouts, back and forward navigation andloading.jskeep their cached behavior.
To get the old client behavior back, use the staleTimes option:
// next.config.ts
const nextConfig = {
experimental: {
staleTimes: {
dynamic: 30,
},
},
};
export default nextConfig;This is the part that led to the explicit 'use cache' model in Next.js 16. If you want that story, read my Next.js 16.3 post on Instant Navigations and Cache Components.
React 19 Support
The App Router in Next.js 15 uses React 19. The Pages Router stays compatible with React 18, so you can upgrade it on your own schedule. Next.js 15 also added experimental support for the React Compiler (as a Babel plugin) and a hydration error view that shows the offending source with a suggested fix. For the React side, see React 19: new features and best practices, and for the compiler, React Compiler explained.
Turbopack Dev Is Stable
next dev --turbo became stable in Next.js 15. On vercel.com, a large Next.js app, the team reported up to 76.7 percent faster local server startup, up to 96.3 percent faster Fast Refresh and up to 45.8 percent faster initial route compilation without caching. Those are Vercel's numbers on their own app, so expect different results on yours. Turbopack for production builds was not stable yet in 15. That came with Next.js 16, where Turbopack became the default bundler.
Smaller Additions Worth Knowing
<Form>component (next/form): extends HTML<form>with prefetching, client-side navigation and progressive enhancement. It is meant for forms that navigate, like a search box.next.config.ts: TypeScript config with aNextConfigtype.instrumentation.jsis stable, with a newonRequestErrorhook for error reporting.- Static route indicator in development shows which routes are static.
- Server Actions security: unused actions are removed from the bundle and action IDs are now unguessable. They are still public HTTP endpoints, so authorize inside every action.
- Self-hosting: more control over
Cache-Controlheaders, andsharpis used automatically for image optimization. - ESLint 9 support, with ESLint 8 still working.
unstable_after: an experimental API to run work after the response finishes streaming.- Minimum Node.js 18.18.0.
How to Upgrade
npx @next/codemod@canary upgrade latestThe CLI updates your dependencies and walks you through the applicable codemods. Review the official upgrade guide for the breaking changes list, test routes that rely on cached fetch data, and check anything that read cookies() or params synchronously.
Next.js 15 vs Next.js 16
Next.js 16 (October 2025) made Turbopack the default bundler, introduced Cache Components with the 'use cache' directive, replaced middleware.ts with proxy.ts, and removed synchronous access to request APIs. Next.js 16.3 added Instant Navigations. If you are choosing a framework rather than a version, see TanStack Start vs Next.js and Is Next.js good for web apps?
Frequently Asked
What is new in Next.js 15? React 19 support, async request APIs, uncached-by-default fetch and route handlers, stable Turbopack for development, the <Form> component, next.config.ts and a stable instrumentation.js.
What are the breaking changes in Next.js 15? Async cookies(), headers(), params and searchParams, new caching defaults for fetch, GET route handlers and the client router cache, and a Node.js 18.18 minimum.
Is Turbopack stable in Next.js 15? For development, yes. Production builds became stable with Next.js 16, which made Turbopack the default bundler.
Should I upgrade from Next.js 15 to 16? Generally yes, after running the codemod. Next.js 15 allowed synchronous request APIs with warnings, and Next.js 16 removed that.