Next.js 16: The Real Update for Developers
Originally published in Turkish. Read the original →

Next.js 16 is out and it is not a minor update. The key features and breaking changes of Next.js 16, with stable Turbopack, React Compiler support, smarter routing and new caching APIs that solve real problems.
Next.js 16 just shipped, and it is not a minor update. We are talking about Turbopack becoming stable, the React Compiler being built in, finally smarter routing, and new caching APIs that actually solve problems. Let me walk you through the important features with examples, along with the breaking changes you need to know.
Turbopack Is Finally Stable
Turbopack has reached stability for both development and production. It is now the default bundler for all apps. More than 50% of development sessions and 20% of production builds on Next.js 15.3+ are already running on Turbopack.
Want to stick with Webpack? Just run:
next dev --webpack
next build --webpack
With Turbopack you get:
- 2-5× faster production builds
- Up to 10× faster Fast Refresh
- Zero configuration required
Turbopack File System Caching (Beta)
Turbopack now supports file system caching in development. It stores build artifacts on disk, which gives significantly faster compile times across restarts. Great for monorepos.
const nextConfig = {
experimental: {
turbopackFileSystemCacheForDev: true,
},
};
All internal apps at Vercel already use it and are seeing notable improvements.
Simplified create-next-app
create-next-app has been redesigned with a simplified setup flow. The new template includes the App Router, a TypeScript-first configuration, Tailwind CSS and ESLint by default.
React Compiler Support (Stable)
Built-in support for the React Compiler is now stable. You get automatic memoization without useMemo or useCallback. The compiler handles it all.
const nextConfig = {
reactCompiler: true,
};
Install the compiler plugin:
npm install babel-plugin-react-compiler@latest
Note: Because the React Compiler relies on Babel, expect higher compile times.
New Caching APIs
Next.js 16 introduces refined caching APIs for explicit control over cache behavior.
revalidateTag() Now Requires Cache Profiles
revalidateTag() now requires a cacheLife profile as its second argument. This is handy when you want to clear the cache for only a specific section of a page rather than the whole page.
// Recommended for most cases
revalidateTag("blog-posts", "max");
// Other built-in profiles
revalidateTag("news-feed", "hours");
revalidateTag("analytics", "days");
// Custom revalidation time
revalidateTag("products", { revalidate: 3600 });
They recommend 'max' for most cases. It enables background revalidation for long-lived content. When users request tagged content, they get the cached data instantly while Next.js revalidates in the background.
Perfect for blog posts, analytics or dashboards that don't need instant updates.
updateTag()
This Server Actions-only API provides read-your-writes semantics, expiring cached data and refreshing it immediately within the same request.
"use server";
import { updateTag } from "next/cache";
export async function updateUserProfile(userId, profile) {
await db.users.update(userId, profile);
updateTag(user-${userId});
}
Unlike revalidateTag(), this happens instantly. Perfect for user settings, profiles and dashboards, where users expect immediate feedback after mutations.
refresh() Only for Uncached Data
This Server Actions-only API is just for refreshing uncached data. It doesn't touch the cache at all.
"use server";
import { refresh } from "next/cache";
export async function markNotificationAsRead(notificationId) {
await db.notifications.markAsRead(notificationId);
refresh();
}
Use it for notification badges, cart counts and live metrics. Your static shell stays fast while the dynamic parts update.
It complements the client-side router.refresh() function.
Build Adapters API (Alpha)
Create custom adapters that hook into the build process for deploying to your own infrastructure.
const nextConfig = {
experimental: {
adapterPath: require.resolve("./my-adapter.js"),
},
};
Deploy to Cloudflare Workers, upload assets to S3 or use your internal platform. Next.js is becoming genuinely modular.
Improved Routing and Navigation
A complete overhaul of the routing system. Page transitions are now leaner and faster.
Layout Deduplication: When prefetching multiple URLs with a shared layout, the layout is downloaded once instead of separately for every link. A page with 50 product links now downloads the shared layout once instead of 50 times.
Incremental Prefetching: Next.js only prefetches the parts that aren't already in the cache. The prefetch cache now cancels requests when links leave the viewport, prioritizes prefetching on hover and re-prefetches when data is invalidated. It works seamlessly with Cache Components.
Trade-off: More individual requests, but much lower total transfer sizes. No code changes required.
Cache Components and PPR
Next.js 16 removes the experimental PPR flag. PPR is being integrated into Cache Components.
const nextConfig = {
experimental: {
cacheComponents: true,
},
};
Partial Pre-Rendering loads your static content first, and dynamic content is streamed in. With Cache Components, it can automatically work out what to cache and what not to. More details are coming before Next.js Conf.
Important: If you are using experimental.ppr = true, stay on your current Next.js canary version. A migration guide will come before the stable release.
React 19.2 Integration
Next.js 16 uses the latest React Canary release with React 19.2 features:
- View Transitions: Animate elements that update inside a transition or navigation
- useEffectEvent(): Extract non-reactive logic from Effects into reusable Effect Event functions
: Render "background activity" by hiding UI with display: nonewhile preserving state
Breaking Changes
Version Requirements
- Node.js 20.9+ (Node.js 18 is no longer supported)
- TypeScript 5.1.0+
- Browsers: Chrome 111+, Edge 111+, Firefox 111+, Safari 16.4+
Notable Removals
- AMP support completely removed
- next lint command removed (use ESLint directly, a codemod is available:
npx @next/codemod@canary next-lint-to-eslint-cli) - Runtime configs removed (use
.envfiles) - experimental.ppr flag removed (use
experimental.cacheComponents) - Synchronous access to params, searchParams, cookies, headers, draftMode now requires
await - next/image local src with query strings now requires the
images.localPatternsconfig
Behavior Changes
- Turbopack by default (opt out with --webpack)
- images.minimumCacheTTL: changed from 60 seconds to 4 hours (14400s)
- images.imageSizes: 16 removed from the default sizes
- images.qualities: changed from [1..100] to [75]
- images.dangerouslyAllowLocalIP: blocks local IP optimization by default
- images.maximumRedirects: changed from unlimited to a maximum of 3
- revalidateTag(): now requires a cacheLife profile as its second argument
- Parallel routes: all slots now require explicit
default.jsfiles - Dev and build: now use separate output directories
- Terminal output: redesigned with clearer formatting
- Babel in Turbopack: enabled automatically if a config is found
- Modern Sass API: sass-loader upgraded to v16
Deprecations
- middleware.ts: rename to
proxy.tsto clarify the network boundary and routing focus - next/legacy/image: use
next/imageinstead - images.domains: use
images.remotePatternsinstead - revalidateTag() with a single argument: use the two-argument form or
updateTag()
Additional Improvements
- Performance optimizations for the
next devandnext startcommands - Node.js native TypeScript support for
next.config.tswith the--experimental-next-config-strip-typesflag
Final Thoughts
Next.js 16 is packed with quality-of-life features. The new caching APIs solve real problems, routing feels instant, and Turbopack brings performance gains to everyone. More features are coming in two weeks, ahead of Next.js Conf.
Next.js 16 is an important step in the framework's maturing process. With Turbopack becoming stable, React Compiler support and new caching strategies, it gives developers more control and performance.
The new caching APIs in particular (revalidateTag, updateTag, refresh) offer solutions optimized for different use cases. This lets you fine-tune the performance of your applications.
Although the breaking changes are significant, the Next.js team provides the tools needed for migration (codemods). If you have a large Next.js project, it is recommended that you run thorough tests in a test environment before upgrading.
More feature announcements are expected ahead of Next.js Conf. The framework's future looks bright, and continuous improvements for developers keep coming.




