Next.js 15 Features

Short version: Next.js 15 shipped October 21, 2024. Its headline changes: request APIs (
cookies,headers,params,searchParams) became async,fetchandGETroute handlers stopped caching by default, Turbopack Dev went stable, and React 19 support landed. In 2026 these are the production defaults teams build on.
Next.js 15 was the release that changed how a Next.js app handles requests and caching. It went stable on October 21, 2024 (Next.js blog), and the defaults it introduced are now what most production App Router projects run on. This guide answers what changed, which parts matter for new builds, and how the App Router patterns hold up in 2026.
We build production web apps on Next.js, so the notes below are written from the perspective of shipping with these defaults, not just reading the changelog.
What are the main features in Next.js 15?
Next.js 15 grouped its changes into a few areas: async request APIs, new caching defaults, a stable Turbopack development server, and React 19 support. The two breaking changes were the async request APIs and the caching semantics. Everything else was additive.
Here is the full feature set, from the official October 21, 2024 release notes:
| Feature | What changed | Why it matters |
|---|---|---|
| Async Request APIs (breaking) | cookies, headers, draftMode, params, and searchParams became asynchronous and must be awaited | Lets the server prepare work before a request arrives; every dynamic route needs an await |
| Caching Semantics (breaking) | fetch, GET route handlers, and client navigations are no longer cached by default | Fresher data out of the box; you now opt into caching instead of opting out |
| Turbopack Dev (stable) | next dev --turbo reached stable | On vercel.com, Vercel reported up to 76.7% faster server startup and 96.3% faster Fast Refresh |
| React 19 support | Support for React 19 plus the experimental React Compiler | Access to React 19 APIs and automatic memoization (experimental at launch) |
<Form> component (next/form) | New form element with prefetching and client-side navigation | Search-style forms that navigate get prefetch and progressive enhancement without boilerplate |
unstable_after (experimental) | Schedule work after the response finishes streaming | Run logging or analytics without making the user wait |
instrumentation.js (stable) | Stable API for server lifecycle observability | A supported hook for monitoring and tracing setup |
TypeScript next.config.ts | Config file can be written in TypeScript | Typed config, fewer config mistakes |
| ESLint 9 support | Added support for ESLint 9 | Lint on the current major while keeping ESLint 8 compatibility |
What changed with caching in Next.js 15?
Caching flipped from opt-out to opt-in. In Next.js 14, fetch requests and GET route handlers were cached by default. In Next.js 15, they are not.
Three specific defaults changed, per the release notes:
fetchrequests are no longer cached by default. Opt back in per call withcache: 'force-cache'.GETroute handlers are not cached by default. Opt in withexport const dynamic = 'force-static'.- The client-side Router Cache now uses a
staleTimeof0for page segments, so navigation reflects the latest page data. Shared layouts still partially render, andloading.jsstays cached for 5 minutes.
For a build, this means you decide caching deliberately. A pricing page that must be fresh needs no extra work. A rarely-changing docs page is where you add force-static or a revalidate window. The mental model is: nothing is cached until you say so.
How do the async request APIs work in Next.js 15?
cookies, headers, draftMode, params, and searchParams return promises, so you await them. The reason, per Vercel, is that the server can prepare components that do not need request data before the request even arrives.
A reading of a cookie now looks like this:
import { cookies } from 'next/headers';
export async function AdminPanel() {
const cookieStore = await cookies();
const token = cookieStore.get('token');
// ...
}
params and searchParams are also async inside layout.js, page.js, route.js, generateMetadata, and generateViewport. At the 15 launch these APIs could still be read synchronously with a warning. That grace period ended in Next.js 16, where async access is required. There is an official codemod to migrate:
npx @next/codemod@canary next-async-request-api .
How fast is Turbopack in Next.js 15?
Turbopack Dev (next dev --turbo) reached stable in Next.js 15. Vercel measured it against vercel.com, a large Next.js app, and reported up to 76.7% faster local server startup, up to 96.3% faster code updates with Fast Refresh, and up to 45.8% faster initial route compile without caching (Next.js blog).
Two caveats worth keeping accurate. In Next.js 15 these gains applied to the development server, not production builds. And at that release Turbopack had no disk caching yet. Both moved forward in later versions: Next.js 16, released October 21, 2025, made Turbopack the default bundler for next dev and next build (Next.js blog).
What are the App Router best practices in 2026?
The App Router patterns that worked at the Next.js 15 launch still hold, with the caching change baked into how teams write data fetching. From building on these defaults, five hold up well:
- Default to Server Components. Fetch data on the server and pass plain props down. Reach for
'use client'only at the leaves that need interactivity, not at the top of a route. - Be explicit about caching. Since nothing caches by default, state intent:
cache: 'force-cache'or arevalidatewindow for stable data, and leave dynamic data uncached. The default is correct more often than not. - Await request APIs everywhere. Treat
cookies,headers,params, andsearchParamsas async from the first line. Code written this way needed no migration when Next.js 16 enforced it. - Stream with Suspense. Wrap slow data sections in
<Suspense>so the shell renders immediately. This pairs with the request-prepares-early model the async APIs enable. - Use
next/formfor navigating forms. Search and filter forms that lead to a results page get prefetching and progressive enhancement for free.
In a real project, the biggest behavior shift is the caching default. Teams upgrading from 14 often see "stale data is gone" and then add back the caching they actually wanted, deliberately. That is the intended direction: correctness first, performance as a choice.
Is Next.js 15 still current in 2026?
No. Next.js 16 became available on October 21, 2025, and Next.js 16.2 followed on March 18, 2026 (Next.js blog). As of June 2026 the latest stable line is 16.2.x.
That said, Next.js 15's features are not obsolete. They became the foundation. Next.js 16 made Turbopack the default bundler, enforced the async request APIs that 15 introduced, and made React Compiler support stable. So the patterns in this guide are still the ones you write today. If you are on 15, the official @next/codemod upgrade CLI handles most of the move to 16.
How we use the App Router in production
We build custom web apps on Next.js as one of our core services. In practice, the Next.js 15 defaults shaped how we write every new route: Server Components by default, caching declared explicitly per data source, and request APIs awaited from the start so upgrades stay clean. The async-everywhere habit is the one that pays off most, because it future-proofed our routes against the Next.js 16 enforcement with zero rework. Furthermore, optimizing search visibility in 2026 requires understanding new formats; for details on structuring your content to appear in modern engines, see our AI Visibility Guide.
If you are planning a Next.js build or weighing an upgrade, our Next.js development services and broader web app development work cover both new builds and migrations. Happy to look at your setup.
Frequently Asked Questions

Written by
Arun Pandit
CEO & Founder
CEO & Founder of FNA Technology. Specializing in AI, automation, and scalable software solutions — helping businesses leverage cutting-edge technology to drive growth and innovation.
Work with us