# Next.js 15: What's New, Breaking Changes and Upgrade Notes

Next.js 15 shipped in October 2024 with async request APIs, new caching defaults, React 19 support and stable Turbopack for development. This overview covers what changed, which changes were breaking, and where Next.js 16 picked things up.

Tags: nextjs, react, web-development
Published: 2025-02-04 (updated 2026-10-22)


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.

```tsx
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:

```bash
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.

- **`fetch` requests** are no longer cached by default.
- **`GET` route handlers** are no longer cached by default. You can still opt in with `export const dynamic = 'force-static'`.
- **The client router cache** no longer reuses page segments by default: `staleTime` is `0` for pages. Shared layouts, back and forward navigation and `loading.js` keep their cached behavior.

To get the old client behavior back, use the `staleTimes` option:

```ts
// 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](/blog/nextjs-16-3-instant-navigations-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](/blog/a-deep-dive-into-react-19-new-features-improvements-and-best-practices/), and for the compiler, [React Compiler explained](/blog/the-react-compiler-is-here-say-goodbye-to-usememo-and-usecallback/).

---

## 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 a `NextConfig` type.
- **`instrumentation.js`** is stable, with a new `onRequestError` hook 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-Control` headers, and `sharp` is 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

```bash
npx @next/codemod@canary upgrade latest
```

The CLI updates your dependencies and walks you through the applicable codemods. Review the [official upgrade guide](https://nextjs.org/docs/app/building-your-application/upgrading/version-15) 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](/blog/tanstack-start-vs-nextjs-2026/) and [Is Next.js good for web apps?](/blog/nextjs-for-web-apps-a-technical-perspective/)

## 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.
