{"id":23021,"date":"2026-08-04T18:11:52","date_gmt":"2026-08-04T18:11:52","guid":{"rendered":"https:\/\/scannn.com\/next-js-16-3-next-js\/"},"modified":"2026-08-04T18:11:52","modified_gmt":"2026-08-04T18:11:52","slug":"next-js-16-3-next-js","status":"publish","type":"post","link":"https:\/\/scannn.com\/lv\/next-js-16-3-next-js\/","title":{"rendered":"Next.js 16.3 | Next.js"},"content":{"rendered":"\n<div>\n<p>Last month we published a preview release of 16.3 that let you try out <a href=\"https:\/\/nextjs.org\/blog\/next-16-3-instant-navigations\">SPA-like navigations<\/a>, better <a href=\"https:\/\/nextjs.org\/blog\/next-16-3-ai-improvements\">AI tooling<\/a>, and a <em>much<\/em> less memory-hungry <a href=\"https:\/\/nextjs.org\/blog\/next-16-3-turbopack\">dev server<\/a>.<\/p>\n<p>Today, we&#8217;re excited to announce that Next.js 16.3 is here!<\/p>\n<p>This release is packed with improvements for all existing Next.js apps:<\/p>\n<p>It also includes <strong>Instant Navigations<\/strong>, an opt-in suite of tools that brings the responsiveness of client-driven SPAs to Next.js, without sacrificing the benefits that come with its server-driven model:<\/p>\n<p>The behaviors behind Instant Navigations will become the default in a future major version, as they&#8217;re part of our work over the last year to simplify Next.js back to its roots: dynamic by default, with no hidden or implicit caching.<\/p>\n<p>16.3 also includes <a href=\"#experimental-features\">experimental features<\/a> you can try today, such as the Rust-based React Compiler and network resilience.<\/p>\n<hr\/>\n<p>This is our biggest update to the framework since Next.js 16.0 came out last November, and we can&#8217;t wait for you to try it.<\/p>\n<p>Upgrade by installing the latest version of <code>next<\/code> from npm:<\/p>\n<p>&#8230;and keep reading to learn about everything that&#8217;s new!<\/p>\n<h2 id=\"improvements-for-todays-apps\" data-docs-heading=\"\">Improvements for today&#8217;s apps<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#improvements-for-todays-apps\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h2>\n<p>Next.js 16.3 includes improvements for all existing projects, including lower dev server memory usage, faster rendering, and better runtime performance, all with zero changes to your application code.<\/p>\n<p>We recommend all apps upgrade to 16.3 to start getting these benefits today.<\/p>\n<h3 id=\"less-memory-usage-in-dev\" data-docs-heading=\"\">Less memory usage in dev<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#less-memory-usage-in-dev\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>In 16.3, Turbopack uses <strong>up to 90% less memory<\/strong> when running <code>next dev<\/code>. The reduction comes from two new features that are now enabled by default: disk caching for dev (first introduced in 16.1), and memory eviction.<\/p>\n<p>We&#8217;ve been hearing <a href=\"https:\/\/github.com\/vercel\/next.js\/discussions\/95130#discussioncomment-17439239\" rel=\"noopener noreferrer\" target=\"_blank\">great reports<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a> from early adopters, and we&#8217;re excited to bring these performance improvements to all Next apps.<\/p>\n<figure class=\"not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]\" aria-label=\"Memory usage comparison showing improvements after eviction is enabled\">\n<p><span class=\"text-sm font-medium text-[var(--ds-gray-1000)]\">Memory usage after compiling 50 routes<\/span><\/p>\n<div class=\"flex flex-col gap-4 bg-[var(--ds-background-100)] p-4\">\n<div>\n<p><span class=\"text-sm text-[var(--ds-gray-1000)]\">vercel.com (dashboard)<\/span><span class=\"shrink-0 text-xs font-semibold\" style=\"color:var(--ds-blue-700)\">~90% smaller<\/span><\/p>\n<\/div>\n<\/div>\n<\/figure>\n<p>Learn more about <a href=\"https:\/\/nextjs.org\/docs\/app\/api-reference\/config\/next-config-js\/turbopackMemoryEviction\">Turbopack&#8217;s new memory eviction features<\/a>.<\/p>\n<h3 id=\"faster-builds\" data-docs-heading=\"\">Faster builds<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#faster-builds\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>The disk caching feature that&#8217;s been speeding up dev since 16.1 now works with <code>next build<\/code> and is enabled by default. We&#8217;ve been dogfooding this in production at Vercel for months and are seeing some projects with <strong>5.5x faster builds<\/strong> on CI.<\/p>\n<figure class=\"not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]\" aria-label=\"Next.js build time comparison showing impact of file system cache\">\n<p><span class=\"text-sm font-medium text-[var(--ds-gray-1000)]\">Turbopack compile time for `next build`<\/span><\/p>\n<div class=\"flex flex-col gap-4 bg-[var(--ds-background-100)] p-4\">\n<div class=\"border-t border-[var(--ds-gray-400)] pt-4\">\n<p><span class=\"text-sm text-[var(--ds-gray-1000)]\">vercel.com\/home<\/span><span class=\"shrink-0 text-xs font-semibold\" style=\"color:var(--ds-blue-700)\">~1.4\u00d7 faster<\/span><\/p>\n<\/div>\n<div class=\"border-t border-[var(--ds-gray-400)] pt-4\">\n<p><span class=\"text-sm text-[var(--ds-gray-1000)]\">vercel.com\/geist<\/span><span class=\"shrink-0 text-xs font-semibold\" style=\"color:var(--ds-blue-700)\">~5.5\u00d7 faster<\/span><\/p>\n<\/div>\n<\/div>\n<\/figure>\n<p>Learn more about setting up <a href=\"https:\/\/nextjs.org\/docs\/app\/api-reference\/config\/next-config-js\/turbopackFileSystemCache\">Turbopack&#8217;s new FileSystem Cache<\/a>.<\/p>\n<h3 id=\"faster-type-checking-with-typescript-7\" data-docs-heading=\"\">Faster type checking with TypeScript 7<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#faster-type-checking-with-typescript-7\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/typescript\/announcing-typescript-7-0\/\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Typescript 7<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a> was released last month, which is a 10x faster native port of TypeScript with much faster type checking.<\/p>\n<p>To start using TypeScript 7 for type checking during <code>next build<\/code>, just bump your project&#8217;s local dependency:<\/p>\n<div class=\"my-4 rounded-md group\/copy relative overflow-hidden border border-[var(--ds-gray-400)] [&amp;_.line]:before:!hidden not-prose\" data-geist-code-block=\"\"><button type=\"button\" tabindex=\"0\" data-react-aria-pressable=\"true\" aria-label=\"Copy to clipboard\" data-testid=\"copy\/button\" class=\"outline-none m-0 border-0 align-baseline no-underline group\/trigger relative cursor-pointer select-none transform translate-z-0 flex text-[var(--themed-fg,_var(--ds-background-100))] bg-[var(--themed-bg,_var(--ds-gray-1000))] font-medium max-w-full items-center justify-center transition-[border-color, background,color,transform,box-shadow] duration-[time:150ms] ease-in-out data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;_svg]:shrink-0 disabled:cursor-not-allowed aria-disabled:cursor-not-allowed disabled:text-[var(--ds-gray-700)] disabled:bg-[var(--ds-gray-100)] aria-disabled:text-[var(--ds-gray-700)] aria-disabled:bg-[var(--ds-gray-100)] disabled:![--themed-border:_var(--ds-gray-400)] [--x-padding:10px] [--height:var(--ds-size-medium)] text-[14px] !px-0 rounded-md [--themed-bg:_var(--ds-background-100)] shadow-[0_0_0_1px_var(--themed-border,_transparent)] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--themed-fg:_var(--ds-gray-1000)] [--themed-border:_var(--ds-gray-400)] data-[focus]:shadow-[0_0_0_1px_var(--themed-border,_transparent),0_0_0_2px_var(--ds-background-100),0_0_0_4px_var(--ds-focus-color)] data-[focus]:transition-none p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--ds-gray-100)] dark-theme:data-hover:bg-[var(--ds-gray-200)] data-hover:text-[var(--themed-fg)] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;_svg]:!text-[var(--ds-gray-900)] !absolute z-1 !bg-[var(--ds-background-200)] right-4 top-[min(16%,16px)] opacity-0 group-hover\/copy:opacity-100 focus:opacity-100\" data-geist-button=\"\" data-prefix=\"false\" data-suffix=\"false\" data-version=\"v1\" style=\"--geist-icon-size:16px\"><span class=\"truncate px-1.5 inline-flex items-center justify-center shrink-0\"\/><\/button><\/p>\n<pre class=\"code-block-module__vF3MAa__pre\"><code class=\"font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]\" style=\"font-feature-settings:&quot;liga&quot; off\"><span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-function)\">pnpm<\/span><span style=\"color:var(--shiki-token-string)\"> add<\/span><span style=\"color:var(--shiki-token-string)\"> -D<\/span><span style=\"color:var(--shiki-token-string)\"> typescript@^7<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>Learn more about <a href=\"https:\/\/nextjs.org\/docs\/app\/api-reference\/config\/next-config-js\/useTypeScriptCli\">configuring TypeScript&#8217;s CLI in Next.js<\/a>.<\/p>\n<h3 id=\"faster-server-side-rendering\" data-docs-heading=\"\">Faster server-side rendering<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#faster-server-side-rendering\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>We replaced web streams with native Node.js streams in the App Router rendering layer, removing the overhead of converting between the two during server-side rendering.<\/p>\n<p>In our benchmarks, apps handle up to <strong>22% more requests under load<\/strong>, with no changes to application code.<\/p>\n<figure class=\"not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]\" aria-label=\"Requests handled under load: web streams versus native Node.js streams\">\n<p><span class=\"text-sm font-medium text-[var(--ds-gray-1000)]\">Requests handled under load<\/span><\/p>\n<div class=\"flex flex-col gap-4 bg-[var(--ds-background-100)] p-4\">\n<div>\n<p><span class=\"text-sm text-[var(--ds-gray-1000)]\">App Router server-side rendering<\/span><span class=\"shrink-0 text-xs font-semibold\" style=\"color:var(--ds-blue-700)\">~22% more<\/span><\/p>\n<\/div>\n<\/div>\n<\/figure>\n<p>Read the <a href=\"https:\/\/github.com\/vercel\/next.js\/pull\/94311\" rel=\"noopener noreferrer\" target=\"_blank\">native Node.js streams PR<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a> for more details.<\/p>\n<h3 id=\"versioned-docs-for-ai-agents\" data-docs-heading=\"\">Versioned docs for AI agents<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#versioned-docs-for-ai-agents\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>AI coding agents now automatically read documentation that matches your project&#8217;s version of Next.js.<\/p>\n<p>Running <code>next dev<\/code> writes and maintains a version-matched <code>AGENTS.md<\/code> block that points directly to the bundled docs in your project&#8217;s local node modules. With that knowledge now reaching agents directly, we&#8217;re retiring <a href=\"https:\/\/github.com\/vercel-labs\/next-skills\" rel=\"noopener noreferrer\" target=\"_blank\">our earlier Skills<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a> that existed solely to bring current documentation to your apps.<\/p>\n<p>Learn more about <a href=\"https:\/\/nextjs.org\/docs\/app\/guides\/ai-agents\">setting up Next.js for AI coding agents<\/a>.<\/p>\n<p><!-- --><br \/>\n<!-- --><\/p>\n<h3 id=\"fewer-prefetch-requests\" data-docs-heading=\"\">Fewer prefetch requests<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#fewer-prefetch-requests\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>In 16.3, prefetches below a certain payload size are automatically bundled together to reduce the overall amount of prefetch requests your app makes.<\/p>\n<p>Prefetches for larger shared segments still remain separate, so they can be reused across multiple routes.<\/p>\n<p>Learn more about <a href=\"https:\/\/nextjs.org\/docs\/app\/api-reference\/config\/next-config-js\/prefetchInlining\">prefetch inlining<\/a>.<\/p>\n<h3 id=\"better-caching-for-static-assets\" data-docs-heading=\"\">Better caching for static assets<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#better-caching-for-static-assets\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>Immutable static assets can now be reused across deployments. Since they&#8217;re immutable, they cannot suffer from issues related to skew.<\/p>\n<p>Learn more about <a href=\"https:\/\/nextjs.org\/docs\/app\/api-reference\/adapters\/immutable-static-assets\">immutable static assets<\/a>.<\/p>\n<h3 id=\"custom-error-boundaries\" data-docs-heading=\"\">Custom error boundaries<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#custom-error-boundaries\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>Previously, React error boundaries in Next.js interfered with application code that called <code>notFound<\/code> or <code>redirect<\/code>. They also could only reset client-side state, and gave you no way to retry Server Components that failed during rendering.<\/p>\n<p>In Next.js 16.3, you can use <code>catchError<\/code> to define a custom error boundary that doesn&#8217;t interfere with <code>notFound<\/code> or <code>redirect<\/code>:<\/p>\n<div class=\"my-4 rounded-md group\/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] not-prose\" data-geist-code-block=\"\">\n<div class=\"py-0 pl-4 rounded-t-md h-12 flex items-center border-b border-[var(--ds-gray-400)] bg-[var(--ds-background-200)] pr-3\">\n<div class=\"gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]\"><span class=\"min-w-0 inline-block max-w-full truncate break-normal\">app\/my-error-boundary.tsx<\/span><\/div>\n<\/div>\n<pre class=\"code-block-module__vF3MAa__pre\"><code class=\"font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]\" style=\"font-feature-settings:&quot;liga&quot; off\"><span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-string-expression)\">'use client'<\/span><span style=\"color:var(--shiki-color-text)\">;<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">import<\/span><span style=\"color:var(--shiki-color-text)\"> { catchError<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><span style=\"color:var(--shiki-token-keyword)\"> type<\/span><span style=\"color:var(--shiki-color-text)\"> ErrorInfo } <\/span><span style=\"color:var(--shiki-token-keyword)\">from<\/span><span style=\"color:var(--shiki-token-string-expression)\"> 'next\/error'<\/span><span style=\"color:var(--shiki-color-text)\">;<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">function<\/span><span style=\"color:var(--shiki-token-function)\"> ErrorFallback<\/span><span style=\"color:var(--shiki-color-text)\">(props<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-color-text)\"> { title<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-token-constant)\"> string<\/span><span style=\"color:var(--shiki-color-text)\"> }<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><span style=\"color:var(--shiki-color-text)\"> { error<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><span style=\"color:var(--shiki-color-text)\"> retry }<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-token-function)\"> ErrorInfo<\/span><span style=\"color:var(--shiki-color-text)\">) {<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">  return<\/span><span style=\"color:var(--shiki-color-text)\"> (<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">    &lt;<\/span><span style=\"color:var(--shiki-token-string-expression)\">div<\/span><span style=\"color:var(--shiki-color-text)\">&gt;<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">      &lt;<\/span><span style=\"color:var(--shiki-token-string-expression)\">h2<\/span><span style=\"color:var(--shiki-color-text)\">&gt;{<\/span><span style=\"color:var(--shiki-token-constant)\">props<\/span><span style=\"color:var(--shiki-color-text)\">.title}&lt;\/<\/span><span style=\"color:var(--shiki-token-string-expression)\">h2<\/span><span style=\"color:var(--shiki-color-text)\">&gt;<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">      &lt;<\/span><span style=\"color:var(--shiki-token-string-expression)\">p<\/span><span style=\"color:var(--shiki-color-text)\">&gt;{<\/span><span style=\"color:var(--shiki-token-constant)\">error<\/span><span style=\"color:var(--shiki-color-text)\">.message}&lt;\/<\/span><span style=\"color:var(--shiki-token-string-expression)\">p<\/span><span style=\"color:var(--shiki-color-text)\">&gt;<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">      &lt;<\/span><span style=\"color:var(--shiki-token-string-expression)\">button<\/span><span style=\"color:var(--shiki-token-function)\"> onClick<\/span><span style=\"color:var(--shiki-token-keyword)\">=<\/span><span style=\"color:var(--shiki-color-text)\">{() <\/span><span style=\"color:var(--shiki-token-keyword)\">=&gt;<\/span><span style=\"color:var(--shiki-token-function)\"> retry<\/span><span style=\"color:var(--shiki-color-text)\">()}&gt;Try again&lt;\/<\/span><span style=\"color:var(--shiki-token-string-expression)\">button<\/span><span style=\"color:var(--shiki-color-text)\">&gt;<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">    &lt;\/<\/span><span style=\"color:var(--shiki-token-string-expression)\">div<\/span><span style=\"color:var(--shiki-color-text)\">&gt;<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">  );<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">}<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">export<\/span><span style=\"color:var(--shiki-token-keyword)\"> default<\/span><span style=\"color:var(--shiki-token-function)\"> catchError<\/span><span style=\"color:var(--shiki-color-text)\">(ErrorFallback);<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>The boundary also receive a <code>retry()<\/code> function that you can call to refetch the boundary&#8217;s children, which can include rerendering any Server Components.<\/p>\n<p>Learn more about <a href=\"http:\/\/nextjs.org\/docs\/app\/getting-started\/error-handling#nested-error-boundaries\">custom error boundaries<\/a>.<\/p>\n<h3 id=\"built-in-glob-imports\" data-docs-heading=\"\">Built-in glob imports<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#built-in-glob-imports\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>Turbopack now supports loading multiple modules from the file system using the Vite-compatible <code>import.meta.glob<\/code> API, which brings hot-module reloading and other benefits to Server Components that read from local files:<\/p>\n<div class=\"my-4 rounded-md group\/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] not-prose\" data-geist-code-block=\"\">\n<pre class=\"code-block-module__vF3MAa__pre\"><code class=\"font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]\" style=\"font-feature-settings:&quot;liga&quot; off\"><span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">import<\/span><span style=\"color:var(--shiki-color-text)\"> matter <\/span><span style=\"color:var(--shiki-token-keyword)\">from<\/span><span style=\"color:var(--shiki-token-string-expression)\"> 'gray-matter'<\/span><span style=\"color:var(--shiki-color-text)\">;<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">export<\/span><span style=\"color:var(--shiki-token-keyword)\"> default<\/span><span style=\"color:var(--shiki-token-keyword)\"> function<\/span><span style=\"color:var(--shiki-token-function)\"> Page<\/span><span style=\"color:var(--shiki-color-text)\">() {<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-comment)\">  \/\/ .md needs a loader registered in next.config.js<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">  const<\/span><span style=\"color:var(--shiki-token-constant)\"> posts<\/span><span style=\"color:var(--shiki-token-keyword)\"> =<\/span><span style=\"color:var(--shiki-token-keyword)\"> import<\/span><span style=\"color:var(--shiki-token-function)\">.<\/span><span style=\"color:var(--shiki-token-constant)\">meta<\/span><span style=\"color:var(--shiki-token-function)\">.glob<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-string-expression)\">'.\/posts\/*.md'<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><span style=\"color:var(--shiki-color-text)\"> { eager<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-token-constant)\"> true<\/span><span style=\"color:var(--shiki-color-text)\"> });<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">  return<\/span><span style=\"color:var(--shiki-color-text)\"> (<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">    &lt;<\/span><span style=\"color:var(--shiki-token-string-expression)\">ul<\/span><span style=\"color:var(--shiki-color-text)\">&gt;<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">      {<\/span><span style=\"color:var(--shiki-token-constant)\">Object<\/span><span style=\"color:var(--shiki-token-function)\">.entries<\/span><span style=\"color:var(--shiki-color-text)\">(posts)<\/span><span style=\"color:var(--shiki-token-function)\">.map<\/span><span style=\"color:var(--shiki-color-text)\">(([path<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><span style=\"color:var(--shiki-color-text)\"> mod]) <\/span><span style=\"color:var(--shiki-token-keyword)\">=&gt;<\/span><span style=\"color:var(--shiki-color-text)\"> {<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">        const<\/span><span style=\"color:var(--shiki-color-text)\"> { <\/span><span style=\"color:var(--shiki-token-constant)\">data<\/span><span style=\"color:var(--shiki-color-text)\"> } <\/span><span style=\"color:var(--shiki-token-keyword)\">=<\/span><span style=\"color:var(--shiki-token-function)\"> matter<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-constant)\">mod<\/span><span style=\"color:var(--shiki-color-text)\">.default);<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">        return<\/span><span style=\"color:var(--shiki-color-text)\"> &lt;<\/span><span style=\"color:var(--shiki-token-string-expression)\">li<\/span><span style=\"color:var(--shiki-token-function)\"> key<\/span><span style=\"color:var(--shiki-token-keyword)\">=<\/span><span style=\"color:var(--shiki-color-text)\">{path}&gt;{<\/span><span style=\"color:var(--shiki-token-constant)\">data<\/span><span style=\"color:var(--shiki-color-text)\">.title}&lt;\/<\/span><span style=\"color:var(--shiki-token-string-expression)\">li<\/span><span style=\"color:var(--shiki-color-text)\">&gt;;<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">      })}<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">    &lt;\/<\/span><span style=\"color:var(--shiki-token-string-expression)\">ul<\/span><span style=\"color:var(--shiki-color-text)\">&gt;<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">  );<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">}<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>Learn more about <a href=\"http:\/\/nextjs.org\/docs\/app\/api-reference\/turbopack#importmetaglob\">glob imports<\/a>.<\/p>\n<hr\/>\n<p>So that&#8217;s what&#8217;s new for every app that upgrades today. But 16.3 includes an exciting set of opt-in features that are paving the way for the next major version of the framework, and we&#8217;re excited to dig into those next.<\/p>\n<h2 id=\"instant-navigations\" data-docs-heading=\"\">Instant Navigations<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#instant-navigations\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h2>\n<p>Over the past year, we&#8217;ve been working on fixing the most frustrating things about building with Next.js.<\/p>\n<p>Server Components helped apps ship less JavaScript and avoid network waterfalls, but they made navigations feel slow. The caching model was implicit, confusing, and not helpful for dynamic apps. Prefetching was too aggressive and costly.<\/p>\n<p>Last November, we introduced a new caching primitive to the framework: the <code>'use cache'<\/code> directive. It&#8217;s more explicit and composable than our previous server-side caching APIs, and now, it also brings client-side caching to Next.js for the first time.<\/p>\n<p>We&#8217;ve been building on this primitive to address the navigation, caching, and prefetching problems above, and we ended up with a simpler, more powerful programming model. Server Components and Suspense are still the two primary building blocks, and <code>'use cache'<\/code> now integrates with them in a way that lets you build apps that are static, dynamic, or <em>anywhere<\/em> in between.<\/p>\n<p>For a deeper dive on these new behaviors, read <a href=\"https:\/\/nextjs.org\/blog\/next-16-3-instant-navigations\">last month&#8217;s announcement of Instant Navigations<\/a>.<\/p>\n<p>In 16.3, you can start using building with all these new features by enabling two flags:<\/p>\n<div class=\"my-4 rounded-md group\/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] not-prose\" data-geist-code-block=\"\">\n<pre class=\"code-block-module__vF3MAa__pre\"><code class=\"font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]\" style=\"font-feature-settings:&quot;liga&quot; off\"><span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">import<\/span><span style=\"color:var(--shiki-token-keyword)\"> type<\/span><span style=\"color:var(--shiki-color-text)\"> { NextConfig } <\/span><span style=\"color:var(--shiki-token-keyword)\">from<\/span><span style=\"color:var(--shiki-token-string-expression)\"> 'next'<\/span><span style=\"color:var(--shiki-color-text)\">;<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">const<\/span><span style=\"color:var(--shiki-token-constant)\"> nextConfig<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-token-function)\"> NextConfig<\/span><span style=\"color:var(--shiki-token-keyword)\"> =<\/span><span style=\"color:var(--shiki-color-text)\"> {<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">  cacheComponents<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-token-constant)\"> true<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">  partialPrefetching<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-token-constant)\"> true<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">};<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">export<\/span><span style=\"color:var(--shiki-token-keyword)\"> default<\/span><span style=\"color:var(--shiki-color-text)\"> nextConfig;<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>And if you have existing projects to upgrade, you or your agent can <a href=\"https:\/\/nextjs.org\/docs\/app\/guides\/migrating-to-cache-components\">migrate an app to Cache Components<\/a>.<\/p>\n<p>Here&#8217;s a look at what&#8217;s getting better in Next.js.<\/p>\n<h3 id=\"instant-insights\" data-docs-heading=\"\">Instant Insights<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#instant-insights\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>While Server Components made Next.js apps faster at fetching data and rendering <em>complete<\/em> pages, apps built with prior versions of Next.js often felt <em>less responsive<\/em> than their client-driven counterparts (like SPAs), since those apps could render instant loading states without fetching from the server whenever you clicked a link.<\/p>\n<p>It was possible to do this using separate <code>loading.tsx<\/code> files for each route, but it was far too easy to forget one and end up with a slow navigation.<\/p>\n<p>We&#8217;ve fixed this by letting components that render dynamic UI either define inline loading states with Suspense, or mark part of their UI as prerenderable with <code>'use cache'<\/code>.<\/p>\n<p>In either case, Next.js can extract this UI and load it into the client prior to a navigation, making your app feel as snappy as an SPA once users start clicking around it.<\/p>\n<p>To ensure you don&#8217;t miss a slow page, the Next.js DevTools now include <strong>Instant Insights<\/strong>, which surfaces any navigations you encounter that are not instant:<\/p>\n<figure class=\"my-8\">\n<figure><img loading=\"lazy\" alt=\"\" loading=\"lazy\" width=\"2160\" height=\"1680\" decoding=\"async\" data-nimg=\"1\" class=\"rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block\" style=\"color:transparent\" src=\"https:\/\/nextjs.org\/_next\/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3%2Finstant-dark-new.png&amp;w=3840&amp;q=75 1x\" bad-src=\"\/_next\/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3%2Finstant-dark-new.png&amp;w=3840&amp;q=75\"\/><\/figure><figcaption>\n<p>The new Instant Insights panel automatically surfaces slow navigations<\/p>\n<\/figcaption><\/figure>\n<p>Prefetching that UI ensures your server-rendered app always has <em>some<\/em> UI ready to show the moment a user clicks a link, similar to how you would model loading states in an SPA.<\/p>\n<p>Each insight also provides a prompt that teaches your agent how to apply your chosen fix.<\/p>\n<p>Learn more about <a href=\"http:\/\/nextjs.org\/docs\/app\/guides\/instant-navigation#validate-instant-navigation\">Instant Insights<\/a>.<\/p>\n<h3 id=\"partial-prefetching\" data-docs-heading=\"\">Partial Prefetching<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#partial-prefetching\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>Prior to 16.3, prefetching in Next.js was limiting: you could either define a reusable loading shell with <code>loading.tsx<\/code>, or opt-in to aggressive full-page prefetching with <code>&lt;Link prefetch={true}&gt;<\/code>. Many apps suffered from these implicit and restrictive APIs, and ended up with blocking navigations on link clicks as a result.<\/p>\n<p>To fix this, 16.3 adds a new prefetching behavior we call <strong>Partial Prefetching<\/strong>. Next.js can extract reusable loading shells from <em>any<\/em> route&#8217;s UI, and per-link prefetching via <code>&lt;Link prefetch={true}&gt;<\/code> can include as much <em>or as little<\/em> content from the target page as you like.<\/p>\n<p>Learn how you or your agent can <a href=\"https:\/\/nextjs.org\/docs\/app\/guides\/adopting-partial-prefetching\">adopt Partial Prefetching in your app<\/a>.<\/p>\n<h3 id=\"better-incremental-static-regeneration-isr\" data-docs-heading=\"\">Better Incremental Static Regeneration (ISR)<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#better-incremental-static-regeneration-isr\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>16.3 brings a new kind of Incremental Static Regeneration to dynamic, personalized apps. When you prerender only <em>some<\/em> of a route&#8217;s pages at build time with <code>generateStaticParams<\/code>, the rest of the page faced a tradeoff. They could show a loading shell but never get prerendered, or skip the shell and block the first visitor.<\/p>\n<p>Now you get both. A page you don&#8217;t prerender serves an instant loading shell on its first visit, then upgrades to the fully prerendered page in the background. Every later visitor gets the final content from the cache.<\/p>\n<p>We&#8217;re also exploring an API to control how often a page upgrades, for example based on traffic.<\/p>\n<p>Learn more about <a href=\"https:\/\/nextjs.org\/docs\/app\/guides\/incremental-static-regeneration-cache-components\">Incremental Static Regeneration with Cache Components<\/a>.<\/p>\n<h3 id=\"navigation-inspector\" data-docs-heading=\"\">Navigation Inspector<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#navigation-inspector\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>Because Next.js disables prefetching in development, it can be hard to understand exactly what a user will see during a particular navigation&#8217;s loading sequence.<\/p>\n<p>The new Navigation Inspector lets you pause page loads and client-side navigations at the shell, so you can see exactly what loading state the user would see:<\/p>\n<figure><img loading=\"lazy\" alt=\"\" loading=\"lazy\" width=\"2560\" height=\"2048\" decoding=\"async\" data-nimg=\"1\" class=\"rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden\" style=\"color:transparent\" src=\"https:\/\/nextjs.org\/_next\/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finspector-light.png&amp;w=3840&amp;q=75 1x\" bad-src=\"\/_next\/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finspector-light.png&amp;w=3840&amp;q=75\"\/><img loading=\"lazy\" alt=\"\" loading=\"lazy\" width=\"2560\" height=\"2048\" decoding=\"async\" data-nimg=\"1\" class=\"rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block\" style=\"color:transparent\" src=\"https:\/\/nextjs.org\/_next\/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finspector-dark.png&amp;w=3840&amp;q=75 1x\" bad-src=\"\/_next\/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finspector-dark.png&amp;w=3840&amp;q=75\"\/><\/figure>\n<p>See our documentation on <a href=\"http:\/\/nextjs.org\/docs\/app\/guides\/instant-navigation#visualize-loading-states-with-the-nextjs-devtools\">visualizing loading states with the Next.js DevTools<\/a>.<\/p>\n<h3 id=\"playwright-test-helper\" data-docs-heading=\"\">Playwright test helper<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#playwright-test-helper\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>Another common failure mode is a page that navigates instantly today becoming slow tomorrow. Maybe a component that reads <code>cookies()<\/code> gets added to a shared header and de-opts the route to request-time rendering, or a <code>&lt;Suspense&gt;<\/code> boundary moves during a refactor and part of the page starts blocking. Either way, UI that used to appear immediately no longer does.<\/p>\n<p>The new <code>instant()<\/code> test helper lets you write Playwright tests that assert exactly what content should be instantly visible during a navigation. The test fails whenever the instant UI changes, no matter the cause:<\/p>\n<div class=\"my-4 rounded-md group\/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] not-prose\" data-geist-code-block=\"\">\n<div class=\"py-0 pl-4 rounded-t-md h-12 flex items-center border-b border-[var(--ds-gray-400)] bg-[var(--ds-background-200)] pr-3\">\n<div class=\"gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]\"><span class=\"min-w-0 inline-block max-w-full truncate break-normal\">e2e\/instant-navigation.spec.ts<\/span><\/div>\n<\/div>\n<pre class=\"code-block-module__vF3MAa__pre\"><code class=\"font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]\" style=\"font-feature-settings:&quot;liga&quot; off\"><span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">import<\/span><span style=\"color:var(--shiki-color-text)\"> { expect<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><span style=\"color:var(--shiki-color-text)\"> test } <\/span><span style=\"color:var(--shiki-token-keyword)\">from<\/span><span style=\"color:var(--shiki-token-string-expression)\"> '@playwright\/test'<\/span><span style=\"color:var(--shiki-color-text)\">;<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">import<\/span><span style=\"color:var(--shiki-color-text)\"> { instant } <\/span><span style=\"color:var(--shiki-token-keyword)\">from<\/span><span style=\"color:var(--shiki-token-string-expression)\"> '@next\/playwright'<\/span><span style=\"color:var(--shiki-color-text)\">;<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-function)\">test<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-string-expression)\">'product title is available immediately'<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><span style=\"color:var(--shiki-token-keyword)\"> async<\/span><span style=\"color:var(--shiki-color-text)\"> ({ page }) <\/span><span style=\"color:var(--shiki-token-keyword)\">=&gt;<\/span><span style=\"color:var(--shiki-color-text)\"> {<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">  await<\/span><span style=\"color:var(--shiki-token-constant)\"> page<\/span><span style=\"color:var(--shiki-token-function)\">.goto<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-string-expression)\">'\/products\/shoes'<\/span><span style=\"color:var(--shiki-color-text)\">);<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"highlighted-line line\" data-line=\"\" data-highlighted-line=\"\"><span style=\"color:var(--shiki-token-comment)\">  \/\/ Assert what's visible without waiting for network<\/span><\/span>\n<span class=\"highlighted-line line\" data-line=\"\" data-highlighted-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">  await<\/span><span style=\"color:var(--shiki-token-function)\"> instant<\/span><span style=\"color:var(--shiki-color-text)\">(page<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><span style=\"color:var(--shiki-token-keyword)\"> async<\/span><span style=\"color:var(--shiki-color-text)\"> () <\/span><span style=\"color:var(--shiki-token-keyword)\">=&gt;<\/span><span style=\"color:var(--shiki-color-text)\"> {<\/span><\/span>\n<span class=\"highlighted-line line\" data-line=\"\" data-highlighted-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">    await<\/span><span style=\"color:var(--shiki-token-constant)\"> page<\/span><span style=\"color:var(--shiki-token-function)\">.click<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-string-expression)\">'a[href=\"\/products\/hats\"]'<\/span><span style=\"color:var(--shiki-color-text)\">);<\/span><\/span>\n<span class=\"highlighted-line line\" data-line=\"\" data-highlighted-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">    await<\/span><span style=\"color:var(--shiki-token-function)\"> expect<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-constant)\">page<\/span><span style=\"color:var(--shiki-token-function)\">.locator<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-string-expression)\">'h1'<\/span><span style=\"color:var(--shiki-color-text)\">))<\/span><span style=\"color:var(--shiki-token-function)\">.toContainText<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-string-expression)\">'Baseball Cap'<\/span><span style=\"color:var(--shiki-color-text)\">);<\/span><\/span>\n<span class=\"highlighted-line line\" data-line=\"\" data-highlighted-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">    await<\/span><span style=\"color:var(--shiki-token-function)\"> expect<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-constant)\">page<\/span><span style=\"color:var(--shiki-token-function)\">.getByText<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-string-expression)\">'Checking inventory...'<\/span><span style=\"color:var(--shiki-color-text)\">))<\/span><span style=\"color:var(--shiki-token-function)\">.toBeVisible<\/span><span style=\"color:var(--shiki-color-text)\">();<\/span><\/span>\n<span class=\"highlighted-line line\" data-line=\"\" data-highlighted-line=\"\"><span style=\"color:var(--shiki-color-text)\">  });<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">  await<\/span><span style=\"color:var(--shiki-token-function)\"> expect<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-constant)\">page<\/span><span style=\"color:var(--shiki-token-function)\">.getByText<\/span><span style=\"color:var(--shiki-color-text)\">(<\/span><span style=\"color:var(--shiki-token-string-expression)\">'12 in stock'<\/span><span style=\"color:var(--shiki-color-text)\">))<\/span><span style=\"color:var(--shiki-token-function)\">.toBeVisible<\/span><span style=\"color:var(--shiki-color-text)\">();<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">});<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>Learn more about <a href=\"http:\/\/nextjs.org\/docs\/app\/guides\/instant-navigation#prevent-regressions-with-e2e-tests\">writing tests with the <code>instant<\/code> test helper<\/a>.<\/p>\n<hr\/>\n<p>That&#8217;s everything that&#8217;s new with Instant Navigations! We&#8217;re excited for you to try out these new features and hear what you think.<\/p>\n<p>Lastly, there&#8217;s a few new experimental features shipping with 16.3.<\/p>\n<h2 id=\"experimental-features\" data-docs-heading=\"\">Experimental features<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#experimental-features\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h2>\n<p>Alongside the stable release, 16.3 ships a few experimental features you can opt into today behind configuration flags. They&#8217;re still evolving, so let us know how they&#8217;re working for you in the <a href=\"https:\/\/github.com\/vercel\/next.js\/discussions\/95130\" rel=\"noopener noreferrer\" target=\"_blank\">Next.js 16.3 feedback discussion<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>.<\/p>\n<h3 id=\"rust-based-react-compiler\" data-docs-heading=\"\">Rust-based React Compiler<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#rust-based-react-compiler\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>The React Compiler optimizes your components at build time so you don&#8217;t have to hand-tune memoization.<\/p>\n<p>Until now, enabling the React Compiler meant running it through Babel in Node.js. The experimental Rust port instead runs directly inside Turbopack, avoiding the extra work of generating and reparsing code.<\/p>\n<p>Enable the compiler and opt into the Rust version in your Next.js config:<\/p>\n<div class=\"my-4 rounded-md group\/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] not-prose\" data-geist-code-block=\"\">\n<pre class=\"code-block-module__vF3MAa__pre\"><code class=\"font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]\" style=\"font-feature-settings:&quot;liga&quot; off\"><span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">import<\/span><span style=\"color:var(--shiki-token-keyword)\"> type<\/span><span style=\"color:var(--shiki-color-text)\"> { NextConfig } <\/span><span style=\"color:var(--shiki-token-keyword)\">from<\/span><span style=\"color:var(--shiki-token-string-expression)\"> 'next'<\/span><span style=\"color:var(--shiki-color-text)\">;<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">const<\/span><span style=\"color:var(--shiki-token-constant)\"> nextConfig<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-token-function)\"> NextConfig<\/span><span style=\"color:var(--shiki-token-keyword)\"> =<\/span><span style=\"color:var(--shiki-color-text)\"> {<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">  reactCompiler<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-token-constant)\"> true<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">  experimental<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-color-text)\"> {<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">    turbopackRustReactCompiler<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-token-constant)\"> true<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">  }<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">};<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">export<\/span><span style=\"color:var(--shiki-token-keyword)\"> default<\/span><span style=\"color:var(--shiki-color-text)\"> nextConfig;<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>In tests against large apps like <a href=\"https:\/\/v0.app\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">v0<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, the Rust path cut the time from <code>next dev<\/code> to a ready page by 34% on a cold build and 46% on a warm one. These gains assume you&#8217;ve moved off Babel entirely. If you still run Babel for other transforms, the Rust compiler helps, but the gain is smaller.<\/p>\n<figure class=\"not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]\" aria-label=\"Time from next dev to a ready page on v0, Babel versus Rust React Compiler\">\n<p><span class=\"text-sm font-medium text-[var(--ds-gray-1000)]\">Time from `next dev` to a ready page on v0<\/span><\/p>\n<\/figure>\n<p>Learn more about <a href=\"https:\/\/nextjs.org\/docs\/app\/api-reference\/config\/next-config-js\/turbopackRustReactCompiler\">the Rust React Compiler<\/a>.<\/p>\n<h3 id=\"network-resilience\" data-docs-heading=\"\">Network resilience<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#network-resilience\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h3>\n<p>When the network drops, a soft navigation, data fetch, or Server Action normally throws. With <code>experimental.useOffline<\/code> enabled, Next.js keeps it pending instead and retries once the connection returns. Enable the flag in your Next.js config:<\/p>\n<div class=\"my-4 rounded-md group\/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] not-prose\" data-geist-code-block=\"\">\n<pre class=\"code-block-module__vF3MAa__pre\"><code class=\"font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]\" style=\"font-feature-settings:&quot;liga&quot; off\"><span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">import<\/span><span style=\"color:var(--shiki-token-keyword)\"> type<\/span><span style=\"color:var(--shiki-color-text)\"> { NextConfig } <\/span><span style=\"color:var(--shiki-token-keyword)\">from<\/span><span style=\"color:var(--shiki-token-string-expression)\"> 'next'<\/span><span style=\"color:var(--shiki-color-text)\">;<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">const<\/span><span style=\"color:var(--shiki-token-constant)\"> nextConfig<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-token-function)\"> NextConfig<\/span><span style=\"color:var(--shiki-token-keyword)\"> =<\/span><span style=\"color:var(--shiki-color-text)\"> {<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">  experimental<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-color-text)\"> {<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">    useOffline<\/span><span style=\"color:var(--shiki-token-keyword)\">:<\/span><span style=\"color:var(--shiki-token-constant)\"> true<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">  }<\/span><span style=\"color:var(--shiki-token-punctuation)\">,<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">};<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">export<\/span><span style=\"color:var(--shiki-token-keyword)\"> default<\/span><span style=\"color:var(--shiki-color-text)\"> nextConfig;<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>Because <a href=\"#partial-prefetching\">Partial Prefetching<\/a> already caches a route&#8217;s shell on the client, a prefetched route still renders that shell when you navigate to it offline, and its data streams in once you reconnect.<\/p>\n<p>A new <code>useOffline<\/code> hook reports when the app is offline, so you can show the user what&#8217;s happening:<\/p>\n<div class=\"my-4 rounded-md group\/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] not-prose\" data-geist-code-block=\"\">\n<pre class=\"code-block-module__vF3MAa__pre\"><code class=\"font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]\" style=\"font-feature-settings:&quot;liga&quot; off\"><span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-string-expression)\">'use client'<\/span><span style=\"color:var(--shiki-color-text)\">;<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">import<\/span><span style=\"color:var(--shiki-color-text)\"> { useOffline } <\/span><span style=\"color:var(--shiki-token-keyword)\">from<\/span><span style=\"color:var(--shiki-token-string-expression)\"> 'next\/offline'<\/span><span style=\"color:var(--shiki-color-text)\">;<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">export<\/span><span style=\"color:var(--shiki-token-keyword)\"> function<\/span><span style=\"color:var(--shiki-token-function)\"> OfflineBanner<\/span><span style=\"color:var(--shiki-color-text)\">() {<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">  const<\/span><span style=\"color:var(--shiki-token-constant)\"> isOffline<\/span><span style=\"color:var(--shiki-token-keyword)\"> =<\/span><span style=\"color:var(--shiki-token-function)\"> useOffline<\/span><span style=\"color:var(--shiki-color-text)\">();<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">  if<\/span><span style=\"color:var(--shiki-color-text)\"> (<\/span><span style=\"color:var(--shiki-token-keyword)\">!<\/span><span style=\"color:var(--shiki-color-text)\">isOffline) <\/span><span style=\"color:var(--shiki-token-keyword)\">return<\/span><span style=\"color:var(--shiki-token-constant)\"> null<\/span><span style=\"color:var(--shiki-color-text)\">;<\/span><\/span>\n<span class=\"line\" data-line=\"\"> <\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-token-keyword)\">  return<\/span><span style=\"color:var(--shiki-color-text)\"> &lt;<\/span><span style=\"color:var(--shiki-token-string-expression)\">div<\/span><span style=\"color:var(--shiki-color-text)\">&gt;You're offline. Retrying when you reconnect.&lt;\/<\/span><span style=\"color:var(--shiki-token-string-expression)\">div<\/span><span style=\"color:var(--shiki-color-text)\">&gt;;<\/span><\/span>\n<span class=\"line\" data-line=\"\"><span style=\"color:var(--shiki-color-text)\">}<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>Read our guide on <a href=\"https:\/\/nextjs.org\/docs\/app\/guides\/offline-support\">handling connectivity drops<\/a>.<\/p>\n<h2 id=\"feedback-and-community\" data-docs-heading=\"\">Feedback and Community<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#feedback-and-community\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h2>\n<p>We hope you&#8217;re excited to try out Next.js 16.3!<\/p>\n<p>Upgrade today:<\/p>\n<p>And share your feedback to help shape the future of Next.js:<\/p>\n<h2 id=\"contributors\" data-docs-heading=\"\">Contributors<a aria-label=\"Link to this section\" data-heading-link=\"\" href=\"#contributors\"><span><svg viewbox=\"0 0 16 16\" height=\"0.7em\" width=\"0.7em\"><g stroke-width=\"1.2\" fill=\"none\" stroke=\"currentColor\"><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"\/><path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"\/><\/g><\/svg><\/span><\/a><\/h2>\n<p>Next.js is the result of the combined work of thousands of individual developers. This release was brought to you by:<\/p>\n<ul>\n<li>The <strong>Next.js<\/strong> team: <a href=\"https:\/\/github.com\/acdlite\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Andrew<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/aurorascharff\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Aurora<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/gaearon\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Dan<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/unstubbable\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Hendrik<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/lubieowoce\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Janka<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/devjiwonchoi\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Jiwon<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/icyJoseph\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Joseph<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/gnoff\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Josh<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/gaojude\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Jude<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/petehunt\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Pete<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/samselikoff\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Sam<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/eps1lon\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Sebbie<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/timneutkens\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Tim<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, and <a href=\"https:\/\/github.com\/ztanner\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Zack<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>.<\/li>\n<li>The <strong>Turbopack<\/strong> team: <a href=\"https:\/\/github.com\/andrewimm\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Andrew<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/bgw\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Benjamin<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/jimmyhmiller\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Jimmy<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/lukesandberg\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Luke<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/mischnic\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Niklas<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, <a href=\"https:\/\/github.com\/sokra\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Tobias<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>, and <a href=\"https:\/\/github.com\/wbinnssmith\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Will<span class=\"inline-flex not-prose\"><svg viewbox=\"0 0 16 16\" height=\"16\" width=\"16\" data-slot=\"geist-icon\" style=\"color:currentColor\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z\" clip-rule=\"evenodd\"\/><\/svg><\/span><\/a>.<\/li>\n<\/ul>\n<p>Huge thanks to @denesbeck, @ztanner, @ijjk, @lllomh, @devjiwonchoi, @lukesandberg, @wbinnssmith, @sokra, @unstubbable, @timneutkens, @feedthejim, @gnoff, @abhishekmardiya, @icyJoseph, @mischnic, @mmastrac, @acdlite, @eps1lon, @JamBalaya56562, @bgw, @gaojude, @bgub, @remcohaszing, @aurorascharff, @VedantMadane, @fireairforce, @dagecko, @ctate, @banchichen, @andrewimm, @wwenrr, @TooTallNate, @hamidrezahanafi, @hamedniroomand, @sleitor, @Badbird5907, @MukundaKatta, @styfle, @SukkaW, @awo00, @christopherkindl, @GuinsooRocky, @maximecolin, @lubieowoce, @zana-abdi2002, @samselikoff, @rishishanbhag, @armando-andre, @tim123abc, @publictheta, @unclebay143, @yavorpunchev, @kakadiadarpan, @SyMind, @igorbabko, @sampoder, @StanislavKozachenko, @kristiyan-velkov, @huozhi, @RazinShafayet2007, @SJvaca30, @danyalahmed1995, @karlhorky, @MikhailStn, @ifer47, @niketchandivade, @gilest, @jahanzaib-iqbal-dev, @owenpearson, @davidgg, @fhfournier, @parkhojeong, @gaearon, @TariqulislamTuhin, @thsid, @jimmyhmiller, @Partha-Shankar, @M4cM4rco, @chippleh1392, @Pranav18M, @marcoshernanz, @manoraj, @ankurdotio, @WildChargerTV, @ZaforAbdullah, @wasim-builds, @petehunt, @DavidIlie, and @adhamfayrouzamf for helping!<\/p>\n<\/div>\n<p><a href=\"https:\/\/nextjs.org\/blog\/next-16-3?utm_source=tldrdev\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Last month we published a preview release of 16.3 that let you try out SPA-like navigations, better AI tooling, and a much less memory-hungry dev server. Today, we&#8217;re excited to announce that Next.js 16.3 is here! This release is packed with improvements for all existing Next.js apps: It also includes Instant Navigations, an opt-in suite [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":23022,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[143],"tags":[],"class_list":["post-23021","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai"],"_links":{"self":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/comments?post=23021"}],"version-history":[{"count":0,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/posts\/23021\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media\/23022"}],"wp:attachment":[{"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/media?parent=23021"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/categories?post=23021"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/scannn.com\/lv\/wp-json\/wp\/v2\/tags?post=23021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}