<?xml version="1.0" encoding="UTF-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Next.js Blog</title><link>https://nextjs.org/blog</link><atom:link href="http://rss.144-124-237-35.sslip.io/nextjs/blog" rel="self" type="application/rss+xml"></atom:link><description>Next.js Blog - Powered by AtomRSS</description><generator>AtomRSS</generator><webMaster>contact@atomgroup.dev (AtomRSS)</webMaster><language>en-US</language><lastBuildDate>Sat, 08 Aug 2026 03:40:35 GMT</lastBuildDate><ttl>5</ttl><item><title>Making Navigations Instant in v0</title><description>&lt;p&gt;Last month we shared a &lt;a href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations&quot;&gt;preview&lt;/a&gt; of some new tools in Next.js 16.3 that bring instant page navigations to apps built with React Server Components.&lt;/p&gt;
&lt;p&gt;We&#39;ve been adopting these tools in &lt;a href=&quot;https://v0.app/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;v0&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, Vercel&#39;s full-stack coding platform, and we shared this graph showing how much faster navigations got in production:&lt;/p&gt;
&lt;figure class=&quot;my-8&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1868&quot; height=&quot;712&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fmaking-v0-navigations-instant%2Fhero-graph-light.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fmaking-v0-navigations-instant%2Fhero-graph-light.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fmaking-v0-navigations-instant%2Fhero-graph-light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1868&quot; height=&quot;712&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fmaking-v0-navigations-instant%2Fhero-graph-dark.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fmaking-v0-navigations-instant%2Fhero-graph-dark.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fmaking-v0-navigations-instant%2Fhero-graph-dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;figcaption&gt;Page navigation times for v0 in production&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Impressively, these results came from a coding agent using a &lt;a href=&quot;https://www.skills.sh/vercel/next.js/next-cache-components-optimizer&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;new Skill&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; to write failing tests, fix the slow navigations, and verify each route.&lt;/p&gt;
&lt;p&gt;We&#39;ll go over how those tests can assert against slow navigations and how the Skill works.&lt;/p&gt;
&lt;p&gt;But first, let&#39;s look at the approach Next.js 16.3 takes to making apps like v0 feel snappy, without needing to move any data-fetching or rendering code to the client.&lt;/p&gt;
&lt;h2 id=&quot;prerendering-for-dynamic-apps&quot; data-docs-heading=&quot;&quot;&gt;Prerendering for dynamic apps&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/making-v0-navigations-instant#prerendering-for-dynamic-apps&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Previously, Next.js offered two main tools to ensure your app would have instant navigations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Either you could &lt;a href=&quot;https://nextjs.org/docs/app/guides/public-static-pages&quot;&gt;statically prerender&lt;/a&gt; pages at build time (which is impractical for dynamic apps with personal data)&lt;/li&gt;
&lt;li&gt;Or you could mark links as fully prefetched (which can be expensive and strain your servers)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This left dynamic, personalized apps like v0 without a good strategy for achieving instant navigations.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3&quot;&gt;Next.js 16.3&lt;/a&gt; fixes this by letting you prerender dynamic content &lt;em&gt;while users browse your app&lt;/em&gt;, and caching that content entirely in the browser.&lt;/p&gt;
&lt;p&gt;Components that render dynamic, personalized UI can now either define a loading state with Suspense, or mark part of that UI as prerenderable with &lt;code&gt;&#39;use cache&#39;&lt;/code&gt;. In either case, Next.js can extract this UI and load it into the client before a navigation, without needing to fully render the target page or keep that UI static.&lt;/p&gt;
&lt;p&gt;This is the first time Next.js has given dynamic apps a way to take advantage of the technology behind Partial Prerendering. Here&#39;s what an engineer working on v0 had to say about it:&lt;/p&gt;
&lt;div class=&quot;not-prose relative my-8 overflow-hidden rounded-xl border border-gray-alpha-400 bg-background-100 shadow-[0_4px_20px_rgba(0,0,0,0.10)] dark-theme:shadow-none&quot;&gt;&lt;div class=&quot;flex items-center gap-1.5 border-b border-gray-alpha-400 bg-gray-100 px-4 py-2&quot;&gt;&lt;img alt=&quot;&quot; data-slot=&quot;geist-logo-icon&quot; aria-hidden=&quot;true&quot; loading=&quot;eager&quot; width=&quot;16&quot; height=&quot;16&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;geist-hide-on-dark h-4 w-4&quot; style=&quot;color:transparent&quot; src=&quot;https://nextjs.org/_next/static/immutable/media/logo-slack-color-light.0dx7eo_y9q60b.svg&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; data-slot=&quot;geist-logo-icon&quot; aria-hidden=&quot;true&quot; loading=&quot;eager&quot; width=&quot;16&quot; height=&quot;16&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;geist-hide-on-light h-4 w-4&quot; style=&quot;color:transparent&quot; src=&quot;https://nextjs.org/_next/static/immutable/media/logo-slack-color-dark.0dx7eo_y9q60b.svg&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;span class=&quot;text-xs font-semibold text-gray-900&quot;&gt;Slack&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex gap-3 px-4 py-3&quot;&gt;&lt;div class=&quot;flex h-10 w-10 shrink-0 select-none items-center justify-center rounded-lg bg-[#4a154b] text-base font-semibold text-white&quot;&gt;MS&lt;/div&gt;&lt;div class=&quot;min-w-0 flex-1&quot;&gt;&lt;div class=&quot;flex items-baseline gap-2&quot;&gt;&lt;span class=&quot;text-[15px] font-black text-gray-1000&quot;&gt;Martin Sione&lt;/span&gt;&lt;span class=&quot;text-xs text-gray-900&quot;&gt;8:32 PM&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-0.5 text-[15px] leading-[1.46] text-gray-1000 [&amp;amp;_p]:my-0&quot;&gt;&lt;p&gt;yeah&lt;!-- --&gt; &lt;img src=&quot;https://h8dxkfmaphn8o0p3.public.blob.vercel-storage.com/static/blog/making-v0-navigations-instant/tyy-emoji.png&quot; alt=&quot;thank you&quot; style=&quot;display:inline;height:1lh&quot; referrerpolicy=&quot;no-referrer&quot;&gt; &lt;!-- --&gt;so much &lt;span class=&quot;rounded-[3px] bg-amber-100 px-0.5 font-medium text-amber-900&quot;&gt;@jude.gao&lt;/span&gt; for leading this effort. for the blog/case study i think it&#39;d be nice to make it clear that instant != ppr and also that it&#39;s much more achievable. even myself working here thought achieving instant would be a much bigger effort than it ended up being partially because i was thinking we&#39;d have to make an effort comparable to doing [static] ppr&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So, dynamic apps can partially prerender pages &lt;em&gt;at runtime&lt;/em&gt;. And that&#39;s how they can achieve instant navigations, while still shipping minimal code to the browser.&lt;/p&gt;
&lt;p&gt;Now you might be thinking that the only way to verify a navigation is instant would be to refactor your code, run your app, and then click a link to see for yourself. But one of the most novel things about Next.js 16.3 is that it ships with a new primitive that lets you or an agent &lt;em&gt;know&lt;/em&gt; that you&#39;ve made a route instant.&lt;/p&gt;
&lt;p&gt;Thanks to this new primitive, agents are perfectly suited to achieve instant navigations in an existing app all on their own.&lt;/p&gt;
&lt;p&gt;And that&#39;s exactly how we made v0 instant.&lt;/p&gt;
&lt;h2 id=&quot;using-loops-to-make-v0-instant&quot; data-docs-heading=&quot;&quot;&gt;Using loops to make v0 instant&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/making-v0-navigations-instant#using-loops-to-make-v0-instant&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To bring these new capabilities to v0, we used an agent running in a loop. For each slow navigation, it wrote a failing test, applied a fix, re-ran the test, and tried again until it passed.&lt;/p&gt;
&lt;p&gt;For the loop to run on its own, it needed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A verifiable goal.&lt;/strong&gt; A failing test, which terminated the loop once it passed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guardrails.&lt;/strong&gt; A Skill with proven patterns that move the code closer to the goal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real feedback.&lt;/strong&gt; Production metrics that confirm a successful loop had the intended effect.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;   Define the goal, e.g. &quot;Make the navigation from &#39;/&#39; to &#39;/chats&#39; instant&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;              │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;              ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;   Write it as a test, and confirm it fails on the current app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;              │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;              ▼&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;   Apply a fix using patterns from the Skill ◀───┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;              │                                  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;              ▼                                  │  still not instant&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;   Rebuild and re-run the test               ────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;              │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;              ▼  instant&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;   Ship the test to CI to prevent regressions&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The hardest part of this loop is writing a failing test for something fuzzy like &quot;Make sure this navigation is instant&quot;.&lt;/p&gt;
&lt;p&gt;Fortunately, Next.js 16.3 had exactly what we needed.&lt;/p&gt;
&lt;h2 id=&quot;a-test-for-fast&quot; data-docs-heading=&quot;&quot;&gt;A test for &quot;fast&quot;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/making-v0-navigations-instant#a-test-for-fast&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js 16.3 includes an &lt;a href=&quot;https://nextjs.org/blog/next-16-3#playwright-test-helper&quot;&gt;&lt;code&gt;instant()&lt;/code&gt;&lt;/a&gt; test helper for Playwright.&lt;/p&gt;
&lt;p&gt;This helper lets you write tests that pause a navigation and assert which parts of the UI are instantly visible to the user, without any network request:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;e2e/navigation.spec.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { expect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; test } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;@playwright/test&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { instant } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;@next/playwright&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;navigating to the chats page is instant&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; ({ page }) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.goto&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;/&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; instant&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.getByRole&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;link&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { name&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;Chats&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; })&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.click&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; expect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.getByTestId&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;app-title&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.toBeVisible&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If the expected content was blocked by the network, the test would fail.&lt;/p&gt;
&lt;p&gt;With it, we were ready to kick off the loop.&lt;/p&gt;
&lt;h2 id=&quot;running-the-loop-on-v0&quot; data-docs-heading=&quot;&quot;&gt;Running the loop on v0&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/making-v0-navigations-instant#running-the-loop-on-v0&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We now had everything we needed to fix slow navigations in v0.&lt;/p&gt;
&lt;p&gt;Here&#39;s what our process looked like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gather the critical user journeys that are slow.&lt;/strong&gt; We knew some important navigations in v0 were slow (clicking New Chat from the homepage, navigating around settings, and viewing your profile), so we focused on these. Next.js 16.3 also includes a new &lt;a href=&quot;https://nextjs.org/blog/next-16-3#instant-insights&quot;&gt;Instant Insights&lt;/a&gt; feature, which automatically surfaces any non-instant routes during development.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Write the failing tests.&lt;/strong&gt; The agent wrote a failing test for each of our navigations using the &lt;code&gt;instant()&lt;/code&gt; helper. On its own, the agent with the Skill will do its best to capture which part of the UI should be instantly visible, but you can also steer it to include specific parts, for example the &quot;Chats&quot; label on v0&#39;s new chat page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Refactor until all the tests pass.&lt;/strong&gt; The agent used the patterns in the Skill to apply idiomatic changes to our Next.js code, and kept working until each test was passing. In some cases this involved larger refactors that touched multiple features, which is why using a loop is so powerful.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Commit the changes &lt;em&gt;and&lt;/em&gt; the tests.&lt;/strong&gt; The tests not only helped the agent fix the problematic routes during the loop; they also ensured that future changes would never make these navigations slow again. So, we kept them in the project to run alongside the rest of our test suite in CI.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But what did the changes look like?&lt;/p&gt;
&lt;p&gt;In many cases, unblocking a slow navigation just meant moving some dynamic data access below a Suspense boundary, and allowing the rest of the page&#39;s content to be included in the shell.&lt;/p&gt;
&lt;p&gt;Here&#39;s an example:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;app/settings/workspace/page.tsx&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-red-900)&quot;&gt;- export default async function WorkspacePage() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-red-900)&quot;&gt;-   const session = await getServerSession();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-red-900)&quot;&gt;-   const team = await fetchTeam(session);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-green-900)&quot;&gt;+ export default function WorkspacePage() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    return (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;SettingsPageLayout&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;        &amp;lt;SettingsHeader title=&quot;Workspace&quot; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-red-900)&quot;&gt;-       &amp;lt;TeamSettings team={team} /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-green-900)&quot;&gt;+       &amp;lt;Suspense fallback={&amp;lt;WorkspaceSkeleton /&amp;gt;}&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-green-900)&quot;&gt;+         &amp;lt;WorkspaceContent /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-green-900)&quot;&gt;+       &amp;lt;/Suspense&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;/SettingsPageLayout&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-green-900)&quot;&gt;+ async function WorkspaceContent() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-green-900)&quot;&gt;+   const session = await getServerSession();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-green-900)&quot;&gt;+   const team = await fetchTeam(session);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-green-900)&quot;&gt;+   return &amp;lt;TeamSettings team={team} /&amp;gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--ds-green-900)&quot;&gt;+ }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In other cases, there were larger refactorings that needed to happen, for example moving a blocking dependency out of the root layout and into the components that were using it.&lt;/p&gt;
&lt;p&gt;Regardless of the changes needed, the agent was able to apply modern Next.js best practices using the patterns included in the Skill.&lt;/p&gt;
&lt;h2 id=&quot;fast-forever&quot; data-docs-heading=&quot;&quot;&gt;Fast, forever&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/making-v0-navigations-instant#fast-forever&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;By the end, the logged-in and logged-out versions of the homepage, the chat detail page, and every subpage under settings went from blocking to instant, thanks to the agent&#39;s work.&lt;/p&gt;
&lt;p&gt;We ended up with 16 new tests that captured these results in our test suite. These tests &lt;strong&gt;guard against regressions&lt;/strong&gt; as the codebase continues to change, which is especially important as agents make changes that could undo these optimizations.&lt;/p&gt;
&lt;h2 id=&quot;try-it-yourself&quot; data-docs-heading=&quot;&quot;&gt;Try it yourself&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/making-v0-navigations-instant#try-it-yourself&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can start taking advantage of Instant Navigations in your own Next.js apps today.&lt;/p&gt;
&lt;p&gt;For existing Cache Components apps that have slow navigation sequences you want to polish, the &lt;a href=&quot;https://www.skills.sh/vercel/next.js/next-cache-components-optimizer&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;next-cache-components-optimizer&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; Skill has everything you need to run the same loop that we did on v0.&lt;/p&gt;
&lt;p&gt;Install it:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; skills&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; vercel/next.js&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; --skill&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next-cache-components-optimizer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;...then prompt your agent with a navigation you want to improve:&lt;/p&gt;
&lt;figure class=&quot;not-prose my-6 overflow-hidden rounded-md border border-gray-200 bg-background-100&quot;&gt;&lt;figcaption class=&quot;flex items-center justify-between gap-2 border-b border-gray-200 bg-background-200 px-4 py-2&quot;&gt;&lt;span class=&quot;text-sm text-gray-900&quot;&gt;Prompt&lt;/span&gt;&lt;button class=&quot;inline-flex items-center gap-1.5 rounded-full border border-gray-alpha-300 bg-background-100 px-2.5 py-[5px] text-[11px] font-medium leading-none text-gray-900 transition-[background,border-color,color] duration-150 hover:border-gray-alpha-500 hover:bg-background-200 hover:text-foreground&quot; value=&quot;Make the navigation from &#39;/&#39; to &#39;/chats&#39; instant using the next-cache-components-optimizer skill.&quot; type=&quot;button&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;12&quot; width=&quot;12&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M6.75 14a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m-7.5-3.25a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m7.5 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5M8.25.5C9.22.5 10 1.28 10 2.25V3H8.5v-.75A.25.25 0 0 0 8.25 2h-5.5a.25.25 0 0 0-.25.25v7.5c0 .14.11.25.25.25H4.5v1.5H2.75C1.78 11.5 1 10.72 1 9.75v-7.5C1 1.28 1.78.5 2.75.5zm-1.5 7.25a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m7.5 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5M6.75 4.5a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span&gt;Copy prompt&lt;/span&gt;&lt;/button&gt;&lt;/figcaption&gt;&lt;div class=&quot;relative&quot;&gt;&lt;pre class=&quot;whitespace-pre-wrap break-words px-4 py-4 font-mono text-sm leading-relaxed text-gray-1000 max-h-28 overflow-hidden&quot;&gt;Make the navigation from &#39;/&#39; to &#39;/chats&#39; instant using the next-cache-components-optimizer skill.&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;For apps that are not yet on Cache Components, the &lt;a href=&quot;https://www.skills.sh/vercel/next.js/next-cache-components-adoption&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;next-cache-components-adoption&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; Skill will guide your agent through the process of migrating an existing app.&lt;/p&gt;
&lt;p&gt;To see the docs for both skills, check out our guide on &lt;a href=&quot;https://nextjs.org/docs/app/guides/ai-agents&quot;&gt;using AI agents with Next.js&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;why-frameworks-matter-in-the-era-of-agents&quot; data-docs-heading=&quot;&quot;&gt;Why frameworks matter in the era of agents&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/making-v0-navigations-instant#why-frameworks-matter-in-the-era-of-agents&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Anyone who&#39;s been building with agents knows the importance of deterministic tests. The more your test suite captures about how you want your app to behave, the better your agents will be able to change and refactor it.&lt;/p&gt;
&lt;p&gt;But certain behaviors can be hard to test. Everyone knows the difference between an app that feels polished and snappy versus one that feels janky and unresponsive, but this difference can be hard to capture in a deterministic way.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;instant()&lt;/code&gt; test helper is a novel example of how these fuzzier aspects of a high-quality app can be turned into something deterministic. Since it&#39;s deeply integrated with the framework, the helper is able to verify things about your app&#39;s UX that a generic test helper never could.&lt;/p&gt;
&lt;p&gt;We think a verifier like this is one of the most useful things a framework can ship in the agent era, and we plan to continue adding more of them to Next.js.&lt;/p&gt;
&lt;p&gt;It&#39;s also evidence that even with agents authoring so much of our code, frameworks still matter. An agent can write any code it wants to, but a framework&#39;s job is to constrain it so it produces better UIs than it would on its own.&lt;/p&gt;
&lt;p&gt;That&#39;s the future we&#39;re building towards with Next.js.&lt;/p&gt;
&lt;h2 id=&quot;feedback-and-community&quot; data-docs-heading=&quot;&quot;&gt;Feedback and Community&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/making-v0-navigations-instant#feedback-and-community&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Try it on your own app, and let us know how it goes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/discord&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discord Community&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>https://nextjs.org/blog/making-v0-navigations-instant</link><guid isPermaLink="false">https://nextjs.org/blog/making-v0-navigations-instant</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js 16.3</title><description>&lt;p&gt;Last month we published a preview release of 16.3 that let you try out &lt;a href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations&quot;&gt;SPA-like navigations&lt;/a&gt;, better &lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements&quot;&gt;AI tooling&lt;/a&gt;, and a &lt;em&gt;much&lt;/em&gt; less memory-hungry &lt;a href=&quot;https://nextjs.org/blog/next-16-3-turbopack&quot;&gt;dev server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today, we&#39;re excited to announce that Next.js 16.3 is here!&lt;/p&gt;
&lt;p&gt;This release is packed with improvements for all existing Next.js apps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#less-memory-usage-in-dev&quot;&gt;&lt;strong&gt;Less memory usage in dev.&lt;/strong&gt;&lt;/a&gt; Long dev sessions now use up to 90% less RAM.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#faster-builds&quot;&gt;&lt;strong&gt;Faster builds.&lt;/strong&gt;&lt;/a&gt; Repeat builds can read unchanged artifacts from cache.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#faster-type-checking-with-typescript-7&quot;&gt;&lt;strong&gt;Faster type checking.&lt;/strong&gt;&lt;/a&gt; &lt;code&gt;next build&lt;/code&gt; can use TypeScript 7 for type checking.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#faster-server-side-rendering&quot;&gt;&lt;strong&gt;Faster server-side rendering.&lt;/strong&gt;&lt;/a&gt; Next.js now handles up to 22% more requests under load.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#versioned-docs-for-ai-agents&quot;&gt;&lt;strong&gt;Versioned docs for AI agents.&lt;/strong&gt;&lt;/a&gt; Coding agents read version-matched docs with no setup.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#fewer-prefetch-requests&quot;&gt;&lt;strong&gt;Fewer prefetch requests.&lt;/strong&gt;&lt;/a&gt; Links trigger fewer requests by bundling smaller payloads.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#better-caching-for-static-assets&quot;&gt;&lt;strong&gt;Better caching for static assets.&lt;/strong&gt;&lt;/a&gt; Immutable assets can optionally be reused across deploys.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#custom-error-boundaries&quot;&gt;&lt;strong&gt;Custom error boundaries.&lt;/strong&gt;&lt;/a&gt; Recover from server errors by re-fetching failed data.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#built-in-glob-imports&quot;&gt;&lt;strong&gt;Built-in glob imports.&lt;/strong&gt;&lt;/a&gt; Import multiple files with a new Turbopack API.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#root-params&quot;&gt;&lt;strong&gt;Root params.&lt;/strong&gt;&lt;/a&gt; Easily access root-level params like &lt;code&gt;[lang]&lt;/code&gt; from any Server Component.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also includes &lt;strong&gt;Instant Navigations&lt;/strong&gt;, 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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#instant-insights&quot;&gt;&lt;strong&gt;Instant Insights.&lt;/strong&gt;&lt;/a&gt; A new devtool that automatically surfaces slow navigations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#partial-prefetching&quot;&gt;&lt;strong&gt;Partial Prefetching.&lt;/strong&gt;&lt;/a&gt; Fine-grained control over how much content a link should prefetch.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#better-incremental-static-regeneration-isr&quot;&gt;&lt;strong&gt;Better Incremental Static Regeneration.&lt;/strong&gt;&lt;/a&gt; URLs omitted from build-time prerendering can now serve an instant loading shell to the first visitor.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#navigation-inspector&quot;&gt;&lt;strong&gt;Navigation Inspector.&lt;/strong&gt;&lt;/a&gt; A new devtool that lets you visually inspect a navigation&#39;s loading shell.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3#playwright-test-helper&quot;&gt;&lt;strong&gt;Playwright test helper.&lt;/strong&gt;&lt;/a&gt; Write regression tests that prevent refactors from making a navigation slow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The behaviors behind Instant Navigations will become the default in a future major version, as they&#39;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.&lt;/p&gt;
&lt;p&gt;16.3 also includes &lt;a href=&quot;https://nextjs.org/blog/next-16-3#experimental-features&quot;&gt;experimental features&lt;/a&gt; you can try today, such as the Rust-based React Compiler and network resilience.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This is our biggest update to the framework since Next.js 16.0 came out last November, and we can&#39;t wait for you to try it.&lt;/p&gt;
&lt;p&gt;Upgrade by installing the latest version of &lt;code&gt;next&lt;/code&gt; from npm:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;...and keep reading to learn about everything that&#39;s new!&lt;/p&gt;
&lt;h2 id=&quot;improvements-for-todays-apps&quot; data-docs-heading=&quot;&quot;&gt;Improvements for today&#39;s apps&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#improvements-for-todays-apps&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;We recommend all apps upgrade to 16.3 to start getting these benefits today.&lt;/p&gt;
&lt;h3 id=&quot;less-memory-usage-in-dev&quot; data-docs-heading=&quot;&quot;&gt;Less memory usage in dev&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#less-memory-usage-in-dev&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In 16.3, Turbopack uses &lt;strong&gt;up to 90% less memory&lt;/strong&gt; when running &lt;code&gt;next dev&lt;/code&gt;. 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.&lt;/p&gt;
&lt;p&gt;We&#39;ve been hearing &lt;a href=&quot;https://github.com/vercel/next.js/discussions/95130#discussioncomment-17439239&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;great reports&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; from early adopters, and we&#39;re excited to bring these performance improvements to all Next apps.&lt;/p&gt;
&lt;figure class=&quot;not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]&quot; aria-label=&quot;Memory usage comparison showing improvements after eviction is enabled&quot;&gt;&lt;div class=&quot;flex h-10 items-center rounded-t-md border-b border-[var(--ds-gray-400)] bg-[var(--ds-background-200)] py-0 pr-3 pl-4&quot;&gt;&lt;span class=&quot;text-sm font-medium text-[var(--ds-gray-1000)]&quot;&gt;Memory usage after compiling 50 routes&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-4 bg-[var(--ds-background-100)] p-4&quot;&gt;&lt;div&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;vercel.com (dashboard)&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~90% smaller&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;vercel.com dev server memory usage&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Before&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Without eviction: 21.5 gigabytes&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;21.5 GB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;21.5 GB&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;After&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;10&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;With eviction: 2 gigabytes&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:10%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;2 GB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;2 GB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;nextjs.org&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~82% smaller&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;nextjs.org dev server memory usage&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Before&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Without eviction: 4600 megabytes&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;4,600 MB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;4,600 MB&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;After&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;18&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;With eviction: 840 megabytes&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:18%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;840 MB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;840 MB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopackMemoryEviction&quot;&gt;Turbopack&#39;s new memory eviction features&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;faster-builds&quot; data-docs-heading=&quot;&quot;&gt;Faster builds&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#faster-builds&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The disk caching feature that&#39;s been speeding up dev since 16.1 now works with &lt;code&gt;next build&lt;/code&gt; and is enabled by default. We&#39;ve been dogfooding this in production at Vercel for months and are seeing some projects with &lt;strong&gt;5.5x faster builds&lt;/strong&gt; on CI.&lt;/p&gt;
&lt;figure class=&quot;not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]&quot; aria-label=&quot;Next.js build time comparison showing impact of file system cache&quot;&gt;&lt;div class=&quot;flex h-10 items-center rounded-t-md border-b border-[var(--ds-gray-400)] bg-[var(--ds-background-200)] py-0 pr-3 pl-4&quot;&gt;&lt;span class=&quot;text-sm font-medium text-[var(--ds-gray-1000)]&quot;&gt;Turbopack compile time for `next build`&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-4 bg-[var(--ds-background-100)] p-4&quot;&gt;&lt;div&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;nextjs.org&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~2.3× faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;nextjs.org Turbopack build time&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cold&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Without cache: 21 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;21s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;21s&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cached&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;44&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;With cache: 9.2 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:44%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;9.2s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;9.2s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;vercel.com/home&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~1.4× faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;vercel.com (logged out) Turbopack build time&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cold&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Without cache: 66 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;66s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;66s&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cached&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;70&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;With cache: 46 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:70%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;46s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;46s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;vercel.com/geist&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~5.5× faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;vercel.com/geist Turbopack build time&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cold&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Without cache: 30 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;30s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;30s&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cached&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;18&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;With cache: 5.5 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:18%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;5.5s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;5.5s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Learn more about setting up &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopackFileSystemCache&quot;&gt;Turbopack&#39;s new FileSystem Cache&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;faster-type-checking-with-typescript-7&quot; data-docs-heading=&quot;&quot;&gt;Faster type checking with TypeScript 7&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#faster-type-checking-with-typescript-7&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Typescript 7&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; was released last month, which is a 10x faster native port of TypeScript with much faster type checking.&lt;/p&gt;
&lt;p&gt;To start using TypeScript 7 for type checking during &lt;code&gt;next build&lt;/code&gt;, just bump your project&#39;s local dependency:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;pnpm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; -D&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; typescript@^7&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/useTypeScriptCli&quot;&gt;configuring TypeScript&#39;s CLI in Next.js&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;faster-server-side-rendering&quot; data-docs-heading=&quot;&quot;&gt;Faster server-side rendering&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#faster-server-side-rendering&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;In our benchmarks, apps handle up to &lt;strong&gt;22% more requests under load&lt;/strong&gt;, with no changes to application code.&lt;/p&gt;
&lt;figure class=&quot;not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]&quot; aria-label=&quot;Requests handled under load: web streams versus native Node.js streams&quot;&gt;&lt;div class=&quot;flex h-10 items-center rounded-t-md border-b border-[var(--ds-gray-400)] bg-[var(--ds-background-200)] py-0 pr-3 pl-4&quot;&gt;&lt;span class=&quot;text-sm font-medium text-[var(--ds-gray-1000)]&quot;&gt;Requests handled under load&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-4 bg-[var(--ds-background-100)] p-4&quot;&gt;&lt;div&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;App Router server-side rendering&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~22% more&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;Requests handled under load, web streams versus Node.js streams&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-24 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Web streams&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;82&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Web streams: baseline&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:82%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;baseline&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;baseline&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-24 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Node.js streams&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Node.js streams: 22 percent more requests&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;+22%&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;+22%&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://github.com/vercel/next.js/pull/94311&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;native Node.js streams PR&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for more details.&lt;/p&gt;
&lt;h3 id=&quot;versioned-docs-for-ai-agents&quot; data-docs-heading=&quot;&quot;&gt;Versioned docs for AI agents&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#versioned-docs-for-ai-agents&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;AI coding agents now automatically read documentation that matches your project&#39;s version of Next.js.&lt;/p&gt;
&lt;p&gt;Running &lt;code&gt;next dev&lt;/code&gt; writes and maintains a version-matched &lt;code&gt;AGENTS.md&lt;/code&gt; block that points directly to the bundled docs in your project&#39;s local node modules. With that knowledge now reaching agents directly, we&#39;re retiring &lt;a href=&quot;https://github.com/vercel-labs/next-skills&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;our earlier Skills&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; that existed solely to bring current documentation to your apps.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/guides/ai-agents&quot;&gt;setting up Next.js for AI coding agents&lt;/a&gt;.&lt;/p&gt;
&lt;!-- --&gt;
&lt;!-- --&gt;
&lt;h3 id=&quot;fewer-prefetch-requests&quot; data-docs-heading=&quot;&quot;&gt;Fewer prefetch requests&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#fewer-prefetch-requests&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In 16.3, prefetches below a certain payload size are automatically bundled together to reduce the overall amount of prefetch requests your app makes.&lt;/p&gt;
&lt;p&gt;Prefetches for larger shared segments still remain separate, so they can be reused across multiple routes.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/prefetchInlining&quot;&gt;prefetch inlining&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;better-caching-for-static-assets&quot; data-docs-heading=&quot;&quot;&gt;Better caching for static assets&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#better-caching-for-static-assets&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Immutable static assets can now be reused across deployments. Since they&#39;re immutable, they cannot suffer from issues related to skew.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/adapters/immutable-static-assets&quot;&gt;immutable static assets&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;custom-error-boundaries&quot; data-docs-heading=&quot;&quot;&gt;Custom error boundaries&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#custom-error-boundaries&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Previously, React error boundaries in Next.js interfered with application code that called &lt;code&gt;notFound&lt;/code&gt; or &lt;code&gt;redirect&lt;/code&gt;. They also could only reset client-side state, and gave you no way to retry Server Components that failed during rendering.&lt;/p&gt;
&lt;p&gt;In Next.js 16.3, you can use &lt;code&gt;catchError&lt;/code&gt; to define a custom error boundary that doesn&#39;t interfere with &lt;code&gt;notFound&lt;/code&gt; or &lt;code&gt;redirect&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;app/my-error-boundary.tsx&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;use client&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { catchError&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; ErrorInfo } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/error&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; ErrorFallback&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { title&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { error&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; retry }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; ErrorInfo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.title}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.message}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; onClick&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;{() &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; retry&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;()}&amp;gt;Try again&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; catchError&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(ErrorFallback);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The boundary also receive a &lt;code&gt;retry()&lt;/code&gt; function that you can call to refetch the boundary&#39;s children, which can include rerendering any Server Components.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/getting-started/error-handling#nested-error-boundaries&quot;&gt;custom error boundaries&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;built-in-glob-imports&quot; data-docs-heading=&quot;&quot;&gt;Built-in glob imports&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#built-in-glob-imports&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Turbopack now supports loading multiple modules from the file system using the Vite-compatible &lt;code&gt;import.meta.glob&lt;/code&gt; API, which brings hot-module reloading and other benefits to Server Components that read from local files:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;app/blog/page.tsx&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; matter &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;gray-matter&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; Page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // .md needs a loader registered in next.config.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; posts&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.glob&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;./posts/*.md&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { eager&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Object&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.entries&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(posts)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.map&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(([path&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; mod]) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; matter&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;mod&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.default);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; key&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;{path}&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.title}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      })}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/turbopack#importmetaglob&quot;&gt;glob imports&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;root-params&quot; data-docs-heading=&quot;&quot;&gt;Root params&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#root-params&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Previously, the only way to access a dynamic route&#39;s params was to pass them down as props from the route&#39;s page.&lt;/p&gt;
&lt;p&gt;This led to excessive prop-drilling for params defined above the root layout, which are effectively global and therefore likely to be used throughout your component tree.&lt;/p&gt;
&lt;p&gt;Next.js 16.3 introduces a new feature for easily accessing these &lt;em&gt;root params&lt;/em&gt; from any Server Component, without the need for passing props:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;app/[lang]/posts/[slug]/page.tsx&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { lang } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/root-params&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; PostPage&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; PageProps&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;/[lang]/posts/[slug]&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;slug&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.params;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; language&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; lang&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;article&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;Language: {language}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;Post: {slug}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;article&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This makes it much more ergonomic for things like internationalization, where many shared utilities and deeply nested components need access to the current language. Additionally, root params also work inside of &lt;code&gt;use cache&lt;/code&gt; scopes.&lt;/p&gt;
&lt;p&gt;They&#39;re currently supported in Server Components, and we&#39;re planning on adding support for route handlers and Server Actions in a future release.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/functions/next-root-params&quot;&gt;root params&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;So that&#39;s what&#39;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&#39;re excited to dig into those next.&lt;/p&gt;
&lt;h2 id=&quot;instant-navigations&quot; data-docs-heading=&quot;&quot;&gt;Instant Navigations&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#instant-navigations&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Over the past year, we&#39;ve been working on fixing the most frustrating things about building with Next.js.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Last November, we introduced a new caching primitive to the framework: the &lt;code&gt;&#39;use cache&#39;&lt;/code&gt; directive. It&#39;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.&lt;/p&gt;
&lt;p&gt;We&#39;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 &lt;code&gt;&#39;use cache&#39;&lt;/code&gt; now integrates with them in a way that lets you build apps that are static, dynamic, or &lt;em&gt;anywhere&lt;/em&gt; in between.&lt;/p&gt;
&lt;p&gt;For a deeper dive on these new behaviors, read &lt;a href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations&quot;&gt;last month&#39;s announcement of Instant Navigations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In 16.3, you can start using building with all these new features by enabling two flags:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { NextConfig } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; NextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  cacheComponents&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  partialPrefetching&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And if you have existing projects to upgrade, you or your agent can &lt;a href=&quot;https://nextjs.org/docs/app/guides/migrating-to-cache-components&quot;&gt;migrate an app to Cache Components&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here&#39;s a look at what&#39;s getting better in Next.js.&lt;/p&gt;
&lt;h3 id=&quot;instant-insights&quot; data-docs-heading=&quot;&quot;&gt;Instant Insights&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#instant-insights&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;While Server Components made Next.js apps faster at fetching data and rendering &lt;em&gt;complete&lt;/em&gt; pages, apps built with prior versions of Next.js often felt &lt;em&gt;less responsive&lt;/em&gt; 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.&lt;/p&gt;
&lt;p&gt;It was possible to do this using separate &lt;code&gt;loading.tsx&lt;/code&gt; files for each route, but it was far too easy to forget one and end up with a slow navigation.&lt;/p&gt;
&lt;p&gt;We&#39;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 &lt;code&gt;&#39;use cache&#39;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To ensure you don&#39;t miss a slow page, the Next.js DevTools now include &lt;strong&gt;Instant Insights&lt;/strong&gt;, which surfaces any navigations you encounter that are not instant:&lt;/p&gt;
&lt;figure class=&quot;my-8&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;1680&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3%2Finstant-light.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3%2Finstant-light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;1680&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3%2Finstant-dark-new.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;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;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;figcaption&gt;&lt;p&gt;The new Instant Insights panel automatically surfaces slow navigations&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Prefetching that UI ensures your server-rendered app always has &lt;em&gt;some&lt;/em&gt; UI ready to show the moment a user clicks a link, similar to how you would model loading states in an SPA.&lt;/p&gt;
&lt;p&gt;Each insight also provides a prompt that teaches your agent how to apply your chosen fix.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/guides/instant-navigation#validate-instant-navigation&quot;&gt;Instant Insights&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;partial-prefetching&quot; data-docs-heading=&quot;&quot;&gt;Partial Prefetching&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#partial-prefetching&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Prior to 16.3, prefetching in Next.js was limiting: you could either define a reusable loading shell with &lt;code&gt;loading.tsx&lt;/code&gt;, or opt-in to aggressive full-page prefetching with &lt;code&gt;&amp;lt;Link prefetch={true}&amp;gt;&lt;/code&gt;. Many apps suffered from these implicit and restrictive APIs, and ended up with blocking navigations on link clicks as a result.&lt;/p&gt;
&lt;p&gt;To fix this, 16.3 adds a new prefetching behavior we call &lt;strong&gt;Partial Prefetching&lt;/strong&gt;. Next.js can extract reusable loading shells from &lt;em&gt;any&lt;/em&gt; route&#39;s UI, and per-link prefetching via &lt;code&gt;&amp;lt;Link prefetch={true}&amp;gt;&lt;/code&gt; can include as much &lt;em&gt;or as little&lt;/em&gt; content from the target page as you like.&lt;/p&gt;
&lt;p&gt;Learn how you or your agent can &lt;a href=&quot;https://nextjs.org/docs/app/guides/adopting-partial-prefetching&quot;&gt;adopt Partial Prefetching in your app&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;better-incremental-static-regeneration-isr&quot; data-docs-heading=&quot;&quot;&gt;Better Incremental Static Regeneration (ISR)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#better-incremental-static-regeneration-isr&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;16.3 brings a new kind of Incremental Static Regeneration to dynamic, personalized apps. When you prerender only &lt;em&gt;some&lt;/em&gt; of a route&#39;s pages at build time with &lt;code&gt;generateStaticParams&lt;/code&gt;, 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.&lt;/p&gt;
&lt;p&gt;Now you get both. A page you don&#39;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.&lt;/p&gt;
&lt;p&gt;We&#39;re also exploring an API to control how often a page upgrades, for example based on traffic.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/guides/incremental-static-regeneration-cache-components&quot;&gt;Incremental Static Regeneration with Cache Components&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;navigation-inspector&quot; data-docs-heading=&quot;&quot;&gt;Navigation Inspector&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#navigation-inspector&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Because Next.js disables prefetching in development, it can be hard to understand exactly what a user will see during a particular navigation&#39;s loading sequence.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;2048&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsant-inspector-light.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsant-inspector-light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;2048&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsant-inspector-dark.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsant-inspector-dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;
&lt;p&gt;See our documentation on &lt;a href=&quot;https://nextjs.org/docs/app/guides/instant-navigation#visualize-loading-states-with-the-nextjs-devtools&quot;&gt;visualizing loading states with the Next.js DevTools&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;playwright-test-helper&quot; data-docs-heading=&quot;&quot;&gt;Playwright test helper&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#playwright-test-helper&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Another common failure mode is a page that navigates instantly today becoming slow tomorrow. Maybe a component that reads &lt;code&gt;cookies()&lt;/code&gt; gets added to a shared header and de-opts the route to request-time rendering, or a &lt;code&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt; boundary moves during a refactor and part of the page starts blocking. Either way, UI that used to appear immediately no longer does.&lt;/p&gt;
&lt;p&gt;The new &lt;code&gt;instant()&lt;/code&gt; 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:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;e2e/instant-navigation.spec.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { expect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; test } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;@playwright/test&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { instant } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;@next/playwright&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;product title is available immediately&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; ({ page }) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.goto&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;/products/shoes&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Assert what&#39;s visible without waiting for network&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; instant&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.click&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;a[href=&quot;/products/hats&quot;]&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; expect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.locator&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;h1&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.toContainText&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;Baseball Cap&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; expect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.getByText&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;Checking inventory...&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.toBeVisible&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; expect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.getByText&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;12 in stock&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.toBeVisible&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/guides/instant-navigation#prevent-regressions-with-e2e-tests&quot;&gt;writing tests with the &lt;code&gt;instant&lt;/code&gt; test helper&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That&#39;s everything that&#39;s new with Instant Navigations! We&#39;re excited for you to try out these new features and hear what you think.&lt;/p&gt;
&lt;p&gt;Lastly, there&#39;s a few new experimental features shipping with 16.3.&lt;/p&gt;
&lt;h2 id=&quot;experimental-features&quot; data-docs-heading=&quot;&quot;&gt;Experimental features&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#experimental-features&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Alongside the stable release, 16.3 ships a few experimental features you can opt into today behind configuration flags. They&#39;re still evolving, so let us know how they&#39;re working for you in the &lt;a href=&quot;https://github.com/vercel/next.js/discussions/95130&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Next.js 16.3 feedback discussion&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;rust-based-react-compiler&quot; data-docs-heading=&quot;&quot;&gt;Rust-based React Compiler&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#rust-based-react-compiler&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The React Compiler optimizes your components at build time so you don&#39;t have to hand-tune memoization.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Enable the compiler and opt into the Rust version in your Next.js config:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { NextConfig } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; NextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  reactCompiler&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    turbopackRustReactCompiler&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In tests against large apps like &lt;a href=&quot;https://v0.app/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;v0&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, the Rust path cut the time from &lt;code&gt;next dev&lt;/code&gt; to a ready page by 34% on a cold build and 46% on a warm one. These gains assume you&#39;ve moved off Babel entirely. If you still run Babel for other transforms, the Rust compiler helps, but the gain is smaller.&lt;/p&gt;
&lt;figure class=&quot;not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]&quot; aria-label=&quot;Time from next dev to a ready page on v0, Babel versus Rust React Compiler&quot;&gt;&lt;div class=&quot;flex h-10 items-center rounded-t-md border-b border-[var(--ds-gray-400)] bg-[var(--ds-background-200)] py-0 pr-3 pl-4&quot;&gt;&lt;span class=&quot;text-sm font-medium text-[var(--ds-gray-1000)]&quot;&gt;Time from `next dev` to a ready page on v0&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-4 bg-[var(--ds-background-100)] p-4&quot;&gt;&lt;div&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;Cold build&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~34% faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;cold build, time to a ready page&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Babel&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Babel: baseline&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;baseline&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;baseline&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Rust&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;66&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Rust: 34 percent faster&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:66%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;-34%&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;-34%&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;Warm build&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~46% faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;warm build, time to a ready page&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Babel&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Babel: baseline&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;baseline&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;baseline&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Rust&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;54&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Rust: 46 percent faster&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:54%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;-46%&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;-46%&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopackRustReactCompiler&quot;&gt;the Rust React Compiler&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;network-resilience&quot; data-docs-heading=&quot;&quot;&gt;Network resilience&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#network-resilience&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When the network drops, a soft navigation, data fetch, or Server Action normally throws. With &lt;code&gt;experimental.useOffline&lt;/code&gt; enabled, Next.js keeps it pending instead and retries once the connection returns. Enable the flag in your Next.js config:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { NextConfig } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; NextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    useOffline&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Because &lt;a href=&quot;https://nextjs.org/blog/next-16-3#partial-prefetching&quot;&gt;Partial Prefetching&lt;/a&gt; already caches a route&#39;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.&lt;/p&gt;
&lt;p&gt;A new &lt;code&gt;useOffline&lt;/code&gt; hook reports when the app is offline, so you can show the user what&#39;s happening:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;app/offline-banner.tsx&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;use client&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { useOffline } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/offline&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; OfflineBanner&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; isOffline&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; useOffline&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;isOffline) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;You&#39;re offline. Retrying when you reconnect.&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Read our guide on &lt;a href=&quot;https://nextjs.org/docs/app/guides/offline-support&quot;&gt;handling connectivity drops&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;feedback-and-community&quot; data-docs-heading=&quot;&quot;&gt;Feedback and Community&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#feedback-and-community&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We hope you&#39;re excited to try out Next.js 16.3!&lt;/p&gt;
&lt;p&gt;Upgrade today:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And share your feedback to help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/discord&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discord Community&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;contributors&quot; data-docs-heading=&quot;&quot;&gt;Contributors&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3#contributors&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js is the result of the combined work of thousands of individual developers. This release was brought to you by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Next.js&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/acdlite&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Andrew&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/aurorascharff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Aurora&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gaearon&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Dan&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/unstubbable&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Hendrik&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lubieowoce&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Janka&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/devjiwonchoi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiwon&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/icyJoseph&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Joseph&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gnoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Josh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gaojude&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jude&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/petehunt&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Pete&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/samselikoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sam&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/eps1lon&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebbie&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/timneutkens&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tim&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/ztanner&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Zack&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Turbopack&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/andrewimm&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Andrew&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/bgw&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Benjamin&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/jimmyhmiller&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jimmy&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lukesandberg&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Luke&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/mischnic&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Niklas&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/sokra&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tobias&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/wbinnssmith&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Will&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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!&lt;/p&gt;</description><link>https://nextjs.org/blog/next-16-3</link><guid isPermaLink="false">https://nextjs.org/blog/next-16-3</guid><pubDate>Invalid Date</pubDate></item><item><title>Security</title><description>&lt;p&gt;The first monthly security releases are now available.
Upgrade to 16.2.11 (Active LTS) or 15.5.21 (Maintenance LTS) now to address 4 HIGH and 5 MEDIUM severity vulnerabilities.&lt;/p&gt;</description><link>https://nextjs.org/blog/tag/security</link><guid isPermaLink="false">https://nextjs.org/blog/tag/security</guid><pubDate>Invalid Date</pubDate></item><item><title>Security</title><description>&lt;p&gt;The first monthly security releases are now available.
Upgrade to 16.2.11 (Active LTS) or 15.5.21 (Maintenance LTS) now to address 4 HIGH and 5 MEDIUM severity vulnerabilities.&lt;/p&gt;</description><link>https://nextjs.org/blog/tag/security</link><guid isPermaLink="false">https://nextjs.org/blog/tag/security</guid><pubDate>Invalid Date</pubDate></item><item><title>Turbopack: What&#39;s New in Next.js 16.3</title><description>&lt;aside class=&quot;not-prose mb-8 rounded-md border border-gray-alpha-400 p-6&quot;&gt;&lt;div class=&quot;flex items-center gap-3 font-medium text-gray-1000&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;size-2.5 shrink-0 rounded-full bg-blue-700&quot;&gt;&lt;/span&gt;&lt;span&gt;Next.js 16.3 is out!&lt;/span&gt;&lt;/div&gt;&lt;p class=&quot;mt-1.5 text-gray-900&quot;&gt;This post covers the preview, which has since shipped as stable. Install it with&lt;!-- --&gt; &lt;code class=&quot;rounded-md border border-gray-alpha-400 bg-gray-100 px-2 py-0.5 font-mono text-[0.95em]&quot;&gt;npm install next@latest&lt;/code&gt; &lt;!-- --&gt;and see the&lt;!-- --&gt; &lt;a class=&quot;underline!&quot; href=&quot;https://nextjs.org/blog/next-16-3&quot;&gt;release post&lt;/a&gt; &lt;!-- --&gt;for everything that&#39;s new.&lt;/p&gt;&lt;/aside&gt;
&lt;p&gt;As the Next.js 16.3 Preview nears a stable release, we&#39;re sharing a series of posts about what&#39;s inside. Our previous posts cover new &lt;a href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations&quot;&gt;Instant Navigation&lt;/a&gt; features and the latest &lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements&quot;&gt;AI improvements&lt;/a&gt;. This third post details the latest improvements to the Turbopack bundler within Next.js.&lt;/p&gt;
&lt;p&gt;With &lt;a href=&quot;https://nextjs.org/blog/next-16-3&quot;&gt;Next.js 16.3&lt;/a&gt;, Turbopack&#39;s latest stable release focuses on compiler performance. Many of the newest features are centered around reducing CPU and Memory usage, speeding up build times, and improving runtime experience.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reducing dev server memory usage by up to 90%&lt;/li&gt;
&lt;li&gt;Persistent file system cache for faster builds&lt;/li&gt;
&lt;li&gt;Experimental Rust React Compiler support&lt;/li&gt;
&lt;li&gt;&lt;code&gt;import.meta.glob&lt;/code&gt; API support&lt;/li&gt;
&lt;li&gt;Faster HMR and dev startup&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;reducing-memory-usage-in-dev-mode&quot; data-docs-heading=&quot;&quot;&gt;Reducing memory usage in dev mode&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-turbopack#reducing-memory-usage-in-dev-mode&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Turbopack&#39;s core design is focused on incremental compilation. By caching the work it previously did, it avoids recompiling files that haven&#39;t changed. When developing large Next.js applications, this means compile time is proportional to the size of your changes, not the size of your route.&lt;/p&gt;
&lt;p&gt;In pursuing this design, we made a very deliberate trade-off: caching more results in memory, for reduced CPU usage. Since Turbopack first launched, though, memory usage has been at a premium. Coding agents, IDEs, typecheckers, and linters all run at dev time, and each consumes a significant chunk of system memory. Over the last three months, the Turbopack team has been committed to reducing its contribution to system memory pressure. &lt;strong&gt;With an upgrade to 16.3, developers should immediately see less memory usage for long-running dev sessions.&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]&quot; aria-label=&quot;Memory usage comparison showing improvements after eviction is enabled&quot;&gt;&lt;div class=&quot;flex h-10 items-center rounded-t-md border-b border-[var(--ds-gray-400)] bg-[var(--ds-background-200)] py-0 pr-3 pl-4&quot;&gt;&lt;span class=&quot;text-sm font-medium text-[var(--ds-gray-1000)]&quot;&gt;Memory usage after compiling 50 routes&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-4 bg-[var(--ds-background-100)] p-4&quot;&gt;&lt;div&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;vercel.com (dashboard)&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~90% smaller&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;vercel.com dev server memory usage&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Before&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Without eviction: 21.5 gigabytes&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;21.5 GB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;21.5 GB&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;After&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;10&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;With eviction: 2 gigabytes&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:10%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;2 GB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;2 GB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;nextjs.org&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~82% smaller&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;nextjs.org dev server memory usage&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Before&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Without eviction: 4600 megabytes&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;4,600 MB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;4,600 MB&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;After&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;18&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;With eviction: 840 megabytes&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:18%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;840 MB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;840 MB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Much of this was achieved through small incremental wins: compressing data structures and avoiding storing data longer than was necessary. The biggest win, though, comes from a new ability to evict much of the in-memory cache. Leveraging the file-system persistence feature that was &lt;a href=&quot;https://nextjs.org/blog/next-16-1#turbopack-file-system-caching-for-next-dev&quot;&gt;first introduced in Next.js 16.1&lt;/a&gt;, Turbopack is able to remove cached results from memory. This avoids unbounded growth of memory in dev sessions, since the memory cache no longer holds onto every visited route.&lt;/p&gt;
&lt;p&gt;Memory eviction requires the development filesystem cache to be enabled. In 16.3, both of these options are on by default. It can be disabled when investigating cache or development performance with the experimental &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopackMemoryEviction&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;turbopackMemoryEviction&lt;/code&gt; config value&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    turbopackMemoryEviction&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt; // disables memory eviction, default value is &#39;auto&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There is no single reduction percentage that applies to every application. Individual results depend on the size of the route graph, how much of it was touched during the development session, and how long the session was running.&lt;/p&gt;
&lt;h2 id=&quot;file-system-cache-for-builds&quot; data-docs-heading=&quot;&quot;&gt;File System cache for builds&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-turbopack#file-system-cache-for-builds&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Persisting the Turbopack memory cache to disk has been speeding up &lt;code&gt;next dev&lt;/code&gt; sessions &lt;a href=&quot;https://nextjs.org/blog/next-16-1#turbopack-file-system-caching-for-next-dev&quot;&gt;since the 16.1 release&lt;/a&gt;. After months of hardening in production with Vercel&#39;s own sites, the same persisted cache is now available for &lt;code&gt;next build&lt;/code&gt;, enabled by default.&lt;/p&gt;
&lt;figure class=&quot;not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]&quot; aria-label=&quot;Next.js build time comparison showing impact of file system cache&quot;&gt;&lt;div class=&quot;flex h-10 items-center rounded-t-md border-b border-[var(--ds-gray-400)] bg-[var(--ds-background-200)] py-0 pr-3 pl-4&quot;&gt;&lt;span class=&quot;text-sm font-medium text-[var(--ds-gray-1000)]&quot;&gt;Turbopack compile time for `next build`&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-4 bg-[var(--ds-background-100)] p-4&quot;&gt;&lt;div&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;nextjs.org&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~2.3× faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;nextjs.org Turbopack build time&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cold&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Without cache: 21 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;21s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;21s&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cached&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;44&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;With cache: 9.2 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:44%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;9.2s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;9.2s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;vercel.com/home&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~1.4× faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;vercel.com (logged out) Turbopack build time&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cold&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Without cache: 66 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;66s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;66s&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cached&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;70&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;With cache: 46 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:70%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;46s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;46s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;vercel.com/geist&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~5.5× faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;vercel.com/geist Turbopack build time&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cold&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Without cache: 30 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;30s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;30s&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cached&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;18&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;With cache: 5.5 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:18%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;5.5s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;5.5s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;With persistent disk cache, builds can take advantage of previously computed work and reduce the time it takes to compile your static assets. When Turbopack sees the cache at the start of a build, it reads entries from disk before compiling any new changes.&lt;/p&gt;
&lt;p&gt;The cache lives in &lt;code&gt;.next/cache&lt;/code&gt;, so CI builds only get faster if that directory is restored between runs.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopackFileSystemCache&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;turbopackFileSystemCacheForBuild&lt;/code&gt; reference&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for the opt-out and the full set of options.&lt;/p&gt;
&lt;h2 id=&quot;experimental-rust-react-compiler&quot; data-docs-heading=&quot;&quot;&gt;Experimental Rust React compiler&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-turbopack#experimental-rust-react-compiler&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js has provided stable support for the React Compiler &lt;a href=&quot;https://nextjs.org/blog/next-16#react-compiler-support-stable&quot;&gt;since the first 16.0 release&lt;/a&gt;. Until now, the React Compiler has only been available as a Babel transform. On larger applications, we observed that it could slow down builds while waiting for JS execution resources. Recently, the React team published a native Rust port of the compiler, which we were quick to integrate into Turbopack.&lt;/p&gt;
&lt;p&gt;Promising early tests against large React apps like &lt;a href=&quot;https://v0.app/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;v0&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; showed compilation wins of 20-50%, so we are releasing the native compiler integration as an experimental feature to drive more adoption.&lt;/p&gt;
&lt;p&gt;To test out the Rust React Compiler, enable the compiler and use the experimental &lt;code&gt;turbopackRustReactCompiler&lt;/code&gt; flag to use the native version:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // enable the compiler&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  reactCompiler&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // use the Rust version, instead of the OG Babel one&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    turbopackRustReactCompiler&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There are many ways to configure the React Compiler for features like opt-in functionality. You can &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/reactCompiler&quot;&gt;read the full documentation&lt;/a&gt; for more details.&lt;/p&gt;
&lt;h2 id=&quot;importmetaglob&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;import.meta.glob&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-turbopack#importmetaglob&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Turbopack now supports the Vite-compatible &lt;code&gt;import.meta.glob&lt;/code&gt; API:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; posts&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.glob&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;./posts/*.mdx&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This API can import all modules that match this pattern, without hardcoding their names. The result is an object keyed by the matching file paths. By default, each value is an async function that loads the module:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; posts) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; post&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; posts[path]();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Use &lt;code&gt;eager: true&lt;/code&gt; to &lt;code&gt;import&lt;/code&gt; each match immediately:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; posts&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;meta&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.glob&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;./posts/*.mdx&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  eager&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The implementation also supports named imports, multiple patterns, negative patterns, custom search path, query strings for loaders, and generated TypeScript types.&lt;/p&gt;
&lt;p&gt;This functionality is powered by Turbopack&#39;s file watcher. When a file is added to or removed from this match set, it will trigger recompilation in dev mode, so your site always reflects the latest changes. This API is perfect for fetching sets of similar documents, like product descriptions or blog posts. We also expect that library developers will benefit from this API existing across the broader JS ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;import.meta.glob&lt;/code&gt; is available as a Turbopack feature, and will not work for Next.js apps built with the &lt;code&gt;--webpack&lt;/code&gt; option.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/turbopack#importmetaglob&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;import.meta.glob&lt;/code&gt; reference&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for all of the available options.&lt;/p&gt;
&lt;h2 id=&quot;hmr-improvements&quot; data-docs-heading=&quot;&quot;&gt;HMR improvements&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-turbopack#hmr-improvements&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;By analyzing the performance of Turbopack in large Next.js apps at Vercel, we identified a number of performance improvements that could benefit all Turbopack users. Much of that investigation centered around making HMR subscriptions more efficient. One significant change streamlined the tracking of chunks that are loaded on a page. By reducing multiple subscriptions to a single one, we were able to reduce dev server cold start by over 15% on complex apps.&lt;/p&gt;
&lt;p&gt;This is only the beginning of our HMR resource investigations, and we expect to deliver more memory and cold-start improvements in future Next.js releases.&lt;/p&gt;
&lt;h2 id=&quot;smaller-runtime-size&quot; data-docs-heading=&quot;&quot;&gt;Smaller runtime size&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-turbopack#smaller-runtime-size&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Turbopack ships runtime code to every route that allows it to resolve modules and dynamically fetch new chunks. This also includes code for loading WebAssembly, workers, and top-level async modules. Not every Next.js application uses that functionality, though. Now Turbopack will only ship those features when they&#39;re needed, and avoids shipping extra runtime code the rest of the time.&lt;/p&gt;
&lt;h2 id=&quot;local-postcss-configuration&quot; data-docs-heading=&quot;&quot;&gt;Local PostCSS configuration&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-turbopack#local-postcss-configuration&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Monorepos may need different PostCSS transforms for different packages.&lt;/p&gt;
&lt;p&gt;The experimental &lt;code&gt;turbopackLocalPostcssConfig&lt;/code&gt; option lets Turbopack resolve the configuration closest to each CSS file before falling back to the project root:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    turbopackLocalPostcssConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This allows package-level CSS to use a local configuration while application CSS continues to use the root configuration.&lt;/p&gt;
&lt;h2 id=&quot;compatibility-and-reliability&quot; data-docs-heading=&quot;&quot;&gt;Compatibility and reliability&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-turbopack#compatibility-and-reliability&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js 16.3 rolls up all of the fixes from the 16.2 patch line and adds more improvements across module resolution, tracing, and HMR, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Correct file URLs for &lt;code&gt;import.meta.url&lt;/code&gt; on Windows&lt;/li&gt;
&lt;li&gt;Retry chunk fetching on failure&lt;/li&gt;
&lt;li&gt;Better support for &lt;code&gt;createRequire(new URL(..., import.meta.url))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Correct &lt;code&gt;worker_threads&lt;/code&gt; URL resolution&lt;/li&gt;
&lt;li&gt;Support for the &lt;code&gt;module-sync&lt;/code&gt; export condition&lt;/li&gt;
&lt;li&gt;Better errors when webpack loaders crash&lt;/li&gt;
&lt;li&gt;CSS HMR fixes in Safari&lt;/li&gt;
&lt;/ul&gt;</description><link>https://nextjs.org/blog/next-16-3-turbopack</link><guid isPermaLink="false">https://nextjs.org/blog/next-16-3-turbopack</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js 16.3: AI Improvements</title><description>&lt;aside class=&quot;not-prose mb-8 rounded-md border border-gray-alpha-400 p-6&quot;&gt;&lt;div class=&quot;flex items-center gap-3 font-medium text-gray-1000&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;size-2.5 shrink-0 rounded-full bg-blue-700&quot;&gt;&lt;/span&gt;&lt;span&gt;Next.js 16.3 is out!&lt;/span&gt;&lt;/div&gt;&lt;p class=&quot;mt-1.5 text-gray-900&quot;&gt;This post covers the preview, which has since shipped as stable. Install it with&lt;!-- --&gt; &lt;code class=&quot;rounded-md border border-gray-alpha-400 bg-gray-100 px-2 py-0.5 font-mono text-[0.95em]&quot;&gt;npm install next@latest&lt;/code&gt; &lt;!-- --&gt;and see the&lt;!-- --&gt; &lt;a class=&quot;underline!&quot; href=&quot;https://nextjs.org/blog/next-16-3&quot;&gt;release post&lt;/a&gt; &lt;!-- --&gt;for everything that&#39;s new.&lt;/p&gt;&lt;/aside&gt;
&lt;p&gt;As the Next.js 16.3 Preview nears a stable release, we&#39;re sharing a series of posts about what&#39;s inside. The first post, &lt;a href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations&quot;&gt;Instant Navigations&lt;/a&gt;, covers the new rendering and prefetching primitives. This second post focuses on AI improvements.&lt;/p&gt;
&lt;p&gt;Next.js has grown a lot since the App Router went stable, and more and more of that growth is driven by code written through agents like Claude Code, Cursor, and Codex.&lt;/p&gt;
&lt;p&gt;What would Next.js look like if it were designed primarily for agent-driven development? We&#39;re not all the way there yet, but we&#39;re getting closer with every release. &lt;a href=&quot;https://nextjs.org/blog/next-16#nextjs-devtools-mcp&quot;&gt;Next.js 16&lt;/a&gt; added the DevTools MCP server, and &lt;a href=&quot;https://nextjs.org/blog/next-16-2-ai&quot;&gt;Next.js 16.2&lt;/a&gt; brought bundled docs and &lt;a href=&quot;https://nextjs.org/blog/next-16-2-ai#experimental-agent-devtools&quot;&gt;&lt;code&gt;next-browser&lt;/code&gt;&lt;/a&gt;, an experimental CLI for letting agents drive a real browser.&lt;/p&gt;
&lt;p&gt;In Next.js 16.3, we&#39;re extending this with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#bundled-docs-through-agentsmd&quot;&gt;&lt;strong&gt;Bundled docs through AGENTS.md&lt;/strong&gt;&lt;/a&gt;: Keeps agents reading version-matched docs instead of their training data&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#first-party-skills&quot;&gt;&lt;strong&gt;First-party Skills&lt;/strong&gt;&lt;/a&gt;: Skills that help agents drive multi-step workflows&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#agent-browser-with-react-introspection&quot;&gt;&lt;strong&gt;Agent Browser with React introspection&lt;/strong&gt;&lt;/a&gt;: Drive a real browser and inspect React state from &lt;code&gt;agent-browser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#actionable-errors&quot;&gt;&lt;strong&gt;Actionable errors&lt;/strong&gt;&lt;/a&gt;: Labeled fix menus in the overlay and terminal for Instant Insights, with a &lt;strong&gt;Copy prompt&lt;/strong&gt; button and per-rule docs written for agents&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#a-smaller-more-focused-mcp-server&quot;&gt;&lt;strong&gt;A smaller, more focused MCP server&lt;/strong&gt;&lt;/a&gt;: New build diagnostics tools, knowledge-base tools retired&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#docs-as-markdown&quot;&gt;&lt;strong&gt;Docs as Markdown&lt;/strong&gt;&lt;/a&gt;: Append &lt;code&gt;.md&lt;/code&gt; to any docs URL for a plain Markdown version&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;bundled-docs-through-agentsmd&quot; data-docs-heading=&quot;&quot;&gt;Bundled docs through AGENTS.md&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#bundled-docs-through-agentsmd&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In our previous 16.2 release, we started &lt;a href=&quot;https://nextjs.org/blog/next-16-2-ai#agent-ready-create-next-app&quot;&gt;bundling&lt;/a&gt; the Next.js documentation into your project so agents can read it locally. Projects created with &lt;code&gt;create-next-app&lt;/code&gt; on 16.2 or later already point &lt;code&gt;AGENTS.md&lt;/code&gt; to those docs.&lt;/p&gt;
&lt;p&gt;In 16.3, &lt;code&gt;next dev&lt;/code&gt; writes and updates that pointer automatically, so existing projects stay current as you upgrade. On 16.1 or earlier, run the &lt;code&gt;agents-md&lt;/code&gt; codemod manually:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; @next/codemod@canary&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; agents-md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here&#39;s what &lt;code&gt;next dev&lt;/code&gt; inserts into your &lt;code&gt;AGENTS.md&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M9.18 0a1 1 0 0 1 .61.3l4.42 4.4a1 1 0 0 1 .29.71v8.09A2.5 2.5 0 0 1 12 16H4a2.5 2.5 0 0 1-2.5-2.5V0h7.69M3 13.5a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V5.62L8.88 1.5H3z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;AGENTS.md&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;&amp;lt;!-- BEGIN:nextjs-agent-rules --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text);font-weight:bold&quot;&gt;# This is NOT the Next.js you know&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt;`node_modules/next/dist/docs/`&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (resolved from this file&#39;s directory; in monorepos the &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt;`next`&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; package may not be visible from the repo root) before writing any code. Heed deprecation notices.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;This block is written and re-added by &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt;`next dev`&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; — verify at &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt;`node_modules/next/dist/server/lib/generate-agent-files.js`&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;&amp;lt;!-- END:nextjs-agent-rules --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The block is only written when &lt;code&gt;next dev&lt;/code&gt; detects an &lt;a href=&quot;https://nextjs.org/docs/app/guides/ai-agents&quot;&gt;AI coding agent&lt;/a&gt; in the environment and the markers aren&#39;t already there. Anything outside the markers is preserved, and you can opt out with &lt;code&gt;agentRules: false&lt;/code&gt; in &lt;code&gt;next.config.ts&lt;/code&gt;. Commit the block as-is, even if it shows up as an uncommitted change.&lt;/p&gt;
&lt;h2 id=&quot;first-party-skills&quot; data-docs-heading=&quot;&quot;&gt;First-party Skills&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#first-party-skills&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Skills give agents framework-specific context. You may have installed our earlier &lt;a href=&quot;https://github.com/vercel-labs/next-skills&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;em&gt;knowledge&lt;/em&gt; Skills&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; from &lt;a href=&quot;https://skills.sh/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;skills.sh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, which covered App Router conventions and caching APIs. With the bundled docs now reaching agents through &lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#bundled-docs-through-agentsmd&quot;&gt;the managed AGENTS.md block&lt;/a&gt;, we&#39;re retiring those Skills. Run &lt;code&gt;npx skills update&lt;/code&gt; to remove them from your installed set.&lt;/p&gt;
&lt;p&gt;Skills are still useful for multi-step &lt;em&gt;workflows&lt;/em&gt; that docs alone can&#39;t drive end to end. Next.js 16.3 adds three new first-party &lt;a href=&quot;https://www.skills.sh/vercel/next.js&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Skills&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for those.&lt;/p&gt;
&lt;h3 id=&quot;next-dev-loop&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;next-dev-loop&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#next-dev-loop&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.skills.sh/vercel/next.js/next-dev-loop&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;next-dev-loop&lt;/code&gt; Skill&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; gives your coding agent access to the full development feedback loop. It can drive the browser, read the console, follow network requests, and inspect the React tree as it iterates.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/_next/mcp&lt;/code&gt;&lt;/strong&gt;, the framework&#39;s view of routes, server logs, and compilation issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;agent-browser&lt;/code&gt;&lt;/strong&gt;, the browser&#39;s view of the DOM, console, network, and React tree.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Skill requires &lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#agent-browser-with-react-introspection&quot;&gt;&lt;code&gt;agent-browser&lt;/code&gt;&lt;/a&gt; version 0.27 or later.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; skills&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; vercel/next.js&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; --skill&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next-dev-loop&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then prompt your agent with something like:&lt;/p&gt;
&lt;figure class=&quot;not-prose my-6 overflow-hidden rounded-md border border-gray-200 bg-background-100&quot;&gt;&lt;figcaption class=&quot;flex items-center justify-between gap-2 border-b border-gray-200 bg-background-200 px-4 py-2&quot;&gt;&lt;span class=&quot;text-sm text-gray-900&quot;&gt;Prompt&lt;/span&gt;&lt;button class=&quot;inline-flex items-center gap-1.5 rounded-full border border-gray-alpha-300 bg-background-100 px-2.5 py-[5px] text-[11px] font-medium leading-none text-gray-900 transition-[background,border-color,color] duration-150 hover:border-gray-alpha-500 hover:bg-background-200 hover:text-foreground&quot; value=&quot;After every edit, verify the page still works at runtime using the next-dev-loop skill.&quot; type=&quot;button&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;12&quot; width=&quot;12&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M6.75 14a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m-7.5-3.25a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m7.5 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5M8.25.5C9.22.5 10 1.28 10 2.25V3H8.5v-.75A.25.25 0 0 0 8.25 2h-5.5a.25.25 0 0 0-.25.25v7.5c0 .14.11.25.25.25H4.5v1.5H2.75C1.78 11.5 1 10.72 1 9.75v-7.5C1 1.28 1.78.5 2.75.5zm-1.5 7.25a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m7.5 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5M6.75 4.5a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span&gt;Copy prompt&lt;/span&gt;&lt;/button&gt;&lt;/figcaption&gt;&lt;div class=&quot;relative&quot;&gt;&lt;pre class=&quot;whitespace-pre-wrap break-words px-4 py-4 font-mono text-sm leading-relaxed text-gray-1000 max-h-28 overflow-hidden&quot;&gt;After every edit, verify the page still works at runtime using the next-dev-loop skill.&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;1680&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-next-dev-loop-light.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-next-dev-loop-light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;1680&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-next-dev-loop-dark.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-next-dev-loop-dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;figcaption&gt;&lt;p&gt;Claude editing, compiling, reloading, and inspecting the result through
&lt;code&gt;next-dev-loop&lt;/code&gt;.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;next-cache-components-adoption&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;next-cache-components-adoption&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#next-cache-components-adoption&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.skills.sh/vercel/next.js/next-cache-components-adoption&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;next-cache-components-adoption&lt;/code&gt; Skill&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; turns Cache Components on in your project and works through the app one feature at a time, checking in with you at the boundaries so you stay in control of the scope. It works in one of two modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Incremental.&lt;/strong&gt; Lands a single mechanical PR up front that opts every route out of validation, so you can ship features as you go in follow-up PRs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direct.&lt;/strong&gt; Adopts every route in place on one branch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The per-feature loop is the same in both: the Skill reads the &lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#actionable-errors&quot;&gt;actionable error&lt;/a&gt;, fetches the per-error docs page it links to, applies that fix to the route, then drives the browser through &lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#next-dev-loop&quot;&gt;&lt;code&gt;next-dev-loop&lt;/code&gt;&lt;/a&gt; to confirm the static shell renders the right content.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; skills&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; vercel/next.js&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; --skill&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next-cache-components-adoption&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then prompt your agent with something like:&lt;/p&gt;
&lt;figure class=&quot;not-prose my-6 overflow-hidden rounded-md border border-gray-200 bg-background-100&quot;&gt;&lt;figcaption class=&quot;flex items-center justify-between gap-2 border-b border-gray-200 bg-background-200 px-4 py-2&quot;&gt;&lt;span class=&quot;text-sm text-gray-900&quot;&gt;Prompt&lt;/span&gt;&lt;button class=&quot;inline-flex items-center gap-1.5 rounded-full border border-gray-alpha-300 bg-background-100 px-2.5 py-[5px] text-[11px] font-medium leading-none text-gray-900 transition-[background,border-color,color] duration-150 hover:border-gray-alpha-500 hover:bg-background-200 hover:text-foreground&quot; value=&quot;Adopt Cache Components in this project using the next-cache-components-adoption skill.&quot; type=&quot;button&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;12&quot; width=&quot;12&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M6.75 14a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m-7.5-3.25a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m7.5 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5M8.25.5C9.22.5 10 1.28 10 2.25V3H8.5v-.75A.25.25 0 0 0 8.25 2h-5.5a.25.25 0 0 0-.25.25v7.5c0 .14.11.25.25.25H4.5v1.5H2.75C1.78 11.5 1 10.72 1 9.75v-7.5C1 1.28 1.78.5 2.75.5zm-1.5 7.25a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m7.5 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5M6.75 4.5a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span&gt;Copy prompt&lt;/span&gt;&lt;/button&gt;&lt;/figcaption&gt;&lt;div class=&quot;relative&quot;&gt;&lt;pre class=&quot;whitespace-pre-wrap break-words px-4 py-4 font-mono text-sm leading-relaxed text-gray-1000 max-h-28 overflow-hidden&quot;&gt;Adopt Cache Components in this project using the next-cache-components-adoption skill.&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;1680&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-adoption-light.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-adoption-light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;1680&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-adoption-dark.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-adoption-dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;figcaption&gt;&lt;p&gt;Claude turning Cache Components on and adopting routes one feature at a
time.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h3 id=&quot;next-cache-components-optimizer&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;next-cache-components-optimizer&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#next-cache-components-optimizer&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.skills.sh/vercel/next.js/next-cache-components-optimizer&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;next-cache-components-optimizer&lt;/code&gt; Skill&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; takes a target route or set of routes under Cache Components, turns the UI you want on screen at click time into a failing &lt;a href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#keeping-navigations-instant&quot;&gt;&lt;code&gt;instant()&lt;/code&gt;&lt;/a&gt; test, and works it to green. It checks both ways a route reaches the user:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Initial load.&lt;/strong&gt; Checks that the route&#39;s static shell renders immediately when someone visits the page directly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client-side navigation.&lt;/strong&gt; Checks that the next page renders immediately when someone follows a link.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The passing test is committed along with the route refactoring to catch future regressions.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; skills&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; vercel/next.js&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; --skill&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next-cache-components-optimizer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then prompt your agent with something like:&lt;/p&gt;
&lt;figure class=&quot;not-prose my-6 overflow-hidden rounded-md border border-gray-200 bg-background-100&quot;&gt;&lt;figcaption class=&quot;flex items-center justify-between gap-2 border-b border-gray-200 bg-background-200 px-4 py-2&quot;&gt;&lt;span class=&quot;text-sm text-gray-900&quot;&gt;Prompt&lt;/span&gt;&lt;button class=&quot;inline-flex items-center gap-1.5 rounded-full border border-gray-alpha-300 bg-background-100 px-2.5 py-[5px] text-[11px] font-medium leading-none text-gray-900 transition-[background,border-color,color] duration-150 hover:border-gray-alpha-500 hover:bg-background-200 hover:text-foreground&quot; value=&quot;Make the navigation from `/settings` to `/dashboard` instant using the next-cache-components-optimizer skill. The header and the project list should be part of the instant UI.&quot; type=&quot;button&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;12&quot; width=&quot;12&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M6.75 14a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m-7.5-3.25a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m7.5 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5M8.25.5C9.22.5 10 1.28 10 2.25V3H8.5v-.75A.25.25 0 0 0 8.25 2h-5.5a.25.25 0 0 0-.25.25v7.5c0 .14.11.25.25.25H4.5v1.5H2.75C1.78 11.5 1 10.72 1 9.75v-7.5C1 1.28 1.78.5 2.75.5zm-1.5 7.25a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m7.5 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5M6.75 4.5a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span&gt;Copy prompt&lt;/span&gt;&lt;/button&gt;&lt;/figcaption&gt;&lt;div class=&quot;relative&quot;&gt;&lt;pre class=&quot;whitespace-pre-wrap break-words px-4 py-4 font-mono text-sm leading-relaxed text-gray-1000 max-h-28 overflow-hidden&quot;&gt;Make the navigation from `/settings` to `/dashboard` instant using the next-cache-components-optimizer skill. The header and the project list should be part of the instant UI.&lt;/pre&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;1680&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-optimizer-light.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-optimizer-light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;1680&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-optimizer-dark.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-ai-improvements%2Fcc-optimizer-dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;figcaption&gt;&lt;p&gt;Claude diagnosing what keeps the page&#39;s content out of its static shell.&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Since this post, the stable &lt;a href=&quot;https://nextjs.org/blog/next-16-3&quot;&gt;Next.js 16.3&lt;/a&gt; release adds a fourth Skill, &lt;a href=&quot;https://www.skills.sh/vercel/next.js/next-partial-prefetching-adoption&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;next-partial-prefetching-adoption&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, which turns on &lt;a href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#rethinking-prefetching&quot;&gt;Partial Prefetching&lt;/a&gt; and works through your app until every link reuses a shared loading shell.&lt;/p&gt;
&lt;h2 id=&quot;agent-browser-with-react-introspection&quot; data-docs-heading=&quot;&quot;&gt;Agent Browser with React introspection&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#agent-browser-with-react-introspection&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The experimental &lt;a href=&quot;https://nextjs.org/blog/next-16-2-ai#experimental-agent-devtools&quot;&gt;&lt;code&gt;next-browser&lt;/code&gt;&lt;/a&gt; from Next.js 16.2 has merged into the general-purpose &lt;a href=&quot;https://www.npmjs.com/package/agent-browser&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;agent-browser&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; CLI. Everything &lt;code&gt;next-browser&lt;/code&gt; did is now in &lt;code&gt;agent-browser&lt;/code&gt;, and it works beyond Next.js too.&lt;/p&gt;
&lt;p&gt;Version 0.27 adds React DevTools introspection on top of the existing DOM, console, network, and Web Vitals access. Agents can list the component tree with &lt;code&gt;react tree&lt;/code&gt;, inspect a single component with &lt;code&gt;react inspect &amp;lt;fiberId&amp;gt;&lt;/code&gt;, profile re-renders with &lt;code&gt;react renders start&lt;/code&gt; and &lt;code&gt;stop&lt;/code&gt;, and see what&#39;s holding a render with &lt;code&gt;react suspense --only-dynamic --json&lt;/code&gt;. The &lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#next-dev-loop&quot;&gt;&lt;code&gt;next-dev-loop&lt;/code&gt;&lt;/a&gt; Skill launches &lt;code&gt;agent-browser&lt;/code&gt; with React DevTools enabled so these commands are available during verification.&lt;/p&gt;
&lt;p&gt;To install or upgrade, run &lt;code&gt;npm install -g agent-browser@^0.27&lt;/code&gt;. The React commands require &lt;code&gt;--enable react-devtools&lt;/code&gt; at launch.&lt;/p&gt;
&lt;h2 id=&quot;actionable-errors&quot; data-docs-heading=&quot;&quot;&gt;Actionable errors&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#actionable-errors&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/cacheComponents&quot;&gt;Cache Components&lt;/a&gt; enabled, an &lt;code&gt;await&lt;/code&gt; on the server is a choice. &lt;a href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#stream-cache-or-block&quot;&gt;Instant Insights&lt;/a&gt; presents that choice as an error with three specific fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stream&lt;/strong&gt; the data behind a &lt;code&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt; boundary&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache&lt;/strong&gt; it with &lt;code&gt;&quot;use cache&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Block&lt;/strong&gt; the route with &lt;code&gt;export const instant = false&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are product decisions with trade-offs. Picking the right one needs context, whether you or your coding agent is making the choice.&lt;/p&gt;
&lt;h3 id=&quot;instant-insights-fix-prompts&quot; data-docs-heading=&quot;&quot;&gt;Instant Insights fix prompts&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#instant-insights-fix-prompts&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;An Instant Insight presents the error with labeled fixes, with a &lt;strong&gt;Copy prompt&lt;/strong&gt; button that packages the chosen fix into a paste-ready prompt for your coding agent. The prompt walks the agent through identifying the failing code, reading the matching error page, applying the canonical pattern, and verifying the result at runtime through the &lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#next-dev-loop&quot;&gt;&lt;code&gt;next-dev-loop&lt;/code&gt;&lt;/a&gt; Skill.&lt;/p&gt;
&lt;p&gt;For example, say we hit an uncached &lt;code&gt;fetch()&lt;/code&gt; call in a page. We pick &lt;strong&gt;Stream&lt;/strong&gt; and click &lt;strong&gt;Copy prompt&lt;/strong&gt;, and get:&lt;/p&gt;
&lt;details open=&quot;&quot;&gt;&lt;summary&gt;The prompt your agent can use&lt;/summary&gt;&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;Apply the [Stream] &quot;Wrap in or move into Suspense&quot; fix to the Next.js Insight raised in this project.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;Steps:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;1. Make sure you can drive a browser before you start. The fix isn&#39;t verified until you&#39;ve reloaded the route and looked at what renders. If you don&#39;t already have browser tooling set up, install the next-dev-loop skill (https://www.skills.sh/vercel/next.js/next-dev-loop) first.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;2. Identify the failing code in the error block below. It may be a data-access call, a hook call, a metadata or viewport export, or a component. Keep the fix focused on that code. If you think a related refactor (a sibling component, a shared layout, a wrapping boundary) would make the result meaningfully better, name it and check with the user before doing it — don&#39;t expand the scope silently.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;3. Read the rule docs at https://nextjs.org/docs/messages/blocking-prerender-dynamic for the full Insight explanation, then read the fix section at https://nextjs.org/docs/messages/blocking-prerender-dynamic#wrap-in-or-move-into-suspense. Pick the pattern under &quot;### Patterns&quot; that matches the failing code, then read &quot;### Gotchas&quot; before editing — they list constraints that are easy to miss. Use the canonical imports and code shape from the page; don&#39;t improvise variations.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;4. Apply the chosen pattern to the code identified in step 2. Don&#39;t narrate the change with new comments — the code should explain itself. Only leave a comment when the *why* isn&#39;t clear (e.g. a deliberate Block with a reason).&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;5. Verify the fix at runtime. The Insight clearing in the dev overlay confirms the build is happy, but not what actually renders. Reload the route in a browser and confirm the static shell still paints first and any new &amp;lt;Suspense&amp;gt; fallback resolves to its real content.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;6. Check the shell isn&#39;t empty. A &amp;lt;Suspense&amp;gt; boundary placed too high (around the whole page body, or with `fallback={null}`) can leave the build reporting a shell while the shell itself contains nothing and everything streams. If that&#39;s what you see, pull the boundary down closer to the actual dynamic read.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;7. If the fix touched shared code (a layout, a wrapper, a sidebar), re-check the sibling routes too — a shell-level change can fix one route and break another. A before/after capture of the affected routes is a useful sanity check: the visible UI may look the same (the fix often just changes what&#39;s in the shell vs streamed), but if anything regressed visually, you&#39;ll see it.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;When you reply to the user, just summarize what you changed and why in plain prose. Don&#39;t echo this checklist back as headers, sections, or bullet lists labeled &quot;Verification&quot; or &quot;Scope&quot; — those are your internal steps, not the user&#39;s report.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;## Error Type&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;Blocking Route&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;## Error Message&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;Route &quot;/products/[slug]&quot;: Next.js encountered uncached data during prerendering or a navigation.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;`fetch(...)` or `connection()` accessed outside of `&amp;lt;Suspense&amp;gt;` prevents the route from being prerendered or the navigation from being instant, leading to a slower user experience.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;    at ProductPage (app/products/[slug]/page.tsx:52:32)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;## Code Frame&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  50 |   props: PageProps&amp;lt;&quot;/products/[slug]&quot;&amp;gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  51 | ) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;&amp;gt; 52 |   const featured = await fetch(`/api/products/${slug}`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;     |                                ^&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  53 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  54 |   return (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  55 |     &amp;lt;div className=&quot;space-y-4&quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;Next.js version: 16.3.0 (Turbopack)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id=&quot;structured-console-output&quot; data-docs-heading=&quot;&quot;&gt;Structured console output&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#structured-console-output&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The same fix menu shows up in the terminal during &lt;code&gt;next dev&lt;/code&gt;, and &lt;code&gt;next build&lt;/code&gt; emits it when an error stops a prerender. That means an agent reading errors from &lt;code&gt;next build&lt;/code&gt;, CI logs, or any terminal session where the dev overlay isn&#39;t available still gets the same labeled fixes, linked to the matching section of the error page:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;Error: Route &quot;/products/[slug]&quot;: Next.js encountered uncached data during prerendering or a navigation.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;`fetch(...)` or `connection()` accessed outside of `&amp;lt;Suspense&amp;gt;` prevents the route from being prerendered or the navigation from being instant, leading to a slower user experience.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;Ways to fix this:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  - [stream] Provide a placeholder with `&amp;lt;Suspense fallback={...}&amp;gt;` around the data access&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;    https://nextjs.org/docs/messages/blocking-prerender-dynamic#wrap-in-or-move-into-suspense&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  - [cache] Cache the data access with `&quot;use cache&quot;` (does not apply to `connection()`)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;    https://nextjs.org/docs/messages/blocking-prerender-dynamic#cache-the-component-or-data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  - [block] Set `export const instant = false` to silence this error and allow a blocking route&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;    https://nextjs.org/docs/messages/blocking-prerender-dynamic#allow-blocking-route&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;    at ProductPage (app/products/[slug]/page.tsx:52:32)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  50 |   props: PageProps&amp;lt;&quot;/products/[slug]&quot;&amp;gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  51 | ) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;&amp;gt; 52 |   const featured = await fetch(`/api/products/${slug}`);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;     |                                ^&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  53 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  54 |   return (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span&gt;  55 |     &amp;lt;div className=&quot;space-y-4&quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;error-pages-written-for-agents&quot; data-docs-heading=&quot;&quot;&gt;Error pages written for agents&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#error-pages-written-for-agents&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The overlay and console show you &lt;em&gt;which&lt;/em&gt; fix to apply. But a fix is a pattern with constraints, edge cases, and trade-offs that don&#39;t fit in an error message. So errors get their own page on &lt;code&gt;nextjs.org/docs/messages&lt;/code&gt;, written for agents to read. The fix sections follow the same shape: the canonical &lt;strong&gt;Patterns&lt;/strong&gt;, the &lt;strong&gt;Trade-offs&lt;/strong&gt; against the other fixes, and the &lt;strong&gt;Gotchas&lt;/strong&gt; an agent is likely to miss on a first attempt.&lt;/p&gt;
&lt;p&gt;For example, our uncached &lt;code&gt;fetch()&lt;/code&gt; call lands on &lt;a href=&quot;https://nextjs.org/docs/messages/blocking-prerender-dynamic&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;blocking-prerender-dynamic&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, with our Stream choice at &lt;a href=&quot;https://nextjs.org/docs/messages/blocking-prerender-dynamic#wrap-in-or-move-into-suspense&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Wrap in or move into Suspense&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;. This is the most common one. There are 10+ similar pages under &lt;code&gt;/docs/messages&lt;/code&gt;, each with its own considerations. An agent applying the fix on its own can read the trade-offs and pick what fits.&lt;/p&gt;
&lt;p&gt;Together, the &lt;strong&gt;Copy prompt&lt;/strong&gt; button, the structured console output, and the per-rule docs pages give agents the context to write performant, idiomatic Cache Components code.&lt;/p&gt;
&lt;h2 id=&quot;a-smaller-more-focused-mcp-server&quot; data-docs-heading=&quot;&quot;&gt;A smaller, more focused MCP server&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#a-smaller-more-focused-mcp-server&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://nextjs.org/docs/app/guides/mcp&quot;&gt;DevTools MCP server&lt;/a&gt; used to include its own Next.js knowledge base, along with upgrade and Cache Components helpers. With the bundled docs now serving that purpose, we&#39;ve removed those tools from the MCP server, &lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#first-party-skills&quot;&gt;as we did with the knowledge Skills&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In 16.3, the MCP server adds two new compilation tools: &lt;code&gt;get_compilation_issues&lt;/code&gt; for the whole project, and &lt;code&gt;compile_route&lt;/code&gt; for a single route. Agents often run &lt;code&gt;next build&lt;/code&gt; just to check whether the code compiles, which is overkill while you&#39;re still editing. These tools answer the same question from the running dev server, much faster.&lt;/p&gt;
&lt;p&gt;Skills like &lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#next-dev-loop&quot;&gt;&lt;code&gt;next-dev-loop&lt;/code&gt;&lt;/a&gt; call the underlying &lt;code&gt;/_next/mcp&lt;/code&gt; endpoints directly, so they work without any extra setup. To use these tools from your own agent client, add &lt;a href=&quot;https://nextjs.org/docs/app/guides/mcp&quot;&gt;&lt;code&gt;next-devtools-mcp&lt;/code&gt;&lt;/a&gt; to your &lt;code&gt;.mcp.json&lt;/code&gt;. The client finds the running &lt;code&gt;next dev&lt;/code&gt; automatically.&lt;/p&gt;
&lt;h2 id=&quot;docs-as-markdown&quot; data-docs-heading=&quot;&quot;&gt;Docs as Markdown&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#docs-as-markdown&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Append &lt;code&gt;.md&lt;/code&gt; to any Next.js docs URL to get the page as plain markdown. This works for any page on &lt;code&gt;nextjs.org/docs&lt;/code&gt;, including the per-error pages. Clients that send an &lt;code&gt;Accept: text/markdown&lt;/code&gt; header get the markdown version too.&lt;/p&gt;
&lt;p&gt;The full index is at &lt;a href=&quot;https://nextjs.org/docs/llms.txt&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;/docs/llms.txt&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://nextjs.org/docs/llms-full.txt&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;/docs/llms-full.txt&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; bundles all doc pages into a single file. Both follow the &lt;a href=&quot;https://llmstxt.org/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;llms.txt&lt;/code&gt; convention&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, so any agent that already reads &lt;code&gt;llms.txt&lt;/code&gt; for other tools can read Next.js docs the same way.&lt;/p&gt;
&lt;h2 id=&quot;feedback-and-community&quot; data-docs-heading=&quot;&quot;&gt;Feedback and Community&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#feedback-and-community&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Share your feedback and help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/discord&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discord Community&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>https://nextjs.org/blog/next-16-3-ai-improvements</link><guid isPermaLink="false">https://nextjs.org/blog/next-16-3-ai-improvements</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js 16.3: Instant Navigations</title><description>&lt;aside class=&quot;not-prose mb-8 rounded-md border border-gray-alpha-400 p-6&quot;&gt;&lt;div class=&quot;flex items-center gap-3 font-medium text-gray-1000&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;size-2.5 shrink-0 rounded-full bg-blue-700&quot;&gt;&lt;/span&gt;&lt;span&gt;Next.js 16.3 is out!&lt;/span&gt;&lt;/div&gt;&lt;p class=&quot;mt-1.5 text-gray-900&quot;&gt;This post covers the preview, which has since shipped as stable. Install it with&lt;!-- --&gt; &lt;code class=&quot;rounded-md border border-gray-alpha-400 bg-gray-100 px-2 py-0.5 font-mono text-[0.95em]&quot;&gt;npm install next@latest&lt;/code&gt; &lt;!-- --&gt;and see the&lt;!-- --&gt; &lt;a class=&quot;underline!&quot; href=&quot;https://nextjs.org/blog/next-16-3&quot;&gt;release post&lt;/a&gt; &lt;!-- --&gt;for everything that&#39;s new.&lt;/p&gt;&lt;/aside&gt;
&lt;p&gt;Next.js 16.3 is almost here, and it&#39;s packed with a ton of improvements: better rendering under stress thanks to native Node.js streams, faster startup times in local dev, and deeper integration with agent-based workflows.&lt;/p&gt;
&lt;p&gt;We&#39;ll be covering these features in the coming weeks as we prepare a stable release. But today, we&#39;d like to focus on one new feature we&#39;re calling &lt;em&gt;Instant Navigations&lt;/em&gt; — a suite of tools that bring the responsiveness of client-driven SPAs to Next.js, without sacrificing the benefits that come with its server-driven model.&lt;/p&gt;
&lt;p&gt;Let&#39;s see how this feature addresses the long-standing (and valid!) criticism that Server Components can make apps feel unresponsive.&lt;/p&gt;
&lt;h2 id=&quot;instant-navigations&quot; data-docs-heading=&quot;&quot;&gt;Instant Navigations&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#instant-navigations&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of the most common frustrations we hear about Next.js apps is that navigations feel slow.&lt;/p&gt;
&lt;p&gt;In a server-driven app, navigating usually requires a network roundtrip:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You click a link.&lt;/li&gt;
&lt;li&gt;Nothing happens.&lt;/li&gt;
&lt;li&gt;Then the server responds, and the next page appears.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is not necessarily bad, and it can work well for content-driven websites like newspapers and blogs. But it does make the experience &quot;feel like a website&quot;. It&#39;s not snappy. Compare this to how client-driven apps do navigations:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You click a link.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Instantly,&lt;/em&gt; you see a shell of the next page (with some data still loading).&lt;/li&gt;
&lt;li&gt;Then the server responds, and the next page fully reveals.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is a common reason why many developers prefer to create SPAs (single-page apps). Even though the server-driven request/response paradigm has many advantages, instant navigations still &lt;em&gt;feel better&lt;/em&gt; for many kinds of apps.&lt;/p&gt;
&lt;h3 id=&quot;were-fixing-this&quot; data-docs-heading=&quot;&quot;&gt;We&#39;re fixing this&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#were-fixing-this&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We&#39;ve heard your feedback about this loud and clear.&lt;/p&gt;
&lt;p&gt;In Next.js 16.3, we are shipping new opt-in behaviors that let you have the best of both worlds: server-driven apps with instant navigations. &lt;strong&gt;You get the full benefits of a server, but navigations are instant like in a single-page app.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let&#39;s have a look at how this works.&lt;/p&gt;
&lt;h3 id=&quot;first-enable-cache-components&quot; data-docs-heading=&quot;&quot;&gt;First, enable Cache Components&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#first-enable-cache-components&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To try these new behaviors, enable the Cache Components flag:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { NextConfig } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; NextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  cacheComponents&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Over the last year, we&#39;ve been simplifying Next.js back to its roots: dynamic by default, with no hidden or implicit caching. This flag enables those new behaviors, and it will become a default in a future major version of Next.js.&lt;/p&gt;
&lt;h3 id=&quot;stream-cache-or-block&quot; data-docs-heading=&quot;&quot;&gt;Stream, Cache, or Block&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#stream-cache-or-block&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Now, when a route &lt;code&gt;await&lt;/code&gt;s some data on the server, you will be presented with a choice between a few options:&lt;/p&gt;
&lt;figure&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;1680&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsights-light-v3.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsights-light-v3.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2160&quot; height=&quot;1680&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsights-dark-v3.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsights-dark-v3.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;figcaption&gt;&lt;p&gt;The new Instant Insights panel automatically surfaces slow navigations&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;What do these options mean?&lt;/p&gt;
&lt;p&gt;To make a navigation instant, you &quot;turn&quot; an asynchronous operation into something that can be available instantly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/our-journey-with-caching#dynamic&quot;&gt;&lt;strong&gt;Stream&lt;/strong&gt; with &lt;code&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt;.&lt;/a&gt; The user will instantly see a loading state (with more UI streaming in after).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/our-journey-with-caching#cached-functions&quot;&gt;&lt;strong&gt;Cache&lt;/strong&gt; with &lt;code&gt;&#39;use cache&#39;&lt;/code&gt;&lt;/a&gt;. The user will instantly see a previously cached UI (reused between requests).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;In both cases above, the navigation will feel SPA-like and instant to the user.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;However, sometimes you might want to make a certain navigation server-bound. For example, a blog might choose to never show a loading shell for posts. For those cases, you can tell Next.js that you &lt;em&gt;want&lt;/em&gt; this navigation to &lt;strong&gt;Block&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// in page.tsx or layout.jsx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; instant&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then the error dialog will go away.&lt;/p&gt;
&lt;p&gt;Notice how this puts you in control. If you want your server-driven app to react to link clicks instantly—without waiting for the network—then you Stream or Cache. If you want some routes to delay navigations, then you Block.&lt;/p&gt;
&lt;p&gt;To learn more about how Instant Insights integrates with coding agents, read &lt;a href=&quot;https://nextjs.org/blog/next-16-3-ai-improvements#actionable-errors&quot;&gt;Next.js 16.3: AI Improvements&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;not-prose my-8 rounded-2xl border border-green-700/30 bg-green-100 p-4 text-copy-16 text-gray-1000 md:p-6&quot;&gt;&lt;div class=&quot;text-green-900 uppercase text-sm font-semibold tracking-wide inline-flex items-start gap-2&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentcolor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.75 2.8a1.5 1.5 0 1 0-1.5 0V5H7a6 6 0 0 0-5.92 5H0v3h1v3h14v-3h1v-3h-1.08A6 6 0 0 0 9 5h-.25zM7 6.5A4.5 4.5 0 0 0 2.5 11v3.5h11V11A4.5 4.5 0 0 0 9 6.5zm.25 4.75a1.75 1.75 0 1 1-3.5 0 1.75 1.75 0 0 1 3.5 0M10.5 13a1.75 1.75 0 1 0 0-3.5 1.75 1.75 0 0 0 0 3.5&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;p&gt;Agent skill&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;mt-4&quot;&gt;&lt;p&gt;If you&#39;re looking to adopt Cache Components for the first time in an existing
app, we&#39;ve put together a Skill you can use to have your agent walk you
through the process.&lt;/p&gt;&lt;/div&gt;&lt;div class=&quot;mt-6&quot;&gt;&lt;button value=&quot;Install this skill https://github.com/vercel/next.js/tree/canary/skills/next-cache-components-adoption and adopt Cache Components in this project using it&quot; class=&quot;bg-gray-1000 text-background-100 px-4 py-2 rounded-full inline-flex text-sm font-medium items-center gap-2 hover:bg-gray-900 active:bg-gray-1000 focus-visible:outline-none focus-visible:shadow-[var(--ds-focus-ring)]&quot; type=&quot;button&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M6.75 14a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m-7.5-3.25a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m7.5 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5M8.25.5C9.22.5 10 1.28 10 2.25V3H8.5v-.75A.25.25 0 0 0 8.25 2h-5.5a.25.25 0 0 0-.25.25v7.5c0 .14.11.25.25.25H4.5v1.5H2.75C1.78 11.5 1 10.72 1 9.75v-7.5C1 1.28 1.78.5 2.75.5zm-1.5 7.25a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m7.5 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5M6.75 4.5a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5m3.75 0a.75.75 0 1 1 0 1.5.75.75 0 0 1 0-1.5&quot;&gt;&lt;/path&gt;&lt;/svg&gt; Copy prompt&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;keeping-navigations-instant&quot; data-docs-heading=&quot;&quot;&gt;Keeping navigations instant&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#keeping-navigations-instant&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With Instant Insights, we&#39;ve made slow navigations an error in development. To more easily catch regressions to your instant routes after changes and refactorings, we have also provided an &lt;code&gt;instant&lt;/code&gt; test helper for Playwright tests:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { expect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; test } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;@playwright/test&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { instant } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;@next/playwright&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;test&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;product title is available immediately&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; ({ page }) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.goto&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;/products/shoes&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Assert what&#39;s visible without waiting for network&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; instant&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.click&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;a[href=&quot;/products/hats&quot;]&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; expect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.locator&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;h1&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.toContainText&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;Baseball Cap&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; expect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.getByText&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;Checking inventory...&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.toBeVisible&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; expect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.getByText&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;12 in stock&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.toBeVisible&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This lets you (or your agent) assert more granularly what must be instantly visible after each link click.&lt;/p&gt;
&lt;p&gt;We&#39;re also exploring ways to surface the errors you see in development during the build process, so any regressions in your instant routes would be caught at build time.&lt;/p&gt;
&lt;h3 id=&quot;rethinking-prefetching&quot; data-docs-heading=&quot;&quot;&gt;Rethinking prefetching&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#rethinking-prefetching&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For navigations to feel truly instant (like SPAs), we&#39;ve needed to close two different gaps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client needs to talk to the server. This can be slow if there&#39;s high latency between them.&lt;/li&gt;
&lt;li&gt;Also, the server needs to generate a response. This can be slow if the server code is slow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By Streaming or Caching the response, we get rid of the second gap: the server itself doesn&#39;t block. But there&#39;s still a gap &lt;em&gt;between&lt;/em&gt; the client and the server. How could Next.js &quot;know&quot; the response instantly &lt;em&gt;by the time the user clicks&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;Previously, Next.js solved this by sending a prefetch request to the server for every link in the viewport. If you paid attention to the Network tab in the production mode, you might have noticed a flurry of requests on scroll:&lt;/p&gt;
&lt;figure&gt;&lt;div style=&quot;aspect-ratio:1280 / 720&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-before-light-v2.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-before-light-v2.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-before-light-v2.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-before-dark-v2.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-before-dark-v2.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-before-dark-v2.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;In 16.2, Next.js makes a prefetch request for every link, even if those
links point to the same route&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Many of you told us that this looked ridiculous, and frankly, we agree.&lt;/p&gt;
&lt;p&gt;We&#39;ve been thinking about how single-page apps solve this. A single-page app is able to respond to each navigation instantly because it bundles all the code that&#39;s necessary to display the next page and ships it to the client. It might still need more data—so clicking doesn&#39;t display a complete page—but it&#39;s enough to display a &quot;shell&quot; of the page.&lt;/p&gt;
&lt;p&gt;So we&#39;ve decided to borrow this trick from single-page apps. &lt;strong&gt;Instead of prefetching a page &lt;em&gt;per link&lt;/em&gt;, Next.js will now prefetch a reusable shell &lt;em&gt;per route&lt;/em&gt;.&lt;/strong&gt; Those shells will then be cached on the client so they&#39;re only fetched once.&lt;/p&gt;
&lt;p&gt;For example, if you had a sidebar with twenty chat links, Next.js used to send a separate prefetch request per link. However, with the new behavior, it will only prefetch once &lt;em&gt;per route&lt;/em&gt;: a shell for the &lt;code&gt;/chat/[id]&lt;/code&gt; route, a shell for the &lt;code&gt;/dashboard&lt;/code&gt; route, and so on. Conceptually this is similar to how single-page apps download code with per-route code splitting.&lt;/p&gt;
&lt;figure&gt;&lt;div style=&quot;aspect-ratio:1280 / 720&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-after-light-v3.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-after-light-v3.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-after-light-v3.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;720&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-after-dark-v3.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-after-dark-v3.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fprefetch-after-dark-v3.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;In 16.3, Next.js prefetches a single loading shell per route, and reuses it
across links&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Because shells are reused across links, they&#39;re also a foundation for offline navigation. In a future release, we&#39;ll be exploring how prefetched routes could remain navigable when the network briefly disappears.&lt;/p&gt;
&lt;h3 id=&quot;enabling-partial-prefetching&quot; data-docs-heading=&quot;&quot;&gt;Enabling Partial Prefetching&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#enabling-partial-prefetching&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To try this new prefetching behavior, which we call Partial Prefetching, enable in your Next.js config:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { NextConfig } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; NextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  cacheComponents&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;highlighted-line line&quot; data-line=&quot;&quot; data-highlighted-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  partialPrefetching&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Like with &lt;code&gt;cacheComponents&lt;/code&gt;, we plan to make &lt;code&gt;partialPrefetching&lt;/code&gt; the default behavior in a future major release.&lt;/p&gt;
&lt;h3 id=&quot;inspecting-the-loading-shell&quot; data-docs-heading=&quot;&quot;&gt;Inspecting the loading shell&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#inspecting-the-loading-shell&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To make this more visual, we&#39;ve added a new Navigation Inspector to the Next.js DevTools.&lt;/p&gt;
&lt;p&gt;It lets you pause every navigation &lt;em&gt;at the shell&lt;/em&gt; so that you can see what gets prefetched for any route:&lt;/p&gt;
&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;2048&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsant-inspector-light.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsant-inspector-light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;2048&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsant-inspector-dark.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Finsant-inspector-dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;
&lt;p&gt;Then, when you click &quot;Resume&quot;, the navigation will show the completed page. This lets you see during development which part of your route can be displayed instantly, and which can only be displayed after the network hop.&lt;/p&gt;
&lt;p&gt;Like before, actual prefetching is only enabled in production.&lt;/p&gt;
&lt;h3 id=&quot;prefetching-more-than-a-shell&quot; data-docs-heading=&quot;&quot;&gt;Prefetching more than a shell&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#prefetching-more-than-a-shell&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With Partial Prefetching on, we&#39;ve reduced what Next.js prefetches by default.&lt;/p&gt;
&lt;p&gt;Instead of firing off a prefetch request for every link, Next.js will now only prefetch a reusable shell per each distinct route in the viewport (one for Chat page, one for Settings page, and so on), and cache them throughout the session.&lt;/p&gt;
&lt;p&gt;However, sometimes, you want to prefetch &lt;em&gt;more&lt;/em&gt; than the shell. For example, you might want a chat header to &quot;pop in&quot; instantly on a Chat page. To opt into per-link prefetching, you can add &lt;code&gt;&amp;lt;Link prefetch={true}&amp;gt;&lt;/code&gt; to some links.&lt;/p&gt;
&lt;p&gt;Note that even in that case, Next.js will not attempt to render the entire route all the way deep. Instead, it will render down to content that&#39;s available synchronously, known from the URL (like params or searchParams), or marked with &lt;code&gt;&#39;use cache&#39;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This means that you no longer have to make an &quot;all or nothing&quot; choice with prefetching. The instant shell gives you the baseline, and then &lt;code&gt;&amp;lt;Link prefetch={true}&amp;gt;&lt;/code&gt; with &lt;code&gt;&#39;use cache&#39;&lt;/code&gt; lets you add additional per-link prefetching that may include more content.&lt;/p&gt;
&lt;h3 id=&quot;weve-been-using-it-ourselves&quot; data-docs-heading=&quot;&quot;&gt;We&#39;ve been using it ourselves&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#weve-been-using-it-ourselves&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We&#39;ve been adopting these tools on &lt;a href=&quot;https://v0.app/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;v0&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; ahead of this release. v0 has lots of rich client features, but navigations had been falling short of feeling instant for a while.&lt;/p&gt;
&lt;p&gt;Instant Insights pointed us at the routes that weren&#39;t navigating instantly. Here&#39;s how navigations got faster once we started working through the fixes:&lt;/p&gt;
&lt;figure class=&quot;my-8&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1868&quot; height=&quot;712&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fv0-light.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fv0-light.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fv0-light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1868&quot; height=&quot;712&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fv0-dark.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fv0-dark.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-3-instant-navigations%2Fv0-dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;figcaption&gt;Navigation times in v0 (from click to route change)&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;We&#39;ll share the specific patterns we landed on in a follow-up post. We&#39;re also still optimizing the prefetching improvements described earlier, so we expect these numbers to get closer to zero.&lt;/p&gt;
&lt;h3 id=&quot;a-demo-to-poke-around&quot; data-docs-heading=&quot;&quot;&gt;A demo to poke around&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#a-demo-to-poke-around&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;If you&#39;d like to see these features in a smaller, open-source codebase, &lt;a href=&quot;https://next-beats.dev/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Next Beats&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; is a music player built on the Next.js 16.3 Preview, with its source &lt;a href=&quot;https://github.com/vercel-labs/next-beats&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;on GitHub&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;. Cache Components is enabled, and Partial Prefetching prefetches a single reusable shell per route on the client. The result is navigations that feel instant, the way they would in a single-page app.&lt;/p&gt;
&lt;h3 id=&quot;recap&quot; data-docs-heading=&quot;&quot;&gt;Recap&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#recap&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To sum up, we&#39;ve been working to let your app have Instant Navigations similar to a SPA:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you Stream with &lt;code&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt; or Cache with &lt;code&gt;&#39;use cache&#39;&lt;/code&gt;, navigations to your route will be instant.&lt;/li&gt;
&lt;li&gt;If you Block by &lt;code&gt;export const instant = false&lt;/code&gt;, you opt out of enforcing instant navigations to that route.&lt;/li&gt;
&lt;li&gt;Next.js automatically generates a reusable shell for every instant route, and only prefetches it once.&lt;/li&gt;
&lt;li&gt;You can use the &lt;code&gt;instant()&lt;/code&gt; test helper to avoid regressions, and Navigation Inspector to visually inspect shells.&lt;/li&gt;
&lt;li&gt;You can opt into a deeper per-link prefetching with &lt;code&gt;&amp;lt;Link prefetch&amp;gt;&lt;/code&gt; and &lt;code&gt;&#39;use cache&#39;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These changes are gated behind &lt;code&gt;cacheComponents: true&lt;/code&gt; and &lt;code&gt;partialPrefetching: true&lt;/code&gt; flags.&lt;/p&gt;
&lt;p&gt;With these changes, we are making the Next.js first-click navigation experience just as good as in single-page apps, but without giving up the benefits of the server-centric mental model and the overall performance that it allows.&lt;/p&gt;
&lt;h2 id=&quot;try-it-today&quot; data-docs-heading=&quot;&quot;&gt;Try it today&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#try-it-today&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To try out Instant Navigations for yourself, install the 16.3 Preview today:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@preview&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Check out &lt;a href=&quot;https://nextjs.org/docs/app/guides/instant-navigation&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the docs for Instant Navigations&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;We&#39;d love to hear any feedback you have &lt;a href=&quot;https://github.com/vercel/next.js/discussions/95130&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;on GitHub&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and we&#39;ll continue to publish updates to the &lt;code&gt;preview&lt;/code&gt; tag as we work towards a polished stable release.&lt;/p&gt;
&lt;h3 id=&quot;known-issues&quot; data-docs-heading=&quot;&quot;&gt;Known issues&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#known-issues&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;There are known issues in Preview that we&#39;re actively working on. These will be fixed prior to our stable release.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span class=&quot;inline-flex shrink-0 items-center justify-center rounded-full whitespace-nowrap py-0.5 font-medium capitalize tabular-nums **:data-[slot=icon]:block **:data-[slot=icon]:shrink-0 **:data-[slot=icon]:[-webkit-transform:translate(0px,0px)] h-5 px-2 gap-1 text-[11px]/[20px] tracking-[0.2px] **:data-[slot=icon]:size-3 **:data-[slot=icon]:-ml-0.5 **:data-[slot=icon]:data-[glyph=circular]:-ml-1 **:data-[slot=icon]:has-[[data-glyph=circular]]:-ml-1 relative bg-transparent before:inset-0 before:pointer-events-none before:absolute before:rounded-full before:content-[&amp;quot;&amp;quot;] dark-theme:before:mix-blend-screen before:mix-blend-multiply before:bg-[oklch(from_var(--ds-green-200)_0.94_calc(c*1.3)_h)] dark-theme:before:bg-[oklch(from_var(--ds-green-200)_0.27_calc(c*1.3)_h)] text-(--ds-green-900) mr-1 align-middle&quot;&gt;Fixed&lt;/span&gt; &lt;strong&gt;There are some cases where a blocking route won&#39;t get reported as an Instant Insight.&lt;/strong&gt; When Partial Prefetching is enabled, accessing params inside of a shell will cause a route to block, but this won&#39;t be reported as an Instant Insight. The Navigation Inspector and &lt;code&gt;instant()&lt;/code&gt; test helper are unaffected.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;There are some issues with the Instant Insights tooling in Safari.&lt;/strong&gt; In development, use Chrome or Firefox for best results.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check back here to see when these issues get resolved.&lt;/p&gt;
&lt;h2 id=&quot;feedback-and-community&quot; data-docs-heading=&quot;&quot;&gt;Feedback and Community&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-3-instant-navigations#feedback-and-community&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Share your feedback and help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/discord&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discord Community&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>https://nextjs.org/blog/next-16-3-instant-navigations</link><guid isPermaLink="false">https://nextjs.org/blog/next-16-3-instant-navigations</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js Across Platforms: Adapters, OpenNext, and Our Commitments</title><description>&lt;p&gt;Next.js 16.2 introduced a stable &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/adapterPath&quot;&gt;Adapter API&lt;/a&gt;, built in collaboration with &lt;a href=&quot;https://opennext.js.org/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;OpenNext&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, Netlify, Cloudflare, AWS Amplify, and Google Cloud. This post covers how that happened, and the commitments we&#39;re making to ensure Next.js works well on every platform:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/nextjs-across-platforms#the-adapter-api&quot;&gt;&lt;strong&gt;Adapter API (stable)&lt;/strong&gt;&lt;/a&gt;: A typed, versioned description of your application that any platform can target.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/nextjs-across-platforms#the-test-suite&quot;&gt;&lt;strong&gt;Test suite&lt;/strong&gt;&lt;/a&gt;: Shared correctness tests for every adapter, including Vercel&#39;s.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/nextjs-across-platforms#verified-adapters&quot;&gt;&lt;strong&gt;Verified adapters&lt;/strong&gt;&lt;/a&gt;: Open-source, community-owned adapters hosted under the Next.js organization.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/nextjs-across-platforms#the-ecosystem-working-group&quot;&gt;&lt;strong&gt;Ecosystem Working Group&lt;/strong&gt;&lt;/a&gt;: A standing forum for coordinating changes across providers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-we-got-here&quot; data-docs-heading=&quot;&quot;&gt;How we got here&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/nextjs-across-platforms#how-we-got-here&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Many Next.js apps are deployed as a single Node.js server running &lt;code&gt;next start&lt;/code&gt;. Hundreds of thousands of teams do this today across any number of platforms, without limitations.&lt;/p&gt;
&lt;p&gt;But scaling apps usually involves running multiple server instances. When you do, some things need to work correctly out of the box: cached content needs to stay synchronized across instances, on-demand revalidation needs to propagate, and streaming needs to work reliably. &lt;em&gt;These are functional requirements, not optimizations.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Then there are the performance choices you opt into: serving cached content from a global CDN, running compute at the edge, optimizing cold starts with serverless functions. Each of these adds architectural complexity on top of what already needs to be correct.&lt;/p&gt;
&lt;p&gt;Depending on the platform and architecture, the full surface area adds up: streaming, Server Components, Partial Prerendering, middleware, Cache Components, on-demand revalidation. Each capability and how they interact with one another was never formally documented. For platform providers looking to support Next.js at full fidelity in a multi-tenant environment across evolving releases, these challenges compounded:&lt;/p&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;When the Next.js team reached out with an offer to discuss Netlify&#39;s challenges, we started compiling a laundry list of specific issues to share, but it quickly became clear that the common thread among 90% of these was simply the lack of a documented, stable mechanism to configure and read build output. That was what we needed above all. So that&#39;s what we told Jimmy, and we&#39;re glad we did.&lt;/p&gt;
&lt;p&gt;— Philippe Serhal, Engineer at Netlify&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The missing piece was an &lt;strong&gt;upstream, stable, public contract&lt;/strong&gt; that providers could build against.&lt;/p&gt;
&lt;h2 id=&quot;opennext-built-the-bridge&quot; data-docs-heading=&quot;&quot;&gt;OpenNext built the bridge&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/nextjs-across-platforms#opennext-built-the-bridge&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://opennext.js.org/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;OpenNext&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; filled that gap. It translated Next.js build output into something providers could consume, mapping framework semantics onto each provider&#39;s primitives. What started as a compatibility layer became an &lt;strong&gt;early production-grade adapter&lt;/strong&gt;, especially on AWS, with Cloudflare and Netlify joining the effort later. OpenNext showed that Next.js build output can serve as a stable, defined interface that adapters target directly.&lt;/p&gt;
&lt;p&gt;That insight led to a broader collaboration between the Next.js team and the OpenNext maintainers, along with engineers from Netlify, Cloudflare, AWS Amplify, and Google Cloud. We published a &lt;a href=&quot;https://github.com/vercel/next.js/discussions/77740&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Build Adapters RFC&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; in April 2025, formed a working group, and have been working together with these partners since then to design, test, and validate the API.&lt;/p&gt;
&lt;h2 id=&quot;the-adapter-api&quot; data-docs-heading=&quot;&quot;&gt;The Adapter API&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/nextjs-across-platforms#the-adapter-api&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js 16.2 ships with a stable, public &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/adapterPath&quot;&gt;Adapter API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On build, Next.js now produces a typed, versioned description of your application: routes, prerenders, static assets, runtime targets, dependencies, caching rules, and routing decisions. The adapter consumes this output and maps it onto a provider&#39;s infrastructure.&lt;/p&gt;
&lt;p&gt;Adapters implement two hooks: &lt;code&gt;modifyConfig&lt;/code&gt; (when configuration loads) and &lt;code&gt;onBuildComplete&lt;/code&gt; (when the full output is available). Breaking changes require a new major version of Next.js.&lt;/p&gt;
&lt;p&gt;Vercel&#39;s adapter uses this same public contract, with no private hooks or special integration path. It is &lt;a href=&quot;https://github.com/nextjs/adapter-vercel&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;open source&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As part of the working group&#39;s feedback, we have also reworked large sections of our documentation to better explain the platform integration surface. New guides cover the &lt;a href=&quot;https://nextjs.org/docs/app/guides/rendering-philosophy&quot;&gt;Rendering Philosophy&lt;/a&gt;, the &lt;a href=&quot;https://nextjs.org/docs/app/guides/deploying-to-platforms&quot;&gt;Deploying to Platforms&lt;/a&gt; feature matrix, &lt;a href=&quot;https://nextjs.org/docs/app/guides/ppr-platform-guide&quot;&gt;PPR Platform Guide&lt;/a&gt;, &lt;a href=&quot;https://nextjs.org/docs/app/guides/how-revalidation-works&quot;&gt;How Revalidation Works&lt;/a&gt;, and &lt;a href=&quot;https://nextjs.org/docs/app/guides/cdn-caching&quot;&gt;CDN Caching&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;the-test-suite&quot; data-docs-heading=&quot;&quot;&gt;The test suite&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/nextjs-across-platforms#the-test-suite&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We have made the Next.js test suite available for adapter authors. It covers streaming behavior, caching interactions, client navigation, and real-world edge cases. When a new feature ships, its behavior is encoded in these tests.&lt;/p&gt;
&lt;p&gt;You can read more in the &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/adapterPath#testing-adapters&quot;&gt;adapter testing documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Adapter authors can run the suite using any adapter and get a pass/fail answer for each feature. This is the same test suite Vercel uses for its own adapter, so the correctness bar is shared across all providers.&lt;/p&gt;
&lt;h2 id=&quot;verified-adapters&quot; data-docs-heading=&quot;&quot;&gt;Verified adapters&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/nextjs-across-platforms#verified-adapters&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To become a &lt;strong&gt;verified adapter&lt;/strong&gt; (hosted under the &lt;a href=&quot;https://github.com/nextjs&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Next.js GitHub organization&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; and listed in the &lt;a href=&quot;https://nextjs.org/docs/app/guides/deploying-to-platforms&quot;&gt;Deploying to Platforms&lt;/a&gt; docs), two things are required: it must be open source and pass the full test suite. By making the adapter open source it ensures there is a place for the maintenance of the adapter, so that issues can be reported and triaged. The test suite ensures the adapter&#39;s compatibility with Next.js can be measured.&lt;/p&gt;
&lt;p&gt;Each verified adapter is owned by the team that builds it. Publishing rights, release cadence, and implementation decisions are theirs, because platforms can be very different and we can&#39;t prescribe a specific implementation.&lt;/p&gt;
&lt;p&gt;Providers can also build and ship closed-source adapters on the same public API.&lt;/p&gt;
&lt;p&gt;The public Adapters API ships today with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/nextjs/adapter-vercel&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Vercel adapter&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: open source, maps Next.js output to Vercel&#39;s serverless and CDN infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/nextjs/adapter-bun&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Bun adapter&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: a reference adapter showing how to build a complete Next.js deployment target on an alternative runtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adapters for &lt;strong&gt;Netlify&lt;/strong&gt;, &lt;strong&gt;Cloudflare&lt;/strong&gt;, and &lt;strong&gt;AWS&lt;/strong&gt; through OpenNext are in active development, with expected releases later this year.&lt;/p&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;Cloudflare has been part of OpenNext since the beginning because we believed developers deserve a stable, open contract for deploying Next.js apps anywhere. The official Next.js Adapter API makes that vision real. Developers running Next.js on Cloudflare&#39;s global developer platform will now have a shared foundation to build on, one designed in collaboration with the Next.js team to keep pace as the framework evolves. We are excited to be partners in this shared effort.&lt;/p&gt;
&lt;p&gt;— Fred K Schott, Engineer at Cloudflare&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;the-ecosystem-working-group&quot; data-docs-heading=&quot;&quot;&gt;The ecosystem working group&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/nextjs-across-platforms#the-ecosystem-working-group&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We are establishing the &lt;a href=&quot;https://nextjs.org/ecosystem-working-group&quot;&gt;Next.js Ecosystem Working Group&lt;/a&gt;, a standing forum between the Next.js team, hosting providers, and adapter maintainers. Meeting notes will be public. If you want to join the group, please reach out to &lt;a href=&quot;https://x.com/feedthejim&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jimmy&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We want providers to have early visibility into upcoming changes, not find out after a release. Breaking changes come with lead time proportional to their scope. New features are tested across environments before release. The full &lt;a href=&quot;https://nextjs.org/ecosystem-working-group&quot;&gt;governance document&lt;/a&gt; covers the commitments in detail.&lt;/p&gt;
&lt;p&gt;Read more from our partners:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.netlify.com/blog/the-next-js-adapter-api-just-shipped-here-s-what-comes-next&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;The Next.js Adapter API Just Shipped: Here&#39;s What Comes Next&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; (Netlify)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opennext.js.org/news/2026-03-25-3-years-of-opennext&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;3 Years of OpenNext&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; (OpenNext)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://firebase.blog/posts/2026/03/nextjs-adapters&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Next.js Deployment Adapters: A Bright Future for Next.js on Google Cloud&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; (Google Cloud / Firebase)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;The collaboration between OpenNext and the Next.js team transformed a community-driven workaround into an official standard, proving that the future of web frameworks is built on openness and shared innovation.&lt;/p&gt;
&lt;p&gt;— Dorseuil Nicolas, OpenNext&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thank you to the members of the Build Adapters working group: engineers at Netlify, Cloudflare, Google Cloud, AWS Amplify, and OpenNext who invested their time co-designing this API and validating it for their platforms. Thank you to every contributor who built adapters, filed bugs, and shipped workarounds.&lt;/p&gt;
&lt;p&gt;Next.js is used by millions of developers, and many of them run on infrastructure that isn&#39;t Vercel. They deserve the same level of reliability and the same access to new features. The Adapter API provides that: a shared contract that any platform can build on, with a public test suite that holds everyone, including us, to the same standard.&lt;/p&gt;
&lt;p&gt;Every new feature we develop will be documented in the adapter contract. The RFC process remains open, coordinated with adapter authors as the API evolves.&lt;/p&gt;
&lt;h2 id=&quot;learn-more&quot; data-docs-heading=&quot;&quot;&gt;Learn more&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/nextjs-across-platforms#learn-more&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/adapterPath&quot;&gt;Adapter API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/app/guides/deploying-to-platforms&quot;&gt;Deploying to Platforms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/app/guides/rendering-philosophy&quot;&gt;Rendering Philosophy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/app/guides/ppr-platform-guide&quot;&gt;PPR Platform Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/app/guides/how-revalidation-works&quot;&gt;How Revalidation Works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/docs/app/guides/cdn-caching&quot;&gt;CDN Caching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions/77740&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Build Adapters RFC&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nextjs/adapter-vercel&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Vercel adapter&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/ecosystem-working-group&quot;&gt;Next.js Ecosystem Working Group&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opennext.js.org/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;OpenNext&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>https://nextjs.org/blog/nextjs-across-platforms</link><guid isPermaLink="false">https://nextjs.org/blog/nextjs-across-platforms</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js 16.2: AI Improvements</title><description>&lt;p&gt;Next.js 16.2 includes several improvements designed for AI-assisted development. These changes make it easier for agents to understand your project, debug issues from the terminal, and inspect running apps — all without requiring a browser.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-ai#ai-ready-project-setup&quot;&gt;&lt;strong&gt;Agent-ready &lt;code&gt;create-next-app&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: Scaffold AI-ready projects out of the box&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-ai#browser-log-forwarding&quot;&gt;&lt;strong&gt;Browser Log Forwarding&lt;/strong&gt;&lt;/a&gt;: Forward browser errors to the terminal for agent-powered debugging&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-ai#dev-server-lock-file&quot;&gt;&lt;strong&gt;Dev Server Lock File&lt;/strong&gt;&lt;/a&gt;: Actionable error messages when a second dev server tries to start&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-ai#experimental-agent-devtools&quot;&gt;&lt;strong&gt;Experimental Agent DevTools&lt;/strong&gt;&lt;/a&gt;: Give AI agents terminal access to React DevTools and Next.js diagnostics&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;agent-ready-create-next-app&quot; data-docs-heading=&quot;&quot;&gt;Agent-ready &lt;code&gt;create-next-app&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-ai#agent-ready-create-next-app&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;create-next-app&lt;/code&gt; now includes an &lt;code&gt;AGENTS.md&lt;/code&gt; file by default, giving AI coding agents access to version-matched Next.js documentation from the start of your project.&lt;/p&gt;
&lt;p&gt;This builds on our &lt;a href=&quot;https://vercel.com/blog/agents-md-outperforms-skills-in-our-agent-evals&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;research into &lt;code&gt;AGENTS.md&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, which found that giving agents access to bundled documentation achieved a 100% pass rate on Next.js evals — outperforming skill-based approaches that maxed out at 79%. The key insight: always-available context works better than on-demand retrieval, because agents often fail to recognize when they should search for documentation.&lt;/p&gt;
&lt;div class=&quot;gap-3 rounded-md relative box-border flex w-full flex-wrap items-center border break-words [&amp;amp;_a:not([data-geist-button])]:font-medium [&amp;amp;_a:not([data-geist-button])]:underline-offset-2 [&amp;amp;_a:not([data-geist-button]):hover]:underline [&amp;amp;_a:not([data-geist-button]):focus-visible]:rounded-[2px] [&amp;amp;_a:not([data-geist-button]):focus-visible]:shadow-(--ds-focus-ring) [&amp;amp;_a:not([data-geist-button]):focus-visible]:outline-none border-gray-alpha-400 text-gray-alpha-900 selection:bg-gray-alpha-900 dark-theme:selection:text-gray-1000 [&amp;amp;_a:not([data-geist-button])]:text-gray-1000 px-3 py-1.5 min-h-(--ds-size-medium) text-copy-14&quot; data-slot=&quot;note&quot; role=&quot;note&quot;&gt;&lt;div class=&quot;min-w-0 gap-3 flex flex-1 items-start&quot; data-slot=&quot;note-body&quot;&gt;&lt;span class=&quot;flex shrink-0 [&amp;amp;&gt;svg]:h-[1lh]&quot; data-slot=&quot;note-icon&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;14&quot; width=&quot;14&quot; data-slot=&quot;geist-icon&quot; data-glyph=&quot;circular&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8 14.5a6.5 6.5 0 1 0 0-13 6.5 6.5 0 0 0 0 13M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16M6.25 7h1.5a1 1 0 0 1 1 1v4.25h-1.5V8.5h-1zM8 6a1 1 0 1 0 0-2 1 1 0 0 0 0 2&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;min-w-0 flex-1 not-prose&quot; data-slot=&quot;note-content&quot;&gt;&lt;p&gt;The &lt;code&gt;AGENTS.md&lt;/code&gt; file is a short directive that tells agents to read the docs bundled at &lt;code&gt;node_modules/next/dist/docs/&lt;/code&gt; before writing any code. The Next.js npm package now includes the full documentation as plain Markdown files, giving agents accurate version-matched references locally without fetching external data.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For existing projects, the setup depends on your Next.js version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On 16.2 or later&lt;/strong&gt;, the docs are already bundled in the &lt;code&gt;next&lt;/code&gt; package. Add these two files to the root of your project:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M9.18 0a1 1 0 0 1 .61.3l4.42 4.4a1 1 0 0 1 .29.71v8.09A2.5 2.5 0 0 1 12 16H4a2.5 2.5 0 0 1-2.5-2.5V0h7.69M3 13.5a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V5.62L8.88 1.5H3z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;AGENTS.md&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;&amp;lt;!-- BEGIN:nextjs-agent-rules --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text);font-weight:bold&quot;&gt;# Next.js: ALWAYS read docs before coding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;Before any Next.js work, find and read the relevant doc in &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt;`node_modules/next/dist/docs/`&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;. Your training data is outdated — the docs are the source of truth.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;&amp;lt;!-- END:nextjs-agent-rules --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The comment markers delimit the Next.js-managed section. You can add your own project-specific instructions outside them — future updates will only replace content between the markers.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; is the instruction file for &lt;a href=&quot;https://docs.anthropic.com/en/docs/claude-code&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Claude Code&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;. The &lt;code&gt;@&lt;/code&gt; directive tells it to include &lt;code&gt;AGENTS.md&lt;/code&gt; as additional context:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M9.18 0a1 1 0 0 1 .61.3l4.42 4.4a1 1 0 0 1 .29.71v8.09A2.5 2.5 0 0 1 12 16H4a2.5 2.5 0 0 1-2.5-2.5V0h7.69M3 13.5a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V5.62L8.88 1.5H3z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;CLAUDE.md&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;@AGENTS.md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;On earlier versions&lt;/strong&gt;, use the codemod to generate these files automatically:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; @next/codemod@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; agents-md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For more details, see the &lt;a href=&quot;https://nextjs.org/docs/app/guides/ai-agents#existing-projects&quot;&gt;AI agents setup guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;browser-log-forwarding&quot; data-docs-heading=&quot;&quot;&gt;Browser Log Forwarding&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-ai#browser-log-forwarding&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js now forwards browser errors to the terminal by default during development, so you can see client-side errors without switching to the browser console. This is especially helpful for AI agents that operate primarily through the terminal and can&#39;t access a browser console.&lt;/p&gt;
&lt;p&gt;By default, only errors are forwarded to the terminal. You can control the level of forwarding with &lt;code&gt;logging.browserToTerminal&lt;/code&gt; in your &lt;code&gt;next.config.ts&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  logging&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    browserToTerminal&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // &#39;error&#39; — errors only (default)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // &#39;warn&#39;  — warnings and errors&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // true    — all console output&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // false   — disabled&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;dev-server-lock-file&quot; data-docs-heading=&quot;&quot;&gt;Dev Server Lock File&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-ai#dev-server-lock-file&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js now writes the running dev server&#39;s PID, port, and URL into the &lt;code&gt;.next/dev/lock&lt;/code&gt; file. When a second &lt;code&gt;next dev&lt;/code&gt; process starts in the same project directory, Next.js reads the lock file and prints an actionable error:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;Error:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Another&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; dev&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; server&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; already&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; running.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Local:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt;        http://localhost:3000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; PID:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;          12345&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Dir:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt;          /path/to/project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Log:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt;          .next/dev/logs/next-development.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;Run&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; kill&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 12345&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; stop&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; it.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is especially useful for AI coding agents, which frequently attempt to start &lt;code&gt;next dev&lt;/code&gt; without knowing a server is already running. The structured error gives the agent the PID to kill the existing process or the URL to connect to it — no manual intervention required.&lt;/p&gt;
&lt;p&gt;The lock file also prevents two &lt;code&gt;next build&lt;/code&gt; processes from running simultaneously, which could otherwise corrupt build artifacts.&lt;/p&gt;
&lt;h2 id=&quot;experimental-agent-devtools&quot; data-docs-heading=&quot;&quot;&gt;Experimental Agent DevTools&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-ai#experimental-agent-devtools&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The features above help agents understand your project and debug issues. &lt;a href=&quot;https://github.com/vercel-labs/next-browser&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;@vercel/next-browser&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; extends this by letting agents inspect a running Next.js application.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;next-browser&lt;/code&gt; is an experimental CLI that exposes browser-level data — screenshots, network requests, console logs — along with framework-specific insights from React DevTools and the Next.js dev overlay, like component trees, props, hooks, &lt;a href=&quot;https://nextjs.org/docs/app/getting-started/cache-components&quot;&gt;Partial Prerendering (PPR)&lt;/a&gt; shells, and errors. All returned as structured text via shell commands.&lt;/p&gt;
&lt;p&gt;An LLM can&#39;t read a DevTools panel, but it can run &lt;code&gt;next-browser tree&lt;/code&gt;, parse the output, and decide what to inspect next. Each command is a one-shot request against a persistent browser session, so agents can query the app repeatedly without managing browser state. This turns the browser into something an agent can reason about, instead of a UI it can&#39;t access.&lt;/p&gt;
&lt;h3 id=&quot;what-it-can-do-today&quot; data-docs-heading=&quot;&quot;&gt;What it can do today&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-ai#what-it-can-do-today&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The feature set is evolving quickly. As of this release, &lt;code&gt;next-browser&lt;/code&gt; supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Inspect React component trees&lt;/strong&gt; — view props, hooks, state, and source-mapped file locations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analyze PPR shells&lt;/strong&gt; — identify static vs dynamic regions and blocked &lt;a href=&quot;https://nextjs.org/docs/app/glossary#suspense-boundary&quot;&gt;Suspense boundaries&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access errors and logs&lt;/strong&gt; — retrieve build and runtime issues from the dev server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor network activity&lt;/strong&gt; — track requests since navigation, including server actions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Capture visuals&lt;/strong&gt; — take screenshots or record loading filmstrips&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;getting-started&quot; data-docs-heading=&quot;&quot;&gt;Getting started&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-ai#getting-started&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Install it as a &lt;a href=&quot;https://skills.sh/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;skill&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; (a reusable capability for AI agents):&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; skills&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; vercel-labs/next-browser&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then type &lt;code&gt;/next-browser&lt;/code&gt; in Claude Code, Cursor, or any AI agent that supports skills. The CLI manages a Chromium instance with React DevTools pre-loaded — no browser configuration required.&lt;/p&gt;
&lt;h3 id=&quot;example-growing-the-static-shell&quot; data-docs-heading=&quot;&quot;&gt;Example: Growing the static shell&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-ai#example-growing-the-static-shell&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;With &lt;a href=&quot;https://nextjs.org/docs/app/getting-started/cache-components&quot;&gt;Partial Prerendering (PPR)&lt;/a&gt;, Next.js can serve a &lt;a href=&quot;https://nextjs.org/docs/app/glossary#static-shell&quot;&gt;static shell&lt;/a&gt; instantly from the edge — the parts of your page that don&#39;t depend on per-request data — then stream in the rest. The more content that fits in the static shell, the faster users see a meaningful page.&lt;/p&gt;
&lt;p&gt;In practice, a single per-request fetch can accidentally make an entire page dynamic. Consider a blog post with a visitor counter:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;app/blog/[slug]/page.tsx&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; generateStaticParams&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; posts&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; getAllPosts&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; posts&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.map&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;((post) &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; ({ slug&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; post&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.slug }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; BlogPost&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;({ params }) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; post&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; getPost&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;params&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.slug);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; views&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; getVisitorCount&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;params&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.slug); &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// per-request&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;article&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.title}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;{views} views&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.content}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;article&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Every slug is enumerated in &lt;code&gt;generateStaticParams&lt;/code&gt;, so the post content could be prerendered at build time. But &lt;code&gt;getVisitorCount&lt;/code&gt; runs on every request — and because it sits at the top level of the component, it makes the &lt;em&gt;entire page&lt;/em&gt; dynamic. As a result, the entire page waits behind a loading skeleton instead of streaming in progressively.&lt;/p&gt;
&lt;p&gt;An agent can use &lt;code&gt;next-browser&lt;/code&gt; to diagnose this. Locking PPR mode shows only the static shell — in this case, the &lt;code&gt;app/blog/[slug]/loading.tsx&lt;/code&gt; skeleton, because nothing in the page made it into the shell:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next-browser&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; ppr&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; lock&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;          # Enter PPR mode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next-browser&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; goto&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; /blog/hello&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  # The entire page is a loading skeleton&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;flex justify-center&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;360&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_before_light.png&amp;amp;w=640&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_before_light.png&amp;amp;w=1920&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_before_light.png&amp;amp;w=1920&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;360&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_before_dark.png&amp;amp;w=640&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_before_dark.png&amp;amp;w=1920&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_before_dark.png&amp;amp;w=1920&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The agent then runs &lt;code&gt;ppr unlock&lt;/code&gt; to find out what went wrong:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next-browser&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; ppr&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; unlock&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# PPR Shell Analysis&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# 1 dynamic hole, 1 static&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;blocked&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; by:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;  -&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; getVisitorCount&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (server-fetch)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;    owner:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; BlogPost&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; at&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; app/blog/[slug]/page.tsx:5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;    next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; step:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Push&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; the&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; into&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; smaller&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Suspense&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; leaf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The report tells the agent exactly what to do: &lt;code&gt;getVisitorCount&lt;/code&gt; is the blocker, it lives in &lt;code&gt;BlogPost&lt;/code&gt;, and the fix is to push it into its own &lt;a href=&quot;https://nextjs.org/docs/app/glossary#suspense-boundary&quot;&gt;Suspense boundary&lt;/a&gt;. The agent wraps just the counter:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;app/blog/[slug]/page.tsx&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; BlogPost&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;({ params }) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; post&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; getPost&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;params&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.slug);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;article&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.title}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Suspense&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; fallback&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;{&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;— views&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;}&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;VisitorCount&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; slug&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;params&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.slug} /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Suspense&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;post&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.content}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;article&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Running &lt;code&gt;ppr lock&lt;/code&gt; again confirms the shell grew — the post content now prerenders instantly. Only the visitor count shows a fallback:&lt;/p&gt;
&lt;div class=&quot;flex justify-center&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;360&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_after_light.png&amp;amp;w=640&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_after_light.png&amp;amp;w=1920&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_after_light.png&amp;amp;w=1920&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;360&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_after_dark.png&amp;amp;w=640&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_after_dark.png&amp;amp;w=1920&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2-ai%2Fppr_after_dark.png&amp;amp;w=1920&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;next-browser&lt;/code&gt; is still evolving, but it points toward a future where agents can debug and optimize apps with the same visibility as a developer.&lt;/p&gt;
&lt;h2 id=&quot;feedback-and-community&quot; data-docs-heading=&quot;&quot;&gt;Feedback and Community&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-ai#feedback-and-community&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Share your feedback and help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/discord&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discord Community&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>https://nextjs.org/blog/next-16-2-ai</link><guid isPermaLink="false">https://nextjs.org/blog/next-16-2-ai</guid><pubDate>Invalid Date</pubDate></item><item><title>Turbopack: What&#39;s New in Next.js 16.2</title><description>&lt;p&gt;Two releases after Turbopack became the default bundler for Next.js, we&#39;re focused on improving performance, fixing bugs, and increasing parity.
Here are some of the latest features shipping as part of &lt;a href=&quot;https://nextjs.org/blog/next-16-2&quot;&gt;Next.js 16.2&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-turbopack#server-fast-refresh&quot;&gt;&lt;strong&gt;Server Fast Refresh&lt;/strong&gt;&lt;/a&gt;: Fine-grained server-side hot reloading&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-turbopack#web-worker-origin&quot;&gt;&lt;strong&gt;Web Worker Origin&lt;/strong&gt;&lt;/a&gt;: Increasing support for WASM libraries in Workers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-turbopack#subresource-integrity-support&quot;&gt;&lt;strong&gt;Subresource Integrity Support&lt;/strong&gt;&lt;/a&gt;: Subresource Integrity for JavaScript files&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-turbopack#tree-shaking-of-dynamic-imports&quot;&gt;&lt;strong&gt;Tree Shaking of Dynamic Imports&lt;/strong&gt;&lt;/a&gt;: Unused exports removed from dynamic &lt;code&gt;import()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-turbopack#inline-loader-configuration&quot;&gt;&lt;strong&gt;Inline Loader Configuration&lt;/strong&gt;&lt;/a&gt;: Per-import loader configuration via import attributes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-turbopack#lightning-css-configuration&quot;&gt;&lt;strong&gt;Lightning CSS Configuration&lt;/strong&gt;&lt;/a&gt;: Experimental LightningCSS configuration options&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-turbopack#log-filtering&quot;&gt;&lt;strong&gt;Log Filtering&lt;/strong&gt;&lt;/a&gt;: Suppressing noisy logs and warnings with &lt;code&gt;ignoreIssue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-turbopack#postcssconfigts-support&quot;&gt;&lt;strong&gt;&lt;code&gt;postcss.config.ts&lt;/code&gt; Support&lt;/strong&gt;&lt;/a&gt;: TypeScript PostCSS configuration&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-turbopack#performance-improvements-and-bug-fixes&quot;&gt;&lt;strong&gt;Performance Improvements and Bug Fixes&lt;/strong&gt;&lt;/a&gt;: Over 200 changes and bug fixes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking forward towards our next release, we&#39;ll be focused on speeding up compiler performance and reducing memory usage.&lt;/p&gt;
&lt;h2 id=&quot;server-fast-refresh&quot; data-docs-heading=&quot;&quot;&gt;Server Fast Refresh&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-turbopack#server-fast-refresh&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We&#39;ve reworked how server-side code is reloaded during development. The previous system cleared the &lt;code&gt;require.cache&lt;/code&gt; for the changed module and all other modules in its import chain. This approach often reloaded more code than necessary, including unchanged &lt;code&gt;node_modules&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The new system brings the same Fast Refresh approach used in the browser to your server code. Turbopack&#39;s knowledge of the module graph means only the module that actually changed is reloaded, leaving the rest intact. This makes server-side hot reloading significantly more efficient.&lt;/p&gt;
&lt;p&gt;In real-world Next.js applications, we&#39;ve seen 67-100% faster application refresh and 400-900% faster compile time inside Next.js. These results scale from the smallest &quot;hello world&quot; starter project to large sites like &lt;code&gt;vercel.com&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;not-prose my-8 rounded-lg border border-[var(--ds-gray-400)] overflow-hidden&quot; role=&quot;figure&quot; aria-label=&quot;Server Fast Refresh time comparison showing improvements&quot;&gt;&lt;div class=&quot;py-0 pr-3 pl-4 rounded-t-md border-b border-[var(--ds-gray-400)] h-10 flex items-center justify-between bg-[var(--ds-background-200)]&quot;&gt;&lt;span class=&quot;text-sm font-medium text-[var(--ds-gray-1000)]&quot;&gt;&lt;p&gt;Server refresh time on a sample Next.js site&lt;/p&gt;&lt;/span&gt;&lt;span class=&quot;text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;&lt;p&gt;375% faster&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;p-4 flex flex-col gap-3 bg-[var(--ds-background-100)]&quot;&gt;&lt;div class=&quot;flex flex-col gap-2&quot; role=&quot;group&quot; aria-label=&quot;Server refresh time comparison&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;text-xs text-[var(--ds-gray-900)] w-12 shrink-0&quot;&gt;&lt;p&gt;Before&lt;/p&gt;&lt;/span&gt;&lt;div class=&quot;flex-1 bg-[var(--ds-gray-200)] rounded h-7 overflow-hidden&quot;&gt;&lt;div class=&quot;h-full flex gap-px&quot;&gt;&lt;div class=&quot;bg-[var(--ds-gray-900)] h-full flex items-center justify-center&quot; style=&quot;flex:40 0 0&quot;&gt;&lt;span class=&quot;text-xs font-medium text-white hidden sm:inline&quot;&gt;&lt;p&gt;40ms&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;bg-[var(--ds-gray-600)] h-full flex items-center justify-center&quot; style=&quot;flex:19 0 0&quot;&gt;&lt;span class=&quot;text-xs font-medium text-white hidden sm:inline&quot;&gt;&lt;p&gt;19ms&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right&quot;&gt;&lt;p&gt;59ms&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;text-xs text-[var(--ds-gray-900)] w-12 shrink-0&quot;&gt;&lt;p&gt;After&lt;/p&gt;&lt;/span&gt;&lt;div class=&quot;flex-1 bg-[var(--ds-gray-200)] rounded h-7 overflow-hidden&quot;&gt;&lt;div class=&quot;h-full flex gap-px&quot; style=&quot;width:max(21%, 150px)&quot;&gt;&lt;div class=&quot;h-full flex items-center justify-center&quot; style=&quot;flex:2.7 0 0;background-color:var(--ds-blue-900)&quot;&gt;&lt;span class=&quot;text-xs font-medium text-white hidden sm:inline&quot;&gt;&lt;p&gt;2.7ms&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;h-full flex items-center justify-center&quot; style=&quot;flex:9.7 0 0;background-color:var(--ds-blue-700)&quot;&gt;&lt;span class=&quot;text-xs font-medium text-white hidden sm:inline&quot;&gt;&lt;p&gt;9.7ms&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;text-xs font-medium text-[var(--ds-gray-1000)] w-12 shrink-0 text-right&quot;&gt;&lt;p&gt;12.4ms&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-wrap items-center gap-x-4 gap-y-1 border-t border-[var(--ds-gray-400)] pt-3&quot;&gt;&lt;div class=&quot;flex items-center gap-1.5&quot;&gt;&lt;div class=&quot;w-2.5 h-2.5 rounded-sm bg-[var(--ds-gray-900)]&quot;&gt;&lt;/div&gt;&lt;span class=&quot;text-xs text-[var(--ds-gray-900)]&quot;&gt;&lt;p&gt;Next.js (40ms → 2.7ms)&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-1.5&quot;&gt;&lt;div class=&quot;w-2.5 h-2.5 rounded-sm bg-[var(--ds-gray-600)]&quot;&gt;&lt;/div&gt;&lt;span class=&quot;text-xs text-[var(--ds-gray-900)]&quot;&gt;&lt;p&gt;Application (19ms → 9.7ms)&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Today we&#39;re enabling this feature for all developers, by default. &lt;a href=&quot;https://nextjs.org/docs/app/getting-started/proxy&quot;&gt;Proxy&lt;/a&gt; and &lt;a href=&quot;https://nextjs.org/docs/app/getting-started/route-handlers&quot;&gt;Route Handlers&lt;/a&gt; will use the existing system today, but support for those is arriving in a future release. Share your feedback or any issues with this new feature on &lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;web-worker-origin&quot; data-docs-heading=&quot;&quot;&gt;Web Worker Origin&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-turbopack#web-worker-origin&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Previously, Web Workers were bootstrapped through a &lt;code&gt;blob://&lt;/code&gt; URL. This streamlined loading the worker, but it set an empty &lt;code&gt;location.origin&lt;/code&gt; value. Web Worker code that tried to use &lt;code&gt;importScripts()&lt;/code&gt; or &lt;code&gt;fetch()&lt;/code&gt; (usually in third-party libraries) would have been unable to resolve the request without changes.&lt;/p&gt;
&lt;p&gt;With the updated Worker bootstrap code, the &lt;code&gt;origin&lt;/code&gt; correctly points to your domain name, and relative fetches succeed. This should unblock anyone who had trouble running WASM code inside a Worker in previous versions.&lt;/p&gt;
&lt;h2 id=&quot;subresource-integrity-support&quot; data-docs-heading=&quot;&quot;&gt;Subresource Integrity Support&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-turbopack#subresource-integrity-support&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Turbopack now supports &lt;a href=&quot;https://nextjs.org/docs/app/guides/content-security-policy#enabling-sri&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Subresource Integrity (SRI)&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;. SRI generates cryptographic hashes of your JavaScript files at build time, allowing browsers to verify that files haven&#39;t been modified.&lt;/p&gt;
&lt;p&gt;Browsers provide a technology called Content Security Policy that allows sites to restrict the JavaScript that can run, eliminating entire classes of security issues. However, the typical &lt;code&gt;nonce&lt;/code&gt;-based method for implementing this requires all pages to be dynamically rendered, impacting performance. Subresource Integrity is an alternative that computes a hash of each script ahead of time, and only allows the browser to execute scripts with approved hashes.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg height=&quot;17&quot; style=&quot;margin-left:-1.5px&quot; viewBox=&quot;0 0 50 50&quot; width=&quot;17&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M 43.335938 4 L 6.667969 4 C 5.195313 4 4 5.195313 4 6.667969 L 4 43.332031 C 4 44.804688 5.195313 46 6.667969 46 L 43.332031 46 C 44.804688 46 46 44.804688 46 43.335938 L 46 6.667969 C 46 5.195313 44.804688 4 43.335938 4 Z M 27 36.183594 C 27 40.179688 24.65625 42 21.234375 42 C 18.140625 42 15.910156 39.925781 15 38 L 18.144531 36.097656 C 18.75 37.171875 19.671875 38 21 38 C 22.269531 38 23 37.503906 23 35.574219 L 23 23 L 27 23 Z M 35.675781 42 C 32.132813 42 30.121094 40.214844 29 38 L 32 36 C 32.816406 37.335938 33.707031 38.613281 35.589844 38.613281 C 37.171875 38.613281 38 37.824219 38 36.730469 C 38 35.425781 37.140625 34.960938 35.402344 34.199219 L 34.449219 33.789063 C 31.695313 32.617188 29.863281 31.148438 29.863281 28.039063 C 29.863281 25.179688 32.046875 23 35.453125 23 C 37.878906 23 39.621094 23.84375 40.878906 26.054688 L 37.910156 27.964844 C 37.253906 26.789063 36.550781 26.328125 35.453125 26.328125 C 34.335938 26.328125 33.628906 27.039063 33.628906 27.964844 C 33.628906 29.109375 34.335938 29.570313 35.972656 30.28125 L 36.925781 30.691406 C 40.171875 32.078125 42 33.496094 42 36.683594 C 42 40.117188 39.300781 42 35.675781 42 Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.js&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    sri&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      algorithm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;sha256&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;exports&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;tree-shaking-of-dynamic-imports&quot; data-docs-heading=&quot;&quot;&gt;Tree Shaking of Dynamic Imports&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-turbopack#tree-shaking-of-dynamic-imports&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Turbopack now tree shakes destructured dynamic imports the same way it does static imports. Unused exports are removed from the bundle:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;cat&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;./lib&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is now equivalent to a static import for tree shaking purposes — any exports from &lt;code&gt;./lib&lt;/code&gt; that aren&#39;t used will be tree-shaken.&lt;/p&gt;
&lt;h2 id=&quot;inline-loader-configuration&quot; data-docs-heading=&quot;&quot;&gt;Inline Loader Configuration&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-turbopack#inline-loader-configuration&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Turbopack now supports per-import loader configuration via &lt;a href=&quot;https://github.com/vercel/next.js/pull/89644&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;import attributes&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;. Instead of applying loaders globally through &lt;code&gt;turbopack.rules&lt;/code&gt;, you can configure them on individual imports using the &lt;code&gt;with&lt;/code&gt; clause:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; rawText &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;./data.txt&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  turbopackLoader&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;raw-loader&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  turbopackAs&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;*.js&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; value &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;./data.js&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; with&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  turbopackLoader&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;string-replace-loader&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  turbopackLoaderOptions&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;{&quot;search&quot;:&quot;PLACEHOLDER&quot;,&quot;replace&quot;:&quot;replaced value&quot;}&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is useful when only a specific import needs special treatment, avoiding side effects on other imports of the same file type. The available attributes are &lt;code&gt;turbopackLoader&lt;/code&gt;, &lt;code&gt;turbopackLoaderOptions&lt;/code&gt;, &lt;code&gt;turbopackAs&lt;/code&gt;, and &lt;code&gt;turbopackModuleType&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You should still prefer configuring your loaders in &lt;code&gt;next.config.ts&lt;/code&gt; when possible, since code using inline loaders is less portable. This option is more useful for code generated from plugins or loaders.&lt;/p&gt;
&lt;h2 id=&quot;lightning-css-configuration&quot; data-docs-heading=&quot;&quot;&gt;Lightning CSS Configuration&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-turbopack#lightning-css-configuration&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lightning CSS is a fast, Rust-based CSS transformer used by Turbopack for CSS minification and prefixing. It also allows implementation of modern CSS features on older browsers, similar to what Babel or SWC do for JavaScript. Previously, the only way to toggle these settings was through a Browserslist configuration. Now with the experimental &lt;code&gt;lightningCssFeatures&lt;/code&gt; option, you can force certain features to always or never transpile.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { NextConfig } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; NextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    useLightningcss&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    lightningCssFeatures&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      include&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;light-dark&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;oklab-colors&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      exclude&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;nesting&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;log-filtering&quot; data-docs-heading=&quot;&quot;&gt;Log Filtering&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-turbopack#log-filtering&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Turbopack can now suppress noisy or expected warnings from streaming logs with the &lt;code&gt;turbopack.ignoreIssue&lt;/code&gt; config option. This is useful for suppressing warnings from third-party code, generated files, or optional dependencies, as well as hiding expected errors from the Next.js error overlay.&lt;/p&gt;
&lt;p&gt;You can match logs generated from specific code paths, as well as filter for specific title/description strings or patterns.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { NextConfig } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; NextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  turbopack&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    ignoreIssue&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      { path&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;**/vendor/**&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      { path&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;app/**&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; title&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;Module not found&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      { path&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; /generated\/.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;\.ts/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; description&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; /expected error/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    ]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;postcssconfigts-support&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;postcss.config.ts&lt;/code&gt; Support&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-turbopack#postcssconfigts-support&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Turbopack now supports &lt;code&gt;postcss.config.ts&lt;/code&gt; in addition to the existing &lt;code&gt;.js&lt;/code&gt; and &lt;code&gt;.cjs&lt;/code&gt; variants.&lt;/p&gt;
&lt;h2 id=&quot;performance-improvements-and-bug-fixes&quot; data-docs-heading=&quot;&quot;&gt;Performance Improvements and Bug Fixes&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-turbopack#performance-improvements-and-bug-fixes&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We&#39;ve continued to invest in improving Turbopack internals. Over 200 changes and bug fixes have improved stability and compatibility across a wide range of projects. Optimizations in data encoding, internal representation formats, and hashing algorithms have improved memory usage and build time. We&#39;ve made error logs clearer and expanded diagnostics to help you better understand compiler errors. We&#39;ve also used your GitHub Issues as a guide for which features were missing since the 16.1 release.&lt;/p&gt;
&lt;h2 id=&quot;feedback-and-community&quot; data-docs-heading=&quot;&quot;&gt;Feedback and Community&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2-turbopack#feedback-and-community&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Share your feedback and help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/discord&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discord Community&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>https://nextjs.org/blog/next-16-2-turbopack</link><guid isPermaLink="false">https://nextjs.org/blog/next-16-2-turbopack</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js 16.2</title><description>&lt;p&gt;Next.js 16.2 includes performance improvements, better debugging, improvements for Agents, and over 200 Turbopack fixes and improvements.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2#faster-time-to-url-in-development&quot;&gt;&lt;strong&gt;Faster Time-to-URL&lt;/strong&gt;&lt;/a&gt;: ~400% faster &lt;code&gt;next dev&lt;/code&gt; startup&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2#faster-rendering&quot;&gt;&lt;strong&gt;Faster Rendering&lt;/strong&gt;&lt;/a&gt;: ~50% faster rendering&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2#new-default-error-page&quot;&gt;&lt;strong&gt;New Default Error Page&lt;/strong&gt;&lt;/a&gt;: Redesigned built-in 500 page&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2#server-function-logging&quot;&gt;&lt;strong&gt;Server Function Logging&lt;/strong&gt;&lt;/a&gt;: Dev terminal logs for Server Function execution&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2#hydration-diff-indicator&quot;&gt;&lt;strong&gt;Hydration Diff Indicator&lt;/strong&gt;&lt;/a&gt;: Clear server/client diff in the error overlay&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2#--inspect-for-next-start&quot;&gt;&lt;strong&gt;&lt;code&gt;--inspect&lt;/code&gt; for &lt;code&gt;next start&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: Attach the Node.js debugger to your production server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We also published dedicated deep-dive posts for two major areas of this release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-turbopack&quot;&gt;&lt;strong&gt;Turbopack&lt;/strong&gt;&lt;/a&gt;: Faster builds, SRI support, &lt;code&gt;postcss.config.ts&lt;/code&gt;, tree shaking improvements, Server Fast Refresh, and 200+ bug fixes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-2-ai&quot;&gt;&lt;strong&gt;AI Improvements&lt;/strong&gt;&lt;/a&gt;: &lt;code&gt;AGENTS.md&lt;/code&gt; in &lt;code&gt;create-next-app&lt;/code&gt;, browser log forwarding, and &lt;code&gt;next-browser&lt;/code&gt; (experimental)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Upgrade today, or get started with:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Use the automated upgrade CLI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; @next/codemod@canary&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; upgrade&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or upgrade manually&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react-dom@latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or start a new project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; create-next-app@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;faster-time-to-url-in-development&quot; data-docs-heading=&quot;&quot;&gt;Faster Time-to-URL in Development&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#faster-time-to-url-in-development&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We&#39;ve significantly improved the time it takes before &lt;code&gt;localhost:3000&lt;/code&gt; is ready during &lt;code&gt;next dev&lt;/code&gt;. On the same machine and project, startup is ~87% faster compared to Next.js 16.1 on the default application.&lt;/p&gt;
&lt;h2 id=&quot;faster-rendering&quot; data-docs-heading=&quot;&quot;&gt;Faster Rendering&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#faster-rendering&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We &lt;a href=&quot;https://github.com/facebook/react/pull/35776&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;contributed a change&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; to React that makes Server Components payload deserialization up to 350% faster. The previous implementation used a &lt;code&gt;JSON.parse&lt;/code&gt; reviver callback, which crosses the C++/JavaScript boundary in V8 for every key-value pair in the parsed JSON. Even a trivial no-op reviver makes &lt;code&gt;JSON.parse&lt;/code&gt; roughly 4x slower than without one.&lt;/p&gt;
&lt;p&gt;The new approach uses a two-step process: plain &lt;code&gt;JSON.parse()&lt;/code&gt; followed by a recursive walk in pure JavaScript. This eliminates the boundary-crossing overhead and adds optimizations like short-circuiting plain strings that don&#39;t need transformation.&lt;/p&gt;
&lt;p&gt;In real-world Next.js applications, this translates to 25% to 60% faster rendering to HTML, depending on the RSC payload size.&lt;/p&gt;
&lt;figure class=&quot;not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]&quot; aria-label=&quot;Server render time comparison showing improvements&quot;&gt;&lt;div class=&quot;flex h-10 items-center rounded-t-md border-b border-[var(--ds-gray-400)] bg-[var(--ds-background-200)] py-0 pr-3 pl-4&quot;&gt;&lt;span class=&quot;text-sm font-medium text-[var(--ds-gray-1000)]&quot;&gt;Server render time&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-4 bg-[var(--ds-background-100)] p-4&quot;&gt;&lt;div&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;Server Component Table with 1000 items&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;26% faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;Server Component Table render times&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Before&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Before: 19 milliseconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;19ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;19ms&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;After&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;80.3&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;After: 15 milliseconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:80.3%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;15ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;15ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;Server Component with nested Suspense&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;33% faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;Server Component with nested Suspense render times&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Before&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Before: 80 milliseconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;80ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;80ms&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;After&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;75&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;After: 60 milliseconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:75%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;60ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;60ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;Payload CMS homepage&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;34% faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;Payload CMS homepage render times&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Before&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Before: 43 milliseconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;43ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;43ms&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;After&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;74.4&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;After: 32 milliseconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:74.4%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;32ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;32ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;Payload CMS with rich text&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;60% faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;Payload CMS with rich text render times&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Before&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Before: 52 milliseconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;52ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;52ms&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;After&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;63.5&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;After: 33 milliseconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:63.5%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;33ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;33ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2 id=&quot;new-default-error-page&quot; data-docs-heading=&quot;&quot;&gt;New Default Error Page&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#new-default-error-page&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The default error page shown in production has been redesigned. When your application encounters an error and you haven&#39;t defined a custom &lt;code&gt;global-error.tsx&lt;/code&gt; or &lt;code&gt;error.tsx&lt;/code&gt;, Next.js renders a built-in fallback page. This fallback has been updated with a cleaner, more modern design.&lt;/p&gt;
&lt;figure&gt;&lt;div class=&quot;overflow-hidden&quot; style=&quot;aspect-ratio:1024 / 620&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;822&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fupdated_error_page_light_2.png&amp;amp;w=1080&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fupdated_error_page_light_2.png&amp;amp;w=2048&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fupdated_error_page_light_2.png&amp;amp;w=2048&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;822&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fupdated_error_page_dark.png&amp;amp;w=1080&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fupdated_error_page_dark.png&amp;amp;w=2048&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fupdated_error_page_dark.png&amp;amp;w=2048&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;/div&gt;&lt;figcaption&gt;The redesigned default error page in Next.js 16.2&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;server-function-logging&quot; data-docs-heading=&quot;&quot;&gt;Server Function Logging&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#server-function-logging&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js now logs Server Function execution in the terminal during development. Each log shows the function name, its arguments, execution time, and the file it&#39;s defined in.&lt;/p&gt;
&lt;figure&gt;&lt;div class=&quot;overflow-hidden&quot; style=&quot;aspect-ratio:1024 / 500&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;685&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fserver_fn_log_light_2.png&amp;amp;w=1080&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fserver_fn_log_light_2.png&amp;amp;w=2048&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fserver_fn_log_light_2.png&amp;amp;w=2048&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;685&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fserver_fn_log_dark.png&amp;amp;w=1080&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fserver_fn_log_dark.png&amp;amp;w=2048&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fserver_fn_log_dark.png&amp;amp;w=2048&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;p&gt;Server Function execution logs in the development terminal&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;hydration-diff-indicator&quot; data-docs-heading=&quot;&quot;&gt;Hydration Diff Indicator&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#hydration-diff-indicator&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When a hydration mismatch occurs, the error overlay now clearly labels which content came from the server and which from the client. The diff uses a &lt;code&gt;+ Client&lt;/code&gt; / &lt;code&gt;- Server&lt;/code&gt; legend, making it immediately clear what diverged.&lt;/p&gt;
&lt;figure&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;576&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fhydration_diff_light.png&amp;amp;w=1080&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fhydration_diff_light.png&amp;amp;w=2048&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fhydration_diff_light.png&amp;amp;w=2048&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;576&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fhydration_pure_dark.png&amp;amp;w=1080&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fhydration_pure_dark.png&amp;amp;w=2048&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Fhydration_pure_dark.png&amp;amp;w=2048&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;figcaption&gt;&lt;p&gt;The hydration diff indicator showing client/server content differences&lt;/p&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;--inspect-for-next-start&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;--inspect&lt;/code&gt; for &lt;code&gt;next start&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#--inspect-for-next-start&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js 16.1 introduced &lt;code&gt;next dev --inspect&lt;/code&gt; for attaching the Node.js debugger during development. In 16.2, this extends to &lt;code&gt;next start&lt;/code&gt;, allowing you to attach a Node.js debugger to your production server.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; start&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; --inspect&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is useful for debugging issues or profiling CPU and memory usage.&lt;/p&gt;
&lt;p&gt;For more information on how to use the Node.js debugger, see the &lt;a href=&quot;https://developer.chrome.com/docs/devtools/performance/nodejs&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Chrome documentation&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;transitiontypes-prop-for-nextlink&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;transitionTypes&lt;/code&gt; Prop for &lt;code&gt;next/link&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#transitiontypes-prop-for-nextlink&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt; component now accepts a &lt;a href=&quot;https://react.dev/reference/react/addTransitionType&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;transitionTypes&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; prop — an array of strings that specifies the types of View Transitions to apply when navigating. Each type is passed to &lt;code&gt;React.addTransitionType&lt;/code&gt; during the navigation Transition, allowing you to trigger different animations based on the navigation direction or context.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;/about&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; transitionTypes&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;{[&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;slide&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;]}&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  About&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is only supported in the App Router, since the Pages Router does not use React Transitions for navigation. &lt;code&gt;transitionTypes&lt;/code&gt; on Pages Router links is silently ignored, so shared link components work across both routers.&lt;/p&gt;
&lt;p&gt;To learn more about view transitions, see the &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/viewTransition&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;faster-imageresponse&quot; data-docs-heading=&quot;&quot;&gt;Faster &lt;code&gt;ImageResponse&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#faster-imageresponse&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ImageResponse&lt;/code&gt; has been updated with significant improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2x faster&lt;/strong&gt; &lt;code&gt;ImageResponse&lt;/code&gt; for basic images, up to &lt;strong&gt;20x faster&lt;/strong&gt; for complex images&lt;/li&gt;
&lt;li&gt;Improved CSS and SVG coverage, including support for inline CSS variables, &lt;code&gt;text-indent&lt;/code&gt;, &lt;code&gt;text-decoration-skip-ink&lt;/code&gt;, &lt;code&gt;box-sizing&lt;/code&gt;, &lt;code&gt;display: contents&lt;/code&gt;, &lt;code&gt;position: static&lt;/code&gt;, and percentage values for &lt;code&gt;gap&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Default font changed from Noto Sans to Geist Sans&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/functions/image-response&quot;&gt;ImageResponse&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;error-causes-in-the-dev-overlay&quot; data-docs-heading=&quot;&quot;&gt;Error Causes in the Dev Overlay&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#error-causes-in-the-dev-overlay&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The error overlay now displays &lt;code&gt;Error.cause&lt;/code&gt; chains, making it easier to debug errors that wrap other errors. Causes are shown in a flat list below the top-level error, up to 5 levels deep.&lt;/p&gt;
&lt;figure&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;738&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Ferror_trace_light.png&amp;amp;w=1080&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Ferror_trace_light.png&amp;amp;w=2048&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Ferror_trace_light.png&amp;amp;w=2048&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;738&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Ferror_trace_dark.png&amp;amp;w=1080&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Ferror_trace_dark.png&amp;amp;w=2048&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-2%2Ferror_trace_dark.png&amp;amp;w=2048&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;figcaption&gt;The error overlay showing the full error cause chain&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2 id=&quot;adapters&quot; data-docs-heading=&quot;&quot;&gt;Adapters&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#adapters&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/adapterPath&quot;&gt;Adapters&lt;/a&gt; are now stable. This is a new API that allows platforms to customize the build process.&lt;/p&gt;
&lt;p&gt;This is useful for deployment platforms or custom build integrations that need to modify the Next.js configuration or process the build output.&lt;/p&gt;
&lt;p&gt;We will share a more detailed overview of Adapters next week.&lt;/p&gt;
&lt;h2 id=&quot;multiple-icon-formats&quot; data-docs-heading=&quot;&quot;&gt;Multiple Icon Formats&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#multiple-icon-formats&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Multiple icon files with the same base name but different extensions are now handled automatically in your app directory (e.g., &lt;code&gt;icon.png&lt;/code&gt; and &lt;code&gt;icon.svg&lt;/code&gt;). This is useful for browser fallback support. Modern browsers can use SVG icons while older browsers fall back to PNG. Both formats are rendered as separate &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;
&lt;h2 id=&quot;experimental-features&quot; data-docs-heading=&quot;&quot;&gt;Experimental Features&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#experimental-features&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;unstable_catcherror&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;unstable_catchError()&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#unstable_catcherror&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Extending the error recovery experience with the &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/file-conventions/error&quot;&gt;&lt;code&gt;error.js&lt;/code&gt;&lt;/a&gt; file convention, &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/functions/catchError&quot;&gt;&lt;code&gt;unstable_catchError()&lt;/code&gt;&lt;/a&gt; provides more granular control of the error boundaries on the component level. By creating a custom error boundary using &lt;code&gt;unstable_catchError()&lt;/code&gt;, you can place it anywhere in your component tree.&lt;/p&gt;
&lt;p&gt;Compared to a custom React error boundary, &lt;code&gt;unstable_catchError()&lt;/code&gt; is designed to work with Next.js out of the box:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Built-in error recovery&lt;/strong&gt;: &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/file-conventions/error#unstable_retry&quot;&gt;&lt;code&gt;unstable_retry()&lt;/code&gt;&lt;/a&gt; re-renders the page from the server in transition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Framework-aware integration&lt;/strong&gt;: APIs like &lt;code&gt;redirect()&lt;/code&gt; and &lt;code&gt;notFound()&lt;/code&gt; work by throwing special errors under the hood. &lt;code&gt;unstable_catchError()&lt;/code&gt; handles these seamlessly, so they&#39;re not accidentally caught by your error boundary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client navigation handling&lt;/strong&gt;: The error state automatically clears when you do a client navigation to a different route.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The error boundary created by &lt;code&gt;unstable_catchError()&lt;/code&gt; receives the props passed from the call site and the &lt;code&gt;ErrorInfo&lt;/code&gt; value as the second argument, which is the same shape as the props passed to the &lt;code&gt;error.js&lt;/code&gt; file convention.&lt;/p&gt;
&lt;p&gt;Just like &lt;code&gt;error.js&lt;/code&gt;, &lt;code&gt;unstable_catchError()&lt;/code&gt; can only be called from &lt;a href=&quot;https://nextjs.org/docs/app/getting-started/server-and-client-components&quot;&gt;Client Components&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;app/custom-error-boundary.tsx&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;use client&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { unstable_catchError&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; ErrorInfo } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/error&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; CustomErrorBoundary&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { title&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  { error&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; unstable_retry }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; ErrorInfo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.title}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.message}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; onClick&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;{() &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; unstable_retry&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;()}&amp;gt;Try again&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; unstable_catchError&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(CustomErrorBoundary);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;app/page.tsx&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; CustomErrorBoundary &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;./custom-error-boundary&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; Page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;CustomErrorBoundary&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; title&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;Oops! Something went wrong!&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;CustomErrorBoundary&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;unstable_retry-in-errortsx&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;unstable_retry()&lt;/code&gt; in &lt;code&gt;error.tsx&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#unstable_retry-in-errortsx&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A new &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/file-conventions/error#unstable_retry&quot;&gt;&lt;code&gt;unstable_retry()&lt;/code&gt;&lt;/a&gt; prop is now available in &lt;code&gt;error.tsx&lt;/code&gt; components. Previously, the &lt;code&gt;reset()&lt;/code&gt; prop only cleared the error state and re-rendered the children, which works for temporary rendering errors but doesn&#39;t help when the error originates from data fetching or the RSC phase.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;unstable_retry()&lt;/code&gt; calls &lt;code&gt;router.refresh()&lt;/code&gt; and &lt;code&gt;reset()&lt;/code&gt; within a &lt;code&gt;startTransition()&lt;/code&gt;, providing built-in retry logic that re-fetches data and re-renders the segment. This is expected to be preferred over &lt;code&gt;reset()&lt;/code&gt; for most error recovery scenarios.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;app/error.tsx&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;use client&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { ErrorInfo } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/error&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; Error&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;({ error&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; unstable_retry }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; ErrorInfo&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;Something went wrong&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.message}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; onClick&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;{() &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; unstable_retry&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;()}&amp;gt;Try again&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;experimentalprefetchinlining&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;experimental.prefetchInlining&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#experimentalprefetchinlining&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Next.js 16 introduced per-segment prefetching, where the client issues individual requests for each segment in the route tree. This improves cache efficiency as shared layouts between sibling routes are fetched once and reused, but increases request volume.&lt;/p&gt;
&lt;p&gt;The new &lt;code&gt;experimental.prefetchInlining&lt;/code&gt; option bundles all segment data for a route into a single response, reducing the number of prefetch requests to one per link. The trade-off is that shared layout data is duplicated across inlined responses rather than being cached and reused.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    prefetchInlining&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is a stepping stone toward a size-based heuristic where small segments are inlined automatically and larger segments remain separate.&lt;/p&gt;
&lt;h3 id=&quot;experimentalcachednavigations&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;experimental.cachedNavigations&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#experimentalcachednavigations&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This flag independently controls the Cached Navigations behavior, which caches static and dynamic Server Components data from navigations and the initial HTML loads so that repeat visits can be served instantly. Requires &lt;code&gt;cacheComponents&lt;/code&gt; to be enabled.&lt;/p&gt;
&lt;h3 id=&quot;experimentalappnewscrollhandler&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;experimental.appNewScrollHandler&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#experimentalappnewscrollhandler&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A reworked scroll and focus management system for App Router using React Fragment refs. The new handler improves how focus is managed after navigations. Instead of focusing the first focusable descendant deep within a segment (which could skip past content), it now blurs the active element, matching how browser navigations work.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    appNewScrollHandler&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;feedback-and-community&quot; data-docs-heading=&quot;&quot;&gt;Feedback and Community&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#feedback-and-community&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Share your feedback and help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/discord&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discord Community&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;contributors&quot; data-docs-heading=&quot;&quot;&gt;Contributors&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-2#contributors&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js is the result of the combined work of over 3,770 individual developers. This release was brought to you by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Next.js&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/acdlite&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Andrew&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/unstubbable&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Hendrik&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lubieowoce&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Janka&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/huozhi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiachi&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/feedthejim&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jimmy&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/devjiwonchoi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiwon&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/ijjk&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;JJ&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gnoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Josh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gaojude&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jude&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://x.com/samselikoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sam&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/eps1lon&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebbie&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/timneutkens&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tim&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/ztanner&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Zack&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Turbopack&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/bgw&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Benjamin&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/andrewimm&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Andrew&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lukesandberg&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Luke&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/mischnic&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Niklas&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/sokra&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tobias&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/wbinnssmith&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Will&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Next.js Docs&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/delbaoliveira&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Delba&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/molebox&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Rich&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/ismaelrumzan&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Ismael&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/icyJoseph&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Joseph&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/aurorascharff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Aurora&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Huge thanks to @acdlite, @unstubbable, @mischnic, @sokra, @ztanner, @mmastrac, @bgw, @lukesandberg, @wyattjoh, @huozhi, @eps1lon, @jwueller, @brookemosby, @delbaoliveira, @icyJoseph, @gaojude, @hanzala-sohrab, @dango0812, @ijjk, @msmx-mnakagawa, @Juneezee, @davidgolden, @LucianBuzzo, @devjiwonchoi, @alexcarpenter, @jaffarkeikei, @BradErz, @mintydev789, @naaa760, @Suhaib3100, @pavan-sh, @amannn, @fireairforce, @JamBalaya56562, @wheresrhys, @ericrav, @lubieowoce, @Thomas465xd, @bgub, @wbinnssmith, @Netail, @robert-j-webb, @bencmbrook, @shadcn, @sigmachirality, @abhishekmardiya, @vvscode, @feedthejim, @freek-boon-greenberry, @andrewimm, @alubbe, @FurryR, @01-binary, @andrewdamelio, @swarnava, @gnoff, @kristiyan-velkov, @styfle, @haydenbleasel, @rishishanbhag, @tdarthur, @lavanitha, and @karlhorky for helping!&lt;/p&gt;</description><link>https://nextjs.org/blog/next-16-2</link><guid isPermaLink="false">https://nextjs.org/blog/next-16-2</guid><pubDate>Invalid Date</pubDate></item><item><title>Building Next.js for an agentic future</title><description>&lt;p&gt;We&#39;ve spent the past year improving the Next.js agent experience. Along the way, we built and sunset an in-browser agent, shipped MCP integration, and learned that the real answer to better agent support is thinking from the agent&#39;s perspective.&lt;/p&gt;
&lt;h3 id=&quot;agents-couldnt-see-the-browser&quot; data-docs-heading=&quot;&quot;&gt;Agents couldn&#39;t see the browser&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/agentic-future#agents-couldnt-see-the-browser&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Earlier this summer, we were working on improving the Next.js devtools when we noticed a pattern. Developers would see an error in the browser, copy the details, paste them into an AI editor, and ask the agent to fix it.&lt;/p&gt;
&lt;p&gt;The problem was that agents can&#39;t see the browser. Runtime errors, client-side warnings, and rendered components are all invisible to them. When a user says &quot;fix the error,&quot; the agent doesn&#39;t know what error they mean.&lt;/p&gt;
&lt;p&gt;Our first response was updating the copy button to capture structured error data. Then we added a feature that forwards browser logs to the terminal. Small fixes, but they pointed toward a bigger realization. We needed to make Next.js itself visible to agents.&lt;/p&gt;
&lt;h3 id=&quot;experimenting-with-an-in-browser-agent&quot; data-docs-heading=&quot;&quot;&gt;Experimenting with an in-browser agent&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/agentic-future#experimenting-with-an-in-browser-agent&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;That led to an ambitious idea. What if we built an agent directly inside Next.js that worked like smart devtools?&lt;/p&gt;
&lt;p&gt;We built an in-browser chat agent called Vector. Similar to&amp;nbsp;&lt;code&gt;react-grab&lt;/code&gt;&amp;nbsp;but integrated with Next.js, Vector let you select elements on the page, see their source code, and prompt for changes. It had Next.js best practices baked in to help agents avoid hallucination.&lt;/p&gt;
&lt;div class=&quot;flex justify-center&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;Vector&#39;s interface showing error detection and suggested fixes.&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fagentic-future%2Fvector-both-theme.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fagentic-future%2Fvector-both-theme.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fagentic-future%2Fvector-both-theme.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Subtitle: Vector&#39;s interface showing error detection and suggested fixes.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Vector was useful, but it overlapped with general coding agents like Cursor and Claude Code. Most developers were already using those tools for all of their projects anyway, not just Next.js. The UI selection made it easy to point at exactly what you wanted to change, but it wasn&#39;t something people needed every day.&lt;/p&gt;
&lt;p&gt;We sunset Vector, but took what made it useful (structured visibility and framework-specific knowledge) and decided to build those into Next.js itself.&lt;/p&gt;
&lt;h3 id=&quot;mcp-made-nextjs-state-visible-to-agents&quot; data-docs-heading=&quot;&quot;&gt;MCP made Next.js state visible to agents&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/agentic-future#mcp-made-nextjs-state-visible-to-agents&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Around the Next.js v16 release in October 2025, users were struggling to debug with agents. The common prompt was &quot;fix the error,&quot; asking agents to resolve issues from the browser overlay. But agents would request the page HTML and find nothing wrong.&lt;/p&gt;
&lt;p&gt;Runtime failures, browser JavaScript errors, and async errors all lived in the browser, not in the HTML. The rendered page, layout segments, routes, and other internal state were invisible to agents.&lt;/p&gt;
&lt;p&gt;MCP gave us a way to expose this data. The first version surfaced internal states like errors, routes, and rendered segments, but exposing data alone wasn&#39;t enough. Agents also needed to discover running dev servers and communicate with them, which led to&amp;nbsp;&lt;code&gt;next-devtools-mcp&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&quot;flex justify-center&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;The Next.js MCP responding to &#39;whats use cache?&#39; with documentation and context.&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fagentic-future%2Fanswer-dark.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fagentic-future%2Fanswer-dark.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fagentic-future%2Fanswer-dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Subtitle: The Next.js MCP responding to &quot;whats use cache?&quot; with documentation and context.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The MCP also packages prompts and tools to help with upgrades and cache component migrations. There&#39;s a&amp;nbsp;&lt;a href=&quot;https://www.youtube.com/watch?v=WT7_TJS0tFE&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;detailed talk about the MCP integration&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;if you want to learn more.&lt;/p&gt;
&lt;h3 id=&quot;the-answer-is-to-think-like-an-agent&quot; data-docs-heading=&quot;&quot;&gt;The answer is to think like an agent&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/agentic-future#the-answer-is-to-think-like-an-agent&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;MCP confirmed what Vector taught us. Agents need visibility into what Next.js is doing, but that&#39;s only part of the story. The deeper lesson was treating agents as first-class users of Next.js and thinking from their perspective. What information do they need? When do they need it? How do they consume it?&lt;/p&gt;
&lt;p&gt;This mindset led to practical changes. If agents read terminal output during development, then logging Server Action invocations and forwarding browser errors gives them the hints they need. If agents struggle with framework concepts not in their training data, then embedding a compressed docs index &lt;code&gt;agents.md&lt;/code&gt; or providing structured workflows (&lt;a href=&quot;https://github.com/vercel-labs/next-skills&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Next.js skills&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;) gives them better context than documentation alone.&lt;/p&gt;
&lt;p&gt;Those questions run through everything we built. The need for visibility led to better logging, the need for knowledge led to agents.md, and the need for discovery led to MCP. When you treat agents as first-class users and meet them where they are, debugging becomes a tight feedback loop between code, runtime, and AI.&lt;/p&gt;
&lt;h3 id=&quot;whats-next&quot; data-docs-heading=&quot;&quot;&gt;What&#39;s next&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/agentic-future#whats-next&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We&#39;re now working on making this easier to adopt. You can already run&amp;nbsp;&lt;code&gt;npx @next/codemod&lt;/code&gt;&amp;nbsp;to generate an up-to-date docs index for your project, and we&#39;re expanding our eval suite to cover more Next.js 16 APIs so we can measure what actually helps agents. Longer term, we want this built into&amp;nbsp;&lt;code&gt;next dev&lt;/code&gt;&amp;nbsp;so agents get the right context automatically without any setup.&lt;/p&gt;
&lt;p&gt;We&#39;re eager to hear your feedback and ideas on how to make Next.js work even better with agents.&lt;/p&gt;</description><link>https://nextjs.org/blog/agentic-future</link><guid isPermaLink="false">https://nextjs.org/blog/agentic-future</guid><pubDate>Invalid Date</pubDate></item><item><title>Inside Turbopack: Building Faster by Building Less</title><description>&lt;p&gt;Edit. Save. Refresh. Wait… Wait… Wait…&lt;/p&gt;
&lt;p&gt;Compiling code usually means waiting, but &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/turbopack&quot;&gt;Turbopack&lt;/a&gt; makes iteration loops fast with caching and incremental computation. Not every modern bundler uses an incremental approach, and that’s with good reason. Incremental computation can introduce significant complexity and opportunities for bugs. Caches require extra tracking and copies of data, adding both CPU and memory overhead. When applied poorly, caching can actually make performance worse.&lt;/p&gt;
&lt;p&gt;Despite all of this, we took on these challenges because we knew that an incremental architecture would be critical to Turbopack’s success. Turbopack is the new default bundler for Next.js, a framework that is used to build some of the &lt;a href=&quot;https://nextjs.org/showcase&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;largest web applications in the world&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;. We needed to enable instant builds and a fast as-you-type interactive &lt;a href=&quot;https://nextjs.org/docs/architecture/fast-refresh&quot;&gt;React Fast Refresh&lt;/a&gt; experience, even for the largest and most challenging workloads. Our incremental architecture is core to achieving this.&lt;/p&gt;
&lt;div class=&quot;my-8&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;A formula with big O notation showing a change in time spent from “your entire application” to “your changes”.&quot; loading=&quot;lazy&quot; width=&quot;2514&quot; height=&quot;1058&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fturbopack--light.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fturbopack--light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;A formula with big O notation showing a change in time spent from “your entire application” to “your changes”.&quot; loading=&quot;lazy&quot; width=&quot;2514&quot; height=&quot;1058&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fturbopack--dark.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fturbopack--dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;figcaption&gt;A solution without caching slows down as the size of the application increases. Incremental computation can scale to large applications because it only depends on the size of small iterative changes.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Turbopack’s architecture was built ground-up with caching in mind. Its incremental design is based on over a decade of research. We built on first-hand experience from challenges in implementing caching in &lt;a href=&quot;https://webpack.js.org/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;webpack&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; and drew inspiration from &lt;a href=&quot;https://salsa-rs.netlify.app/overview&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Salsa&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; (which powers &lt;a href=&quot;https://rust-analyzer.github.io/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Rust-Analyzer&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://docs.astral.sh/ruff/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Ruff&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;), &lt;a href=&quot;https://parceljs.org/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Parcel&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, the &lt;a href=&quot;https://rustc-dev-guide.rust-lang.org/query.html&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Rust compiler’s query system&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://plum-umd.github.io/adapton/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Adapton&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and many others.&lt;/p&gt;
&lt;p&gt;Turbopack achieves a fine-grained cache by automatically tracking how internal functions are called and what values they depend on. When something changes we know how to recompute the results with minimal work.&lt;/p&gt;
&lt;h2 id=&quot;background-manual-incremental-computation&quot; data-docs-heading=&quot;&quot;&gt;Background: Manual incremental computation&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/turbopack-incremental-computation#background-manual-incremental-computation&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Many build systems include explicit dependency graphs that must be manually populated when evaluating build rules. Explicitly declaring your dependency graph can theoretically give optimal results, but in practice it leaves room for errors.&lt;/p&gt;
&lt;p&gt;The difficulty of specifying an explicit dependency graph means that usually caching is done at a coarse file-level granularity. This granularity does have some benefits: fewer incremental results means less data to cache, which might be worth it if you have limited disk space or memory.&lt;/p&gt;
&lt;p&gt;An example of such an architecture is &lt;a href=&quot;https://www.gnu.org/software/make/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;GNU Make&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, where output targets and prerequisites are manually configured and represented as files. Systems like GNU Make miss caching opportunities due to their coarse granularity: they do not understand and cannot cache internal data structures within the compiler.&lt;/p&gt;
&lt;h2 id=&quot;function-level-fine-grained-automatic-incremental-computation&quot; data-docs-heading=&quot;&quot;&gt;Function-level fine-grained automatic incremental computation&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/turbopack-incremental-computation#function-level-fine-grained-automatic-incremental-computation&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In Turbopack, the relationship between input files and resulting build artifacts isn’t straightforward. Bundlers employ whole-program analysis for dead code elimination (&quot;tree shaking&quot;) and clustering of common dependencies in the module graph. Consequently, the build artifacts (JavaScript files shared across multiple application routes) form complex many-to-many relationships with input files.&lt;/p&gt;
&lt;p&gt;Turbopack uses a very fine-grained caching architecture. Because manually declaring and adding dependencies to a graph is prone to human errors, Turbopack needs an automated solution that can scale.&lt;/p&gt;
&lt;h3 id=&quot;tracking-the-compilation-graph-with-value-cells&quot; data-docs-heading=&quot;&quot;&gt;Tracking the compilation graph with value cells&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/turbopack-incremental-computation#tracking-the-compilation-graph-with-value-cells&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To facilitate automatic caching and dependency tracking, Turbopack introduces a concept of “value cells” (&lt;a href=&quot;https://turbopack-rust-docs.vercel.sh/rustdoc/turbo_tasks/struct.Vc.html&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;Vc&amp;lt;…&amp;gt;&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;). Each value cell represents a fine-grained piece of execution, like a cell in a spreadsheet. When reading a cell, it records the currently executing function and all of its cells as dependent on that cell. This is similar to how signals work in frameworks like &lt;a href=&quot;https://docs.solidjs.com/concepts/signals&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;SolidJS&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;my-8&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;Example Rust code annotated with a macro, along with arguments annotated as inputs. Those arguments are awaited in the function&#39;s body.&quot; loading=&quot;lazy&quot; width=&quot;2514&quot; height=&quot;1208&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fturbopack_value-cells--light.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fturbopack_value-cells--light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;Example Rust code annotated with a macro, along with arguments annotated as inputs. Those arguments are awaited in the function&#39;s body.&quot; loading=&quot;lazy&quot; width=&quot;2514&quot; height=&quot;1208&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fturbopack_value-cells--dark.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fturbopack_value-cells--dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;figcaption&gt;The value cells become tracked when awaited.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;By not marking cells as dependencies until they are read, Turbopack achieves finer-grained caching than &lt;a href=&quot;https://en.wikipedia.org/wiki/Memoization&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;a traditional top-down memoization approach&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; would provide. For example, an argument might be an object or mapping of &lt;em&gt;many&lt;/em&gt; value cells. Instead of needing to recompute our tracked function when &lt;em&gt;any part of&lt;/em&gt; the object or mapping changes, it only needs to recompute the tracked function when a cell that &lt;em&gt;it has actually read&lt;/em&gt; changes.&lt;/p&gt;
&lt;p&gt;Value cells represent nearly everything inside of Turbopack, such as a file on disk, an abstract syntax tree (AST), metadata about imports and exports of modules, or clustering information used for chunking and bundling.&lt;/p&gt;
&lt;div class=&quot;my-8&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;Illustrations of files, abstract syntax trees, module metadata, and clustering metadata.&quot; loading=&quot;lazy&quot; width=&quot;3600&quot; height=&quot;1720&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fexample_value_cells--light.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fexample_value_cells--light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;Illustrations of files, abstract syntax trees, module metadata, and clustering metadata.&quot; loading=&quot;lazy&quot; width=&quot;3600&quot; height=&quot;1720&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fexample_value_cells--dark.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fexample_value_cells--dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;figcaption&gt;Examples of types of data that could be stored inside a value cell.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h3 id=&quot;marking-dirty-and-propagating-changes&quot; data-docs-heading=&quot;&quot;&gt;Marking dirty and propagating changes&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/turbopack-incremental-computation#marking-dirty-and-propagating-changes&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When Turbopack executes functions for the first time, it builds a graph of functions and the value cells they create or depend on. The graph’s roots are the requested outputs (bundled assets), and the leaves are source code files. There are intermediate representations in the middle, such as ASTs, metadata, partially-transformed modules, or chunking information.&lt;/p&gt;
&lt;p&gt;When our file system watcher finds source code that has changed, it marks all functions that read the file’s value cell as “dirty” and queues them for re-computation.&lt;/p&gt;
&lt;p&gt;The dirtied function reading the file might parse or transform the JavaScript module and produce a new intermediate representation. Recomputing the function update cells containing changed intermediate representations, which may mark more functions as dirty. Cell updates are skipped if the cell contents are equal. This propagation bubbles up the graph until all affected functions have been recomputed.&lt;/p&gt;
&lt;p&gt;As an additional optimization, execution is &quot;demand-driven,&quot; meaning the system defers re-execution of dirty functions until they become part of an &quot;active query&quot;. In development, an active query could be a currently open webpage with hot reloading enabled. In builds, this is a request for the full production app.&lt;/p&gt;
&lt;div class=&quot;my-8&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;Three call trees representing an initial (cold) execution, the &amp;quot;mark dirty&amp;quot; operation when a file has been changed, and the propagation from the leaf up to the root.&quot; loading=&quot;lazy&quot; width=&quot;3600&quot; height=&quot;1044&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fexample_value_cell_operations--light.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fexample_value_cell_operations--light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;Three call trees representing an initial (cold) execution, the &amp;quot;mark dirty&amp;quot; operation when a file has been changed, and the propagation from the leaf up to the root.&quot; loading=&quot;lazy&quot; width=&quot;3600&quot; height=&quot;1044&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fexample_value_cell_operations--dark.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Fexample_value_cell_operations--dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;figcaption&gt;These example call trees represent an initial (cold) execution, the “mark dirty” operation when a file has been changed, and the propagation from the leaf up to the root.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h3 id=&quot;aggregation-graphs&quot; data-docs-heading=&quot;&quot;&gt;Aggregation graphs&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/turbopack-incremental-computation#aggregation-graphs&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;While most operations, like the dirty propagation algorithm, only require information about adjacent edges and neighboring nodes in the graph, some operations need to query information about more significant portions of the dependency graph:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finding all dirty nodes when a sub-graph becomes part of a new active query, so we can schedule re-computation.&lt;/li&gt;
&lt;li&gt;Collecting errors, warnings, or lints of a sub-graph.&lt;/li&gt;
&lt;li&gt;Waiting for computation of a sub-graph to finish.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because we maintain a fine-grained cache, the graph can contain hundreds of thousands or even millions of intermediate results. Visiting significant portions of this graph would be expensive.&lt;/p&gt;
&lt;p&gt;To make these queries efficient, Turbopack uses an additional data structure on top of the dependency graph, called the “aggregation graph”.&lt;/p&gt;
&lt;p&gt;When we build or update the dependency graph, we maintain parallel nodes in the aggregation graph that summarize part of the dependency graph. Some frequently accessed information, like emitted errors or warnings, is attached to the aggregation nodes.&lt;/p&gt;
&lt;p&gt;This aggregation graph has multiple layers of resolution, with higher aggregation layers referencing more functions in each node, decreasing the resolution, and reducing the number of nodes that must be traversed when collecting information.&lt;/p&gt;
&lt;p&gt;Every potential active query (e.g. an application entrypoint or route) represents a root in the aggregation graph. At the final aggregation graph layer, each root represents the information for itself and all of the children in the original dependency graph. Adding roots to the dependency graph can require a reorganization of the aggregation graph, but that’s an infrequent operation.&lt;/p&gt;
&lt;div class=&quot;my-8&quot;&gt;&lt;figure style=&quot;margin-top:32px;margin-bottom:32px&quot;&gt;&lt;img alt=&quot;Examples of the aggregation graph showing multiple layers.&quot; loading=&quot;lazy&quot; width=&quot;3600&quot; height=&quot;1738&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Faggregation_layers--light.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Faggregation_layers--light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;Examples of the aggregation graph showing multiple layers.&quot; loading=&quot;lazy&quot; width=&quot;3600&quot; height=&quot;1738&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Faggregation_layers--dark.png&amp;amp;w=3840&amp;amp;q=75 1x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fturbopack-incremental-computation%2Faggregation_layers--dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;figcaption&gt;Aggregation layers capture less detail than the original dependency graph, but are faster to traverse. At the final layer, aggregation root nodes contain all of the children in the original graph.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;h2 id=&quot;file-system-caching&quot; data-docs-heading=&quot;&quot;&gt;File system caching&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/turbopack-incremental-computation#file-system-caching&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Until our recent &lt;a href=&quot;https://nextjs.org/blog/next-16-1&quot;&gt;Next.js 16.1&lt;/a&gt; release, all of these caches were stored only in memory.&lt;/p&gt;
&lt;p&gt;In this new release, we shipped file system caching for &lt;code&gt;next dev&lt;/code&gt; as stable and on-by-default. This cache allows us to persist the dependency graph, the aggregation graph, and all of the intermediate results stored in value cells to disk. When &lt;code&gt;next dev&lt;/code&gt; is restarted, it can quickly resume from this warm cache.&lt;/p&gt;
&lt;p&gt;File system caching came with its own set of challenges, and it took us over a year of dedicated work to meet our own high performance and quality bar. We&#39;ll dive into that soon in an upcoming engineering blog post.&lt;/p&gt;
&lt;h2 id=&quot;feedback-and-community&quot; data-docs-heading=&quot;&quot;&gt;Feedback and Community&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/turbopack-incremental-computation#feedback-and-community&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Share your feedback and help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/discord&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discord Community&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><link>https://nextjs.org/blog/turbopack-incremental-computation</link><guid isPermaLink="false">https://nextjs.org/blog/turbopack-incremental-computation</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js 16.1</title><description>&lt;p&gt;Next.js 16.1 focuses on faster development workflows and improved stability, with major updates to Turbopack and tooling.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-1#turbopack-file-system-caching-for-next-dev&quot;&gt;&lt;strong&gt;Turbopack File System Caching for &lt;code&gt;next dev&lt;/code&gt; (stable)&lt;/strong&gt;&lt;/a&gt;: Improved compile times for &lt;code&gt;next dev&lt;/code&gt; by default.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-1#nextjs-bundle-analyzer-experimental&quot;&gt;&lt;strong&gt;Next.js Bundle Analyzer (experimental)&lt;/strong&gt;&lt;/a&gt;: Optimize your code with our new interactive tool.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-1#easier-debugging-with-next-dev---inspect&quot;&gt;&lt;strong&gt;Easier debugging&lt;/strong&gt;&lt;/a&gt;: Debug your Next.js app with &lt;code&gt;next dev --inspect&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-1#improved-handling-of-serverexternalpackages&quot;&gt;&lt;strong&gt;Transitive external dependencies&lt;/strong&gt;&lt;/a&gt;: Turbopack can automatically handle transitive external dependencies with no warnings.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;upgrade-today&quot; data-docs-heading=&quot;&quot;&gt;Upgrade Today&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-1#upgrade-today&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Use the automated upgrade CLI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; @next/codemod@canary&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; upgrade&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or upgrade manually&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react-dom@latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or start a new project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; create-next-app@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;turbopack-file-system-caching-for-next-dev&quot; data-docs-heading=&quot;&quot;&gt;Turbopack File System Caching for &lt;code&gt;next dev&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-1#turbopack-file-system-caching-for-next-dev&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Turbopack file system caching for &lt;code&gt;next dev&lt;/code&gt; is now stable and on by default. Compiler artifacts are stored on disk, leading to significantly faster compile times when restarting your development server, especially in large projects.&lt;/p&gt;
&lt;figure class=&quot;not-prose my-8 overflow-hidden rounded-lg border border-[var(--ds-gray-400)]&quot; aria-label=&quot;Compile time comparison showing improvements with file system caching&quot;&gt;&lt;div class=&quot;flex h-10 items-center rounded-t-md border-b border-[var(--ds-gray-400)] bg-[var(--ds-background-200)] py-0 pr-3 pl-4&quot;&gt;&lt;span class=&quot;text-sm font-medium text-[var(--ds-gray-1000)]&quot;&gt;First route compile time&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-4 bg-[var(--ds-background-100)] p-4&quot;&gt;&lt;div&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;react.dev&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~10× faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;react.dev compile times&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cold&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Cold start: 3.7 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;3.7s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;3.7s&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cached&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;10.3&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Cached: 380 milliseconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:10.3%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;380ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;380ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;nextjs.org&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~5× faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;nextjs.org compile times&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cold&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Cold start: 3.5 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;3.5s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;3.5s&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cached&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;20&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Cached: 700 milliseconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:20%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;700ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;700ms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;border-t border-[var(--ds-gray-400)] pt-4&quot;&gt;&lt;div class=&quot;mb-2 flex items-baseline justify-between gap-4&quot;&gt;&lt;span class=&quot;text-sm text-[var(--ds-gray-1000)]&quot;&gt;Large internal Vercel app&lt;/span&gt;&lt;span class=&quot;shrink-0 text-xs font-semibold&quot; style=&quot;color:var(--ds-blue-700)&quot;&gt;~14× faster&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex flex-col gap-1.5&quot; role=&quot;group&quot; aria-label=&quot;Large Vercel app compile times&quot;&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cold&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;100&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Cold start: 15 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:100%;background-color:var(--ds-gray-600)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;15s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;15s&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;flex items-center gap-3&quot;&gt;&lt;span class=&quot;w-12 shrink-0 text-xs text-[var(--ds-gray-900)]&quot;&gt;Cached&lt;/span&gt;&lt;div class=&quot;relative h-5 flex-1 rounded bg-[var(--ds-gray-200)]&quot; role=&quot;progressbar&quot; aria-valuenow=&quot;7.3&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; aria-label=&quot;Cached: 1.1 seconds&quot;&gt;&lt;div class=&quot;h-full rounded&quot; style=&quot;width:7.3%;background-color:var(--ds-blue-700)&quot; aria-hidden=&quot;true&quot;&gt;&lt;/div&gt;&lt;div class=&quot;absolute inset-0 flex items-center px-2&quot;&gt;&lt;span class=&quot;hidden text-xs font-medium text-white sm:inline&quot;&gt;1.1s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;span class=&quot;w-16 shrink-0 text-right text-xs font-medium text-[var(--ds-gray-1000)] sm:hidden&quot;&gt;1.1s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Internal applications at Vercel have been dogfooding this for the past year. To learn more about how we built file system caching for Turbopack, watch &lt;a href=&quot;https://nextjs.org/conf/session/are-we-turbo-yet&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Luke Sandberg&#39;s talk at Next.js Conf&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Following this release, we&#39;ll be stabilizing file system caching for &lt;code&gt;next build&lt;/code&gt;. See our &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/turbopackFileSystemCache&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;documentation&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for more information, and share your &lt;a href=&quot;https://github.com/vercel/next.js/discussions/87283&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;feedback&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; on the dedicated GitHub discussion.&lt;/p&gt;
&lt;h2 id=&quot;nextjs-bundle-analyzer-experimental&quot; data-docs-heading=&quot;&quot;&gt;Next.js Bundle Analyzer (experimental)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-1#nextjs-bundle-analyzer-experimental&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js 16.1 includes a new experimental &lt;a href=&quot;https://nextjs.org/docs/app/guides/package-bundling#nextjs-bundle-analyzer-experimental&quot;&gt;Bundle Analyzer&lt;/a&gt; that works with Turbopack. It makes it easier to optimize bundle sizes for both server and client code—helping improve Core Web Vitals, reduce lambda cold start times, and identify bloated dependencies.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; experimental-analyze&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Running the command launches an interactive UI to inspect production bundles, identify large modules, and see why they&#39;re included.&lt;/p&gt;
&lt;figure&gt;&lt;a href=&quot;https://turbopack-bundle-analyzer-demo.vercel.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;&lt;img alt=&quot;The Next.js Bundle Analyzer showing a treemap with TopNav.tsx selected, revealing its import chain.&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 dark-theme:hidden&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-1%2Fbundle_analyzer_light.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-1%2Fbundle_analyzer_light.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-1%2Fbundle_analyzer_light.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;img alt=&quot;The Next.js Bundle Analyzer showing a treemap with TopNav.tsx selected, revealing its import chain.&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1080&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100 hidden dark-theme:block&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-1%2Fbundle_analyzer_dark.png&amp;amp;w=1920&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-1%2Fbundle_analyzer_dark.png&amp;amp;w=3840&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16-1%2Fbundle_analyzer_dark.png&amp;amp;w=3840&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/a&gt;&lt;figcaption&gt;The Next.js Bundle Analyzer showing a treemap with TopNav.tsx selected, revealing its import chain.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;Try it yourself:&lt;/strong&gt; &lt;a target=&quot;_blank&quot; href=&quot;https://turbopack-bundle-analyzer-demo.vercel.sh/&quot;&gt;Open the interactive Bundle Analyzer demo&lt;/a&gt; to explore the module graph.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Bundle Analyzer is deeply integrated into Next.js, allowing you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Filter bundles by route&lt;/li&gt;
&lt;li&gt;View the full import chain showing why a module is included&lt;/li&gt;
&lt;li&gt;Trace imports across server-to-client component boundaries and dynamic imports&lt;/li&gt;
&lt;li&gt;View CSS and other imported asset sizes&lt;/li&gt;
&lt;li&gt;Switch between client and server views&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Bundle Analyzer is in early development and will be improved further in future releases. Share your feedback on the dedicated &lt;a href=&quot;https://github.com/vercel/next.js/discussions/86731&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub discussion&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;easier-debugging-with-next-dev---inspect&quot; data-docs-heading=&quot;&quot;&gt;Easier Debugging with &lt;code&gt;next dev --inspect&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-1#easier-debugging-with-next-dev---inspect&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can now enable the &lt;a href=&quot;https://nodejs.org/en/learn/getting-started/debugging&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Node.js debugger&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; by passing &lt;code&gt;--inspect&lt;/code&gt; to &lt;code&gt;next dev&lt;/code&gt;. Previously this required passing &lt;code&gt;NODE_OPTIONS=--inspect&lt;/code&gt; and would attach the inspector to all processes spawned by Next.js instead of only to the process running your code.&lt;/p&gt;
&lt;h2 id=&quot;improved-handling-of-serverexternalpackages&quot; data-docs-heading=&quot;&quot;&gt;Improved Handling of &lt;code&gt;serverExternalPackages&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-1#improved-handling-of-serverexternalpackages&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js allows you to keep dependencies unbundled using &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/serverExternalPackages&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;serverExternalPackages&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;. Previously, this only worked reliably for direct dependencies. If you used a library that internally depends on something like &lt;code&gt;sqlite&lt;/code&gt;, and needed to externalize &lt;code&gt;sqlite&lt;/code&gt;, you&#39;d have to add it to your own &lt;code&gt;package.json&lt;/code&gt;—even though it&#39;s not your direct dependency. This workaround leaked internal implementation details, created maintenance burden, and could lead to impossible version conflicts when multiple packages required different versions of the same dependency.&lt;/p&gt;
&lt;p&gt;Next.js 16.1 fixes this for Turbopack, which now correctly resolves and externalizes transitive dependencies in &lt;code&gt;serverExternalPackages&lt;/code&gt; without additional configuration.&lt;/p&gt;
&lt;h2 id=&quot;other-updates&quot; data-docs-heading=&quot;&quot;&gt;Other Updates&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-1#other-updates&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;20MB smaller installs&lt;/strong&gt;: Next.js installs are about 20MB smaller thanks to simplifications in the Turbopack file system caching layer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New &lt;code&gt;next upgrade&lt;/code&gt; command&lt;/strong&gt;: A new &lt;a href=&quot;https://nextjs.org/docs/app/getting-started/upgrading#latest-version&quot;&gt;&lt;code&gt;next upgrade&lt;/code&gt;&lt;/a&gt; command makes upgrading easier. Going forward, you can just run this to upgrade Next.js versions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP &lt;code&gt;get_routes&lt;/code&gt; tool&lt;/strong&gt;: The &lt;a href=&quot;https://nextjs.org/docs/app/guides/mcp&quot;&gt;Next.js DevTools MCP server&lt;/a&gt; now has a &lt;code&gt;get_routes&lt;/code&gt; tool to get the full list of routes in your application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;generateStaticParams&lt;/code&gt; timing&lt;/strong&gt;: Time spent on &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/functions/generate-static-params&quot;&gt;&lt;code&gt;generateStaticParams&lt;/code&gt;&lt;/a&gt; is now logged as part of the timings shown for requests in development.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build worker logging&lt;/strong&gt;: &lt;code&gt;next build&lt;/code&gt; &quot;Collecting page data&quot; and &quot;Generating static pages&quot; now log the number of worker threads used.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved async import bundling&lt;/strong&gt;: Turbopack has improved bundling of async imports in dev to reduce the number of chunks produced, avoiding certain pathological but real-world cases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Relative source map paths&lt;/strong&gt;: Turbopack now produces source maps with relative file paths for server-side code, improving compatibility with Node.js and other ecosystem tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;feedback-and-community&quot; data-docs-heading=&quot;&quot;&gt;Feedback and Community&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-1#feedback-and-community&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Share your feedback and help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/discord&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discord Community&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;contributors&quot; data-docs-heading=&quot;&quot;&gt;Contributors&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-1#contributors&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js is the result of the combined work of over 3,700 individual developers. This release was brought to you by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The&amp;nbsp;&lt;strong&gt;Next.js&lt;/strong&gt;&amp;nbsp;team:&amp;nbsp;&lt;a href=&quot;https://github.com/acdlite&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Andrew&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/unstubbable&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Hendrik&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/lubieowoce&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Janka&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/huozhi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiachi&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/feedthejim&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jimmy&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/devjiwonchoi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiwon&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/ijjk&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;JJ&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/gnoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Josh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/gaojude&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jude&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://x.com/samselikoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sam&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/sebmarkbage&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebastian&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/eps1lon&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebbie&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/wyattjoh&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Wyatt&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and&amp;nbsp;&lt;a href=&quot;https://github.com/ztanner&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Zack&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The&amp;nbsp;&lt;strong&gt;Turbopack&lt;/strong&gt;&amp;nbsp;team:&amp;nbsp;&lt;a href=&quot;https://github.com/bgw&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Benjamin&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/lukesandberg&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Luke&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/mischnic&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Niklas&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/timneutkens&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tim&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/sokra&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tobias&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and&amp;nbsp;&lt;a href=&quot;https://github.com/wbinnssmith&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Will&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The&amp;nbsp;&lt;strong&gt;Next.js Docs&lt;/strong&gt;&amp;nbsp;team:&amp;nbsp;&lt;a href=&quot;https://github.com/delbaoliveira&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Delba&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/molebox&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Rich&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://github.com/ismaelrumzan&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Ismael&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and&amp;nbsp;&lt;a href=&quot;https://github.com/icyJoseph&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Joseph&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Huge thanks to @kdy1, @eps1lon, @SyMind, @bgw, @swarnava, @devjiwonchoi, @ztanner, @ijjk, @huozhi, @icyJoseph, @acdlite, @unstubbable, @gnoff, @gusfune, @lukesandberg, @sokra, @hayes, @shuding, @wyattjoh, @marjan-ahmed, @timneutkens, @ajstrongdev, @zigang93, @mischnic, @Nayeem-XTREME, @hamirmahal, @eli0shin, @tessamero, @gaojude, @jamesdaniels, @georgesfarah, @timeyoutakeit, @sequencerr, @Strernd, @lucasadrianof, @wbinnssmith, @hamidreza-nateghi, @jokokoloko, @dijonmusters, @H01001000, @xusd320, @lubieowoce, @KaziMahbuburRahman, @zhiyanzhaijie, @feedthejim, @that-one-arab, @JamBalaya56562, @shrink, @florianliebig, @allenzhou101, @benmerckx, @ymc9, @Marukome0743, @pyrytakala, @danpeleg4, @gaearon, @styfle, @jhuleatt, @muhammadsyaddad, @roelvan, and @SukkaW for helping!&lt;/p&gt;</description><link>https://nextjs.org/blog/next-16-1</link><guid isPermaLink="false">https://nextjs.org/blog/next-16-1</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js Security Update: December 11, 2025</title><description>&lt;p&gt;Two additional vulnerabilities have been identified in the React Server Components (RSC) protocol. These issues were discovered while security researchers examined the patches for &lt;a href=&quot;https://nextjs.org/blog/CVE-2025-66478&quot;&gt;React2Shell&lt;/a&gt;. &lt;strong&gt;Importantly, neither of these new issues allow for Remote Code Execution.&lt;/strong&gt; The patch for React2Shell remains fully effective.&lt;/p&gt;
&lt;p&gt;These vulnerabilities originate in the upstream React implementation (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55183&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;CVE-2025-55183&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55184&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;CVE-2025-55184&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;). This advisory tracks the downstream impact on Next.js applications using the App Router. For full details, see the &lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;React blog post&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;Addendum:&lt;/strong&gt; The initial fix for CVE-2025-55184 was incomplete. A complete fix has been issued under &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-67779&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;CVE-2025-67779&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;. If you previously upgraded to one of the initially recommended versions, please upgrade again to the latest patched versions listed below.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;impact&quot; data-docs-heading=&quot;&quot;&gt;Impact&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/security-update-2025-12-11#impact&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;denial-of-service-cve-2025-55184-high-severity&quot; data-docs-heading=&quot;&quot;&gt;Denial of Service: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55184&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;CVE-2025-55184&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; (High Severity)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/security-update-2025-12-11#denial-of-service-cve-2025-55184-high-severity&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A specifically crafted HTTP request can be sent to any App Router endpoint that, when deserialized, can cause an infinite loop that hangs the server process and prevents future HTTP requests from being served.&lt;/p&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The initial fix for this vulnerability was incomplete. A complete fix has been issued under &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-67779&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;CVE-2025-67779&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;. Users who previously upgraded must upgrade again to the latest patched versions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;source-code-exposure-cve-2025-55183-medium-severity&quot; data-docs-heading=&quot;&quot;&gt;Source Code Exposure: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55183&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;CVE-2025-55183&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; (Medium Severity)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/security-update-2025-12-11#source-code-exposure-cve-2025-55183-medium-severity&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A specifically crafted HTTP request can cause a Server Function to return the compiled source code of other &lt;a href=&quot;https://react.dev/reference/rsc/server-functions&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Server Functions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; in your application. This could reveal business logic. Secrets could also be exposed if they are defined directly in your code (rather than accessed via environment variables at runtime) and referenced within a Server Function. Depending on your bundler configuration, these values may be inlined into the compiled function output.&lt;/p&gt;
&lt;h2 id=&quot;affected-and-fixed-nextjs-versions&quot; data-docs-heading=&quot;&quot;&gt;Affected and Fixed Next.js Versions&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/security-update-2025-12-11#affected-and-fixed-nextjs-versions&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Applications using React Server Components with the App Router are affected. The table below shows which versions are affected by each vulnerability and the corresponding fix:&lt;/p&gt;
&lt;div class=&quot;overflow-x-auto&quot;&gt;&lt;table class=&quot;w-full table-auto&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Version&lt;/th&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;DoS (CVE-2025-55184)&lt;/th&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Source Code Exposure (CVE-2025-55183)&lt;/th&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Fixed In&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&amp;gt;=13.3&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;Upgrade to 14.2.35&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;14.x&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;14.2.35&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15.0.x&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;15.0.7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15.1.x&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;15.1.11&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15.2.x&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;15.2.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15.3.x&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;15.3.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15.4.x&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;15.4.10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15.5.x&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;15.5.9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15.x canary&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;15.6.0-canary.60&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;16.0.x&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;16.0.10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;16.x canary&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;16.1.0-canary.19&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Pages Router applications are not affected, but we still recommend upgrading to a patched version.&lt;/p&gt;
&lt;h2 id=&quot;required-action&quot; data-docs-heading=&quot;&quot;&gt;Required Action&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/security-update-2025-12-11#required-action&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;All users should upgrade to the latest patched version in their release line:&lt;/p&gt;
&lt;p&gt;If you are on Next.js &amp;gt;=13.3, 14.0.x, or 14.1.x, upgrade to the latest 14.2.x release.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;Terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@14.2.35&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  # for 14.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.0.7&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.0.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.1.11&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  # for 15.1.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.2.8&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.2.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.3.8&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.3.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.4.10&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  # for 15.4.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.5.9&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.5.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@16.0.10&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  # for 16.0.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.6.0-canary.60&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.x canary releases&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@16.1.0-canary.19&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 16.x canary releases&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Run &lt;code&gt;npx fix-react2shell-next&lt;/code&gt; to launch an interactive tool which can check versions and perform deterministic version bumps per the recommended versions above. See the &lt;a href=&quot;https://github.com/vercel-labs/fix-react2shell-next&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub repository&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for full details.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;Terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; fix-react2shell-next&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There is no workaround. Upgrading to a patched version is required.&lt;/p&gt;
&lt;h2 id=&quot;resources&quot; data-docs-heading=&quot;&quot;&gt;Resources&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/security-update-2025-12-11#resources&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2025-67779 (Complete DoS Fix): &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-67779&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;CVE&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-5j59-xgg2-r9c4&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Next.js&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CVE-2025-55184 (DoS): &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55184&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;React&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-mwv6-3258-q52c&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Next.js&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CVE-2025-55183 (Source Code Exposure): &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55183&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;React&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-w37m-7fhw-fmv9&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Next.js&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;React blog: Denial of Service and Source Code Exposure in React Server Components&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/CVE-2025-66478&quot;&gt;Previous Security Advisory: CVE-2025-66478&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;discovery&quot; data-docs-heading=&quot;&quot;&gt;Discovery&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/security-update-2025-12-11#discovery&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Thank you to &lt;a href=&quot;https://ryotak.net/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;RyotaK&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; from GMO Flatt Security Inc. and &lt;a href=&quot;https://github.com/AndrewMohawk&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Andrew MacPherson&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for discovering and responsibly disclosing these vulnerabilities. We are intentionally limiting technical detail in this advisory to protect developers who have not yet upgraded.&lt;/p&gt;</description><link>https://nextjs.org/blog/security-update-2025-12-11</link><guid isPermaLink="false">https://nextjs.org/blog/security-update-2025-12-11</guid><pubDate>Invalid Date</pubDate></item><item><title>Security Advisory: CVE-2025-66478</title><description>&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;December 06, 9:05 PM PST:&lt;/strong&gt; If your application was online and unpatched as of December 4th, 2025 at 1:00 PM PT, we strongly encourage you to rotate any secrets it uses, starting with your most critical ones.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;December 06, 7:29 AM PST:&lt;/strong&gt; An npm package has been released to update affected Next.js apps. Use &lt;code&gt;npx fix-react2shell-next&lt;/code&gt; to update now, or visit the &lt;a href=&quot;https://github.com/vercel-labs/fix-react2shell-next&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub repository&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A critical vulnerability has been identified in the React Server Components (RSC) protocol. The issue is rated CVSS 10.0 and can allow remote code execution when processing attacker-controlled requests in unpatched environments.&lt;/p&gt;
&lt;p&gt;This vulnerability originates in the upstream React implementation (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55182&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;CVE-2025-55182&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;). This advisory (&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-9qr9-h5gf-34mp&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;CVE-2025-66478&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;) tracks the downstream impact on Next.js applications using the App Router.&lt;/p&gt;
&lt;h2 id=&quot;impact&quot; data-docs-heading=&quot;&quot;&gt;Impact&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/CVE-2025-66478#impact&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The vulnerable RSC protocol allowed untrusted inputs to influence server-side execution behavior. Under specific conditions, an attacker could craft requests that trigger unintended server execution paths. This can result in remote code execution in unpatched environments.&lt;/p&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;All users should upgrade to a patched version immediately. See the &lt;a href=&quot;https://nextjs.org/blog/CVE-2025-66478#required-action&quot;&gt;required action&lt;/a&gt; section for specific instructions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;affected-nextjs-versions&quot; data-docs-heading=&quot;&quot;&gt;Affected Next.js Versions&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/CVE-2025-66478#affected-nextjs-versions&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Applications using React Server Components with the App Router are affected when running:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next.js 15.x&lt;/li&gt;
&lt;li&gt;Next.js 16.x&lt;/li&gt;
&lt;li&gt;Next.js 14.3.0-canary.77 and later canary releases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next.js 13.x, Next.js 14.x stable, Pages Router applications, and the Edge Runtime are not affected.&lt;/p&gt;
&lt;h2 id=&quot;fixed-versions&quot; data-docs-heading=&quot;&quot;&gt;Fixed Versions&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/CVE-2025-66478#fixed-versions&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The vulnerability is fully resolved in the following patched Next.js releases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;15.0.5&lt;/li&gt;
&lt;li&gt;15.1.9&lt;/li&gt;
&lt;li&gt;15.2.6&lt;/li&gt;
&lt;li&gt;15.3.6&lt;/li&gt;
&lt;li&gt;15.4.8&lt;/li&gt;
&lt;li&gt;15.5.7&lt;/li&gt;
&lt;li&gt;16.0.7&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We also released patched canary releases for Next.js 15 and 16:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;15.6.0-canary.58 (for 15.x canary releases)&lt;/li&gt;
&lt;li&gt;16.1.0-canary.12 (for 16.x canary releases)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These versions include the hardened React Server Components implementation.&lt;/p&gt;
&lt;h2 id=&quot;required-action&quot; data-docs-heading=&quot;&quot;&gt;Required Action&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/CVE-2025-66478#required-action&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;All users should upgrade to the latest patched version in their release line:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;Terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.0.5&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.0.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.1.9&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.1.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.2.6&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.2.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.3.6&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.3.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.4.8&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.4.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.5.7&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.5.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@16.0.7&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 16.0.x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@15.6.0-canary.58&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 15.x canary releases&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@16.1.0-canary.12&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;   # for 16.x canary releases&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you are on Next.js 14.3.0-canary.77 or a later canary release, downgrade to the latest stable 14.x release:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;Terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@14&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you&#39;re currently using canary releases to enable PPR, you can update to 15.6.0-canary.58, which includes a fix for the vulnerability while continuing to support PPR. For other ways to patch older versions, see this &lt;a href=&quot;https://github.com/vercel/next.js/discussions/86813&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;discussion post&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Run &lt;code&gt;npx fix-react2shell-next&lt;/code&gt; to launch an interactive tool which can check versions and perform deterministic version bumps per the recommended versions above. See the &lt;a href=&quot;https://github.com/vercel-labs/fix-react2shell-next&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub repository&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for full details.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;Terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; fix-react2shell-next&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There is no workaround—upgrading to a patched version is required.&lt;/p&gt;
&lt;h3 id=&quot;rotating-environment-variables&quot; data-docs-heading=&quot;&quot;&gt;Rotating environment variables&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/CVE-2025-66478#rotating-environment-variables&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Once you have patched your version and re-deployed your application, we recommend rotating all your application secrets. Learn about working with environment variables in the documentation &lt;a href=&quot;https://nextjs.org/docs/app/guides/environment-variables&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;here&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;resources&quot; data-docs-heading=&quot;&quot;&gt;Resources&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/CVE-2025-66478#resources&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Security advisories: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-55182&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;React (CVE-2025-55182)&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-9qr9-h5gf-34mp&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Next.js (CVE-2025-66478)&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;React blog: Critical Security Vulnerability in React Server Components&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vercel.com/kb/bulletin/react2shell&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Vercel Knowledge Base: React2Shell Security Bulletin&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ntl.fyi/cve-2025-55182&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Netlify Blog: Netlify&#39;s response to the critical React security vulnerability&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://aws.amazon.com/blogs/security/china-nexus-cyber-threat-groups-rapidly-exploit-react2shell-vulnerability-cve-2025-55182/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;AWS Security Blog: China-nexus cyber threat groups rapidly exploit React2Shell vulnerability&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloud.google.com/blog/products/identity-security/responding-to-cve-2025-55182&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Google Cloud Blog: Responding to CVE-2025-55182: Secure your React and Next.js workloads&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.fastly.com/blog/fastlys-proactive-protection-critical-react-rce-cve-2025-55182&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Fastly Blog: Fastly&#39;s Proactive Protection for React2Shell, Critical React RCE CVE-2025-55182 and CVE-2025-66478&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akamai.com/blog/security-research/cve-2025-55182-react-nextjs-server-functions-deserialization-rce&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Akamai Blog: CVE-2025-55182: React and Next.js Server Functions Deserialization RCE&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;discovery&quot; data-docs-heading=&quot;&quot;&gt;Discovery&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/CVE-2025-66478#discovery&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Thank you to &lt;a href=&quot;https://github.com/lachlan2k&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Lachlan Davidson&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for discovering and responsibly disclosing this vulnerability. We are intentionally limiting technical detail in this advisory to protect developers who have not yet upgraded.&lt;/p&gt;</description><link>https://nextjs.org/blog/CVE-2025-66478</link><guid isPermaLink="false">https://nextjs.org/blog/CVE-2025-66478</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js 16</title><description>&lt;p&gt;Ahead of our upcoming &lt;a href=&quot;https://nextjs.org/conf&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Next.js Conf 2025&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, Next.js 16 is now available.&lt;/p&gt;
&lt;p&gt;This release provides the latest improvements to Turbopack, caching, and the Next.js architecture. Since the previous beta release, we added several new features and improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#cache-components&quot;&gt;&lt;strong&gt;Cache Components&lt;/strong&gt;&lt;/a&gt;: New model using Partial Pre-Rendering (PPR) and use cache for instant navigation.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#nextjs-devtools-mcp&quot;&gt;&lt;strong&gt;Next.js Devtools MCP&lt;/strong&gt;&lt;/a&gt;: Model Context Protocol integration for improved debugging and workflow.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#proxyts-formerly-middlewarets&quot;&gt;&lt;strong&gt;Proxy&lt;/strong&gt;&lt;/a&gt;: Middleware replaced by &lt;code&gt;proxy.ts&lt;/code&gt; to clarify network boundary.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#logging-improvements&quot;&gt;&lt;strong&gt;DX&lt;/strong&gt;&lt;/a&gt;: Improved logging for builds and development requests.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For reminder, those features were available since the previous beta release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#turbopack-stable&quot;&gt;&lt;strong&gt;Turbopack (stable)&lt;/strong&gt;&lt;/a&gt;: Default bundler for all apps with up to 5-10x faster Fast Refresh, and 2-5x faster builds&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#turbopack-file-system-caching-beta&quot;&gt;&lt;strong&gt;Turbopack File System Caching (beta)&lt;/strong&gt;&lt;/a&gt;: Even faster startup and compile times for the largest apps&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#react-compiler-support-stable&quot;&gt;&lt;strong&gt;React Compiler Support (stable)&lt;/strong&gt;&lt;/a&gt;: Built-in integration for automatic memoization&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#build-adapters-api-alpha&quot;&gt;&lt;strong&gt;Build Adapters API (alpha)&lt;/strong&gt;&lt;/a&gt;: Create custom adapters to modify the build process&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#enhanced-routing-and-navigation&quot;&gt;&lt;strong&gt;Enhanced Routing&lt;/strong&gt;&lt;/a&gt;: Optimized navigations and prefetching with layout deduplication and incremental prefetching&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#improved-caching-apis&quot;&gt;&lt;strong&gt;Improved Caching APIs&lt;/strong&gt;&lt;/a&gt;: New &lt;code&gt;updateTag()&lt;/code&gt; and refined &lt;code&gt;revalidateTag()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#react-192-and-canary-features&quot;&gt;&lt;strong&gt;React 19.2&lt;/strong&gt;&lt;/a&gt;: View Transitions, &lt;code&gt;useEffectEvent()&lt;/code&gt;, &lt;code&gt;&amp;lt;Activity/&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16#breaking-changes-and-other-updates&quot;&gt;&lt;strong&gt;Breaking Changes&lt;/strong&gt;&lt;/a&gt;: Async params, &lt;code&gt;next/image&lt;/code&gt; defaults, and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Upgrade to Next.js 16:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Use the automated upgrade CLI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; @next/codemod@canary&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; upgrade&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or upgrade manually&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react-dom@latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or start a new project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; create-next-app@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For cases where the codemod can&#39;t fully migrate your code, please read the &lt;a href=&quot;https://nextjs.org/docs/app/guides/upgrading/version-16&quot;&gt;upgrade guide&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;new-features-and-improvements&quot; data-docs-heading=&quot;&quot;&gt;New Features and Improvements&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#new-features-and-improvements&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;cache-components&quot; data-docs-heading=&quot;&quot;&gt;Cache Components&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#cache-components&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Cache Components are a new set of features designed to make caching in Next.js both more explicit, and more flexible. They center around the new &lt;code&gt;&quot;use cache&quot;&lt;/code&gt; directive, which can be used to cache pages, components, and functions, and which leverages the compiler to automatically generate cache keys wherever it’s used.&lt;/p&gt;
&lt;p&gt;Unlike the implicit caching found in previous versions of the App Router, caching with Cache Components is entirely opt-in. All dynamic code in any page, layout, or API route is executed at request time by default, giving Next.js an out-of-the-box experience that’s better aligned with what developers expect from a full-stack application framework.&lt;/p&gt;
&lt;p&gt;Cache Components also complete the story of Partial Prerendering (PPR), which was first introduced in 2023. Prior to PPR, Next.js had to choose whether to render each URL statically or dynamically; there was no middle ground. PPR eliminated this dichotomy, and let developers opt portions of their static pages into dynamic rendering (via Suspense) without sacrificing the fast initial load of fully static pages.&lt;/p&gt;
&lt;p&gt;You can enable Cache Components in your &lt;code&gt;next.config.ts&lt;/code&gt; file:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  cacheComponents&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We will be sharing more about Cache Components and how to use them at &lt;a href=&quot;https://nextjs.org/conf&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Next.js Conf 2025&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; on October 22nd, and we will be sharing more content in our blog and documentation in the coming weeks.&lt;/p&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; as previously announced in the beta release, the previous experimental &lt;code&gt;experimental.ppr&lt;/code&gt; flag and configuration options have been removed in favor of the Cache Components configuration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Learn more in the documentation &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/config/next-config-js/cacheComponents&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;nextjs-devtools-mcp&quot; data-docs-heading=&quot;&quot;&gt;Next.js Devtools MCP&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#nextjs-devtools-mcp&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Next.js 16 introduces &lt;strong&gt;Next.js DevTools MCP&lt;/strong&gt;, a Model Context Protocol integration for AI-assisted debugging with contextual insight into your application.&lt;/p&gt;
&lt;p&gt;The Next.js DevTools MCP provides AI agents with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Next.js knowledge&lt;/strong&gt;: Routing, caching, and rendering behavior&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified logs&lt;/strong&gt;: Browser and server logs without switching contexts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatic error access&lt;/strong&gt;: Detailed stack traces without manual copying&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Page awareness&lt;/strong&gt;: Contextual understanding of the active route&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This enables AI agents to diagnose issues, explain behavior, and suggest fixes directly within your development workflow.&lt;/p&gt;
&lt;p&gt;Learn more in the documentation &lt;a href=&quot;https://nextjs.org/docs/app/guides/mcp&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;proxyts-formerly-middlewarets&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;proxy.ts&lt;/code&gt; (formerly &lt;code&gt;middleware.ts&lt;/code&gt;)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#proxyts-formerly-middlewarets&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;proxy.ts&lt;/code&gt; replaces &lt;code&gt;middleware.ts&lt;/code&gt; and makes the app’s network boundary explicit. &lt;code&gt;proxy.ts&lt;/code&gt; runs on the Node.js runtime.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What to do&lt;/strong&gt;: Rename &lt;code&gt;middleware.ts&lt;/code&gt; → &lt;code&gt;proxy.ts&lt;/code&gt; and rename the exported function to &lt;code&gt;proxy&lt;/code&gt;. Logic stays the same.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Why&lt;/strong&gt;: Clearer naming and a single, predictable runtime for request interception.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;proxy.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; proxy&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(request&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; NextRequest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; NextResponse&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.redirect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;/home&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; request&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.url));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The &lt;code&gt;middleware.ts&lt;/code&gt; file is still available for Edge runtime use cases, but it is deprecated and will be removed in a future version.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Learn more in the documentation &lt;a href=&quot;https://nextjs.org/docs/app/getting-started/proxy&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;logging-improvements&quot; data-docs-heading=&quot;&quot;&gt;Logging Improvements&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#logging-improvements&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In Next.js 16 the development request logs are extended showing where time is spent.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compile: Routing and compilation&lt;/li&gt;
&lt;li&gt;Render: Running your code and React rendering&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;flex justify-center&quot;&gt;&lt;figure&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;656.3636363636363&quot; height=&quot;373.6363636363636&quot; decoding=&quot;async&quot; data-nimg=&quot;1&quot; class=&quot;rounded-md border border-gray-200 bg-gray-100&quot; style=&quot;color:transparent&quot; srcset=&quot;/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16%2Fdevelopment-log.jpg&amp;amp;w=750&amp;amp;q=75 1x, /_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16%2Fdevelopment-log.jpg&amp;amp;w=1920&amp;amp;q=75 2x&quot; src=&quot;https://nextjs.org/_next/image?url=https%3A%2F%2Fh8DxKfmAPhn8O0p3.public.blob.vercel-storage.com%2Fstatic%2Fblog%2Fnext-16%2Fdevelopment-log.jpg&amp;amp;w=1920&amp;amp;q=75&quot; referrerpolicy=&quot;no-referrer&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The build is also extended to show where time is spent. Each step in the build process is now shown with the time it took to complete.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;   ▲&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Next.js&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 16&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (Turbopack)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; ✓&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Compiled&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; successfully&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; 615ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; ✓&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Finished&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; TypeScript&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; 1114ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; ✓&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Collecting&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; 208ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; ✓&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Generating&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; static&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; pages&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; 239ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; ✓&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; Finalizing&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; optimization&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; in&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; 5ms&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;The following features were &lt;a href=&quot;https://nextjs.org/blog/next-16-beta&quot;&gt;previously&lt;/a&gt; announced in the beta release:&lt;/p&gt;
&lt;h3 id=&quot;developer-experience&quot; data-docs-heading=&quot;&quot;&gt;Developer Experience&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#developer-experience&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;turbopack-stable&quot; data-docs-heading=&quot;&quot;&gt;Turbopack (stable)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#turbopack-stable&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Turbopack has reached stability for both development and production builds, and is now the default bundler for all new Next.js projects. Since its beta release earlier this summer, adoption has scaled rapidly: more than 50% of development sessions and 20% of production builds on Next.js 15.3+ are already running on Turbopack.&lt;/p&gt;
&lt;p&gt;With Turbopack, you can expect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2–5× faster production builds&lt;/li&gt;
&lt;li&gt;Up to 10× faster Fast Refresh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&#39;re making Turbopack the default to bring these performance gains to every Next.js developer, no configuration required. For apps with custom webpack setups, you can continue using webpack by running:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; dev&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; --webpack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; --webpack&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;turbopack-file-system-caching-beta&quot; data-docs-heading=&quot;&quot;&gt;Turbopack File System Caching (beta)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#turbopack-file-system-caching-beta&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Turbopack now supports filesystem caching in development, storing compiler artifacts on disk between runs for significantly faster compile times across restarts, especially in large projects.&lt;/p&gt;
&lt;p&gt;Enable filesystem caching in your configuration:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    turbopackFileSystemCacheForDev&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All internal Vercel apps are already using this feature, and we’ve seen notable improvements in developer productivity across large repositories.&lt;/p&gt;
&lt;p&gt;We’d love to hear your feedback as we iterate on filesystem caching. Please try it out and share your experience.&lt;/p&gt;
&lt;h4 id=&quot;simplified-create-next-app&quot; data-docs-heading=&quot;&quot;&gt;Simplified &lt;code&gt;create-next-app&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#simplified-create-next-app&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;create-next-app&lt;/code&gt; has been redesigned with a simplified setup flow, updated project structure, and improved defaults. The new template includes the App Router by default, TypeScript-first configuration, Tailwind CSS, and ESLint.&lt;/p&gt;
&lt;h4 id=&quot;build-adapters-api-alpha&quot; data-docs-heading=&quot;&quot;&gt;Build Adapters API (alpha)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#build-adapters-api-alpha&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Following the &lt;a href=&quot;https://github.com/vercel/next.js/discussions/77740&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Build Adapters RFC&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, we&#39;ve worked with the community and deployment platforms to deliver the first alpha version of the Build Adapters API.&lt;/p&gt;
&lt;p&gt;Build Adapters allow you to create custom adapters that hook into the build process, enabling deployment platforms and custom build integrations to modify Next.js configuration or process build output.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg height=&quot;17&quot; style=&quot;margin-left:-1.5px&quot; viewBox=&quot;0 0 50 50&quot; width=&quot;17&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M 43.335938 4 L 6.667969 4 C 5.195313 4 4 5.195313 4 6.667969 L 4 43.332031 C 4 44.804688 5.195313 46 6.667969 46 L 43.332031 46 C 44.804688 46 46 44.804688 46 43.335938 L 46 6.667969 C 46 5.195313 44.804688 4 43.335938 4 Z M 27 36.183594 C 27 40.179688 24.65625 42 21.234375 42 C 18.140625 42 15.910156 39.925781 15 38 L 18.144531 36.097656 C 18.75 37.171875 19.671875 38 21 38 C 22.269531 38 23 37.503906 23 35.574219 L 23 23 L 27 23 Z M 35.675781 42 C 32.132813 42 30.121094 40.214844 29 38 L 32 36 C 32.816406 37.335938 33.707031 38.613281 35.589844 38.613281 C 37.171875 38.613281 38 37.824219 38 36.730469 C 38 35.425781 37.140625 34.960938 35.402344 34.199219 L 34.449219 33.789063 C 31.695313 32.617188 29.863281 31.148438 29.863281 28.039063 C 29.863281 25.179688 32.046875 23 35.453125 23 C 37.878906 23 39.621094 23.84375 40.878906 26.054688 L 37.910156 27.964844 C 37.253906 26.789063 36.550781 26.328125 35.453125 26.328125 C 34.335938 26.328125 33.628906 27.039063 33.628906 27.964844 C 33.628906 29.109375 34.335938 29.570313 35.972656 30.28125 L 36.925781 30.691406 C 40.171875 32.078125 42 33.496094 42 36.683594 C 42 40.117188 39.300781 42 35.675781 42 Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.js&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    adapterPath&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.resolve&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;./my-adapter.js&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;exports&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Share your feedback in the &lt;a href=&quot;https://github.com/vercel/next.js/discussions/77740&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;RFC discussion&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h4 id=&quot;react-compiler-support-stable&quot; data-docs-heading=&quot;&quot;&gt;React Compiler Support (stable)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#react-compiler-support-stable&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Built-in support for the React Compiler is now stable in Next.js 16 following the React Compiler&#39;s 1.0 release. The React Compiler automatically memoizes components, reducing unnecessary re-renders with zero manual code changes.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;reactCompiler&lt;/code&gt; configuration option has been promoted from &lt;code&gt;experimental&lt;/code&gt; to stable. It is not enabled by default as we continue gathering build performance data across different application types. Expect compile times in development and during builds to be higher when enabling this option as the React Compiler relies on Babel.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  reactCompiler&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Install the latest version of the React Compiler plugin:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; babel-plugin-react-compiler@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;core-features--architecture&quot; data-docs-heading=&quot;&quot;&gt;Core Features &amp;amp; Architecture&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#core-features--architecture&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;enhanced-routing-and-navigation&quot; data-docs-heading=&quot;&quot;&gt;Enhanced Routing and Navigation&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#enhanced-routing-and-navigation&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Next.js 16 includes a complete overhaul of the routing and navigation system,
making page transitions leaner and faster.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layout deduplication&lt;/strong&gt;: When prefetching multiple URLs with a shared layout, the layout is downloaded once instead of separately for each Link. For example, a page with 50 product links now downloads the shared layout once instead of 50 times, dramatically reducing the network transfer size.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Incremental prefetching&lt;/strong&gt;: Next.js only prefetches parts not already in cache, rather than entire pages. The prefetch cache now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cancels requests when the link leaves the viewport&lt;/li&gt;
&lt;li&gt;Prioritizes link prefetching on hover or when re-entering the viewport&lt;/li&gt;
&lt;li&gt;Re-prefetches links when their data is invalidated&lt;/li&gt;
&lt;li&gt;Works seamlessly with upcoming features like Cache Components&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Trade-off&lt;/strong&gt;: You may see more individual prefetch requests, but with much lower total transfer sizes. We believe this is the right trade-off for nearly all applications. If the increased request count causes issues, please let us know. We&#39;re working on additional optimizations to inline data chunks more efficiently.&lt;/p&gt;
&lt;p&gt;These changes require no code modifications and are designed to improve performance across all apps.&lt;/p&gt;
&lt;h4 id=&quot;improved-caching-apis&quot; data-docs-heading=&quot;&quot;&gt;Improved Caching APIs&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#improved-caching-apis&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Next.js 16 introduces refined caching APIs for more explicit control over cache behavior.&lt;/p&gt;
&lt;h5 id=&quot;revalidatetag-updated&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;revalidateTag()&lt;/code&gt; (updated)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#revalidatetag-updated&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;revalidateTag()&lt;/code&gt; now requires a &lt;strong&gt;&lt;a href=&quot;https://nextjs.org/docs/app/api-reference/functions/cacheLife#reference&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cacheLife&lt;/code&gt; profile&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt; as the second argument to enable stale-while-revalidate (SWR) behavior:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { revalidateTag } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/cache&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ✅ Use built-in cacheLife profile (we recommend &#39;max&#39; for most cases)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;revalidateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;blog-posts&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;max&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// Or use other built-in profiles&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;revalidateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;news-feed&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;hours&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;revalidateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;analytics&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;days&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// Or use an inline object with a custom revalidation time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;revalidateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;products&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { expire&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 3600&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ⚠️ Deprecated - single argument form&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;revalidateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;blog-posts&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The profile argument accepts built-in &lt;code&gt;cacheLife&lt;/code&gt; profile names (like &lt;code&gt;&#39;max&#39;&lt;/code&gt;, &lt;code&gt;&#39;hours&#39;&lt;/code&gt;, &lt;code&gt;&#39;days&#39;&lt;/code&gt;) or &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/functions/cacheLife#defining-reusable-cache-profiles&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;custom profiles&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; defined in your &lt;code&gt;next.config&lt;/code&gt;. You can also pass an inline &lt;code&gt;{ expire: number }&lt;/code&gt; object. We recommend using &lt;code&gt;&#39;max&#39;&lt;/code&gt; for most cases, as it enables background revalidation for long-lived content. When users request tagged content, they receive cached data immediately while Next.js revalidates in the background.&lt;/p&gt;
&lt;p&gt;Use &lt;code&gt;revalidateTag()&lt;/code&gt; when you want to invalidate only properly tagged cached entries with stale-while-revalidate behavior. This is ideal for static content that can tolerate eventual consistency.&lt;/p&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;Migration guidance:&lt;/strong&gt; Add the second argument with a &lt;code&gt;cacheLife&lt;/code&gt; profile (we recommend &lt;code&gt;&#39;max&#39;&lt;/code&gt;) for SWR behavior, or use &lt;code&gt;updateTag()&lt;/code&gt; in Server Actions if you need read-your-writes semantics.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5 id=&quot;updatetag-new&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;updateTag()&lt;/code&gt; (new)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#updatetag-new&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;updateTag()&lt;/code&gt; is a new Server Actions-only API that provides &lt;strong&gt;read-your-writes&lt;/strong&gt; semantics, expiring and immediately reading fresh data within the same request:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;use server&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { updateTag } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/cache&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; updateUserProfile&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(userId&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; profile&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; Profile&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; db&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;users&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.update&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(userId&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; profile);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Expire cache and refresh immediately - user sees their changes right away&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;  updateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;`user-&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;userId&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This ensures interactive features reflect changes immediately. Perfect for forms, user settings, and any workflow where users expect to see their updates instantly.&lt;/p&gt;
&lt;h5 id=&quot;refresh-new&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;refresh()&lt;/code&gt; (new)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#refresh-new&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;refresh()&lt;/code&gt; is a new Server Actions-only API for refreshing &lt;strong&gt;uncached data only&lt;/strong&gt;. It doesn&#39;t touch the cache at all:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;use server&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { refresh } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/cache&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; markNotificationAsRead&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(notificationId&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Update the notification in the database&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; db&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;notifications&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.markAsRead&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(notificationId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Refresh the notification count displayed in the header&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // (which is fetched separately and not cached)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;  refresh&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This API is complementary to the client-side &lt;code&gt;router.refresh()&lt;/code&gt;. Use it when you need to refresh uncached data displayed elsewhere on the page after performing an action. Your cached page shells and static content remain fast while dynamic data like notification counts, live metrics, or status indicators refresh.&lt;/p&gt;
&lt;h4 id=&quot;react-192-and-canary-features&quot; data-docs-heading=&quot;&quot;&gt;React 19.2 and Canary Features&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#react-192-and-canary-features&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The App Router in Next.js 16 uses the latest React &lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Canary release&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, which includes the newly released React 19.2 features and other features being incrementally stabilized. Highlights include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://react.dev/reference/react/ViewTransition&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;View Transitions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Animate elements that update inside a Transition or navigation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://react.dev/reference/react/useEffectEvent&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;useEffectEvent&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Extract non-reactive logic from Effects into reusable Effect Event functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://react.dev/reference/react/Activity&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Activity&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Render &quot;background activity&quot; by hiding UI with &lt;code&gt;display: none&lt;/code&gt; while maintaining state and cleaning up Effects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learn more in the &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;React 19.2 announcement&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;breaking-changes-and-other-updates&quot; data-docs-heading=&quot;&quot;&gt;Breaking Changes and Other Updates&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#breaking-changes-and-other-updates&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;h4 id=&quot;version-requirements&quot; data-docs-heading=&quot;&quot;&gt;Version Requirements&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#version-requirements&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;div class=&quot;overflow-x-auto&quot;&gt;&lt;table class=&quot;w-full table-auto&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Change&lt;/th&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Details&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Node.js 20.9+&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Minimum version now 20.9.0 (LTS); Node.js 18 no longer supported&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;TypeScript 5+&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Minimum version now 5.1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Browsers&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Chrome 111+, Edge 111+, Firefox 111+, Safari 16.4+&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h4 id=&quot;removals&quot; data-docs-heading=&quot;&quot;&gt;Removals&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#removals&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;These features were previously deprecated and are now removed:&lt;/p&gt;
&lt;div class=&quot;overflow-x-auto&quot;&gt;&lt;table class=&quot;w-full table-auto&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Removed&lt;/th&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Replacement&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;AMP support&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;All AMP APIs and configs removed (&lt;code&gt;useAmp&lt;/code&gt;, &lt;code&gt;export const config = { amp: true }&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;next lint&lt;/code&gt; command&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Use Biome or ESLint directly; &lt;code&gt;next build&lt;/code&gt; no longer runs linting. A codemod is available: &lt;code&gt;npx @next/codemod@canary next-lint-to-eslint-cli .&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;devIndicators&lt;/code&gt; options&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;appIsrStatus&lt;/code&gt;, &lt;code&gt;buildActivity&lt;/code&gt;, &lt;code&gt;buildActivityPosition&lt;/code&gt; removed from config. The indicator remains.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;serverRuntimeConfig&lt;/code&gt;, &lt;code&gt;publicRuntimeConfig&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Use environment variables (&lt;code&gt;.env&lt;/code&gt; files)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;experimental.turbopack&lt;/code&gt; location&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Config moved to top-level &lt;code&gt;turbopack&lt;/code&gt; (no longer in &lt;code&gt;experimental&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;experimental.dynamicIO&lt;/code&gt; flag&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Renamed to &lt;code&gt;cacheComponents&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;experimental.ppr&lt;/code&gt; flag&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;PPR flag removed; evolving into Cache Components programming model&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;export const experimental_ppr&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Route-level PPR export removed; evolving into Cache Components programming model&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Automatic &lt;code&gt;scroll-behavior: smooth&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Add &lt;code&gt;data-scroll-behavior=&quot;smooth&quot;&lt;/code&gt; to HTML document to opt back in&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;unstable_rootParams()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;We are working on an alternative API that we will ship in an upcoming minor&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Sync &lt;code&gt;params&lt;/code&gt;, &lt;code&gt;searchParams&lt;/code&gt; props&lt;/strong&gt; access&lt;/td&gt;&lt;td&gt;Must use async: &lt;code&gt;await params&lt;/code&gt;, &lt;code&gt;await searchParams&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Sync &lt;code&gt;cookies()&lt;/code&gt;, &lt;code&gt;headers()&lt;/code&gt;, &lt;code&gt;draftMode()&lt;/code&gt;&lt;/strong&gt; access&lt;/td&gt;&lt;td&gt;Must use async: &lt;code&gt;await cookies()&lt;/code&gt;, &lt;code&gt;await headers()&lt;/code&gt;, &lt;code&gt;await draftMode()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Metadata image route &lt;code&gt;params&lt;/code&gt; argument&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Changed to async &lt;code&gt;params&lt;/code&gt;; &lt;code&gt;id&lt;/code&gt; from &lt;code&gt;generateImageMetadata&lt;/code&gt; now &lt;code&gt;Promise&amp;lt;string&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;next/image&lt;/code&gt; local src with query strings&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Now requires &lt;code&gt;images.localPatterns&lt;/code&gt; config to prevent enumeration attacks&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h4 id=&quot;behavior-changes&quot; data-docs-heading=&quot;&quot;&gt;Behavior Changes&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#behavior-changes&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;These features have new default behaviors in Next.js 16:&lt;/p&gt;
&lt;div class=&quot;overflow-x-auto&quot;&gt;&lt;table class=&quot;w-full table-auto&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Changed Behavior&lt;/th&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Details&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Default bundler&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Turbopack is now the default bundler for all apps; opt out with &lt;code&gt;next build --webpack&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;images.minimumCacheTTL&lt;/code&gt; default&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Changed from 60s to 4 hours (14400s); reduces revalidation cost for images without cache-control headers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;images.imageSizes&lt;/code&gt; default&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Removed &lt;code&gt;16&lt;/code&gt; from default sizes (used by only 4.2% of projects); reduces srcset size and API variations&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;images.qualities&lt;/code&gt; default&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Changed from &lt;code&gt;[1..100]&lt;/code&gt; to &lt;code&gt;[75]&lt;/code&gt;; &lt;code&gt;quality&lt;/code&gt; prop is now coerced to closest value in &lt;code&gt;images.qualities&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;images.dangerouslyAllowLocalIP&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;New security restriction blocks local IP optimization by default; set to &lt;code&gt;true&lt;/code&gt; for private networks only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;images.maximumRedirects&lt;/code&gt; default&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Changed from unlimited to 3 redirects maximum; set to &lt;code&gt;0&lt;/code&gt; to disable or increase for rare edge cases&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;@next/eslint-plugin-next&lt;/code&gt; default&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Now defaults to ESLint Flat Config format, aligning with ESLint v10 which will drop legacy config support&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Prefetch cache behavior&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Complete rewrite with layout deduplication and incremental prefetching&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;revalidateTag()&lt;/code&gt; signature&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Now requires &lt;code&gt;cacheLife&lt;/code&gt; profile as second argument for stale-while-revalidate behavior&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Babel configuration in Turbopack&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Automatically enables Babel if a babel config is found (previously exited with hard error)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Terminal output&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Redesigned with clearer formatting, better error messages, and improved performance metrics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Dev and build output directories&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;next dev&lt;/code&gt; and &lt;code&gt;next build&lt;/code&gt; now use separate output directories, enabling concurrent execution&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Lockfile behavior&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Added lockfile mechanism to prevent multiple &lt;code&gt;next dev&lt;/code&gt; or &lt;code&gt;next build&lt;/code&gt; instances on the same project&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Parallel routes &lt;code&gt;default.js&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;All parallel route slots now require explicit &lt;code&gt;default.js&lt;/code&gt; files; builds fail without them. Create &lt;code&gt;default.js&lt;/code&gt; that calls &lt;code&gt;notFound()&lt;/code&gt; or returns &lt;code&gt;null&lt;/code&gt; for previous behavior&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Modern Sass API&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Bumped &lt;code&gt;sass-loader&lt;/code&gt; to v16, which supports modern Sass syntax and new features&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h4 id=&quot;deprecations&quot; data-docs-heading=&quot;&quot;&gt;Deprecations&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#deprecations&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;These features are deprecated in Next.js 16 and will be removed in a future version:&lt;/p&gt;
&lt;div class=&quot;overflow-x-auto&quot;&gt;&lt;table class=&quot;w-full table-auto&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Deprecated&lt;/th&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Details&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;middleware.ts&lt;/code&gt; filename&lt;/td&gt;&lt;td&gt;Rename to &lt;code&gt;proxy.ts&lt;/code&gt; to clarify network boundary and routing focus&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;next/legacy/image&lt;/code&gt; component&lt;/td&gt;&lt;td&gt;Use &lt;code&gt;next/image&lt;/code&gt; instead for improved performance and features&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;images.domains&lt;/code&gt; config&lt;/td&gt;&lt;td&gt;Use &lt;code&gt;images.remotePatterns&lt;/code&gt; config instead for improved security restriction&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;revalidateTag()&lt;/code&gt; single argument&lt;/td&gt;&lt;td&gt;Use &lt;code&gt;revalidateTag(tag, profile)&lt;/code&gt; for SWR, or &lt;code&gt;updateTag(tag)&lt;/code&gt; in Actions for read-your-writes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h4 id=&quot;additional-improvements&quot; data-docs-heading=&quot;&quot;&gt;Additional Improvements&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#additional-improvements&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance improvements&lt;/strong&gt;: Significant performance optimizations for &lt;code&gt;next dev&lt;/code&gt; and &lt;code&gt;next start&lt;/code&gt; commands&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js native TypeScript for &lt;code&gt;next.config.ts&lt;/code&gt;&lt;/strong&gt;: Run &lt;code&gt;next dev&lt;/code&gt;, &lt;code&gt;next build&lt;/code&gt;, and &lt;code&gt;next start&lt;/code&gt; commands with &lt;code&gt;--experimental-next-config-strip-types&lt;/code&gt; flag to enable native TypeScript for &lt;code&gt;next.config.ts&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&#39;ll aim to share a more comprehensive migration guide ahead of the stable release in our documentation.&lt;/p&gt;
&lt;h2 id=&quot;feedback-and-community&quot; data-docs-heading=&quot;&quot;&gt;Feedback and Community&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#feedback-and-community&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Share your feedback and help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/discord&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discord Community&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;contributors&quot; data-docs-heading=&quot;&quot;&gt;Contributors&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16#contributors&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js is the result of the combined work of over 3,000 individual developers. This release was brought to you by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Next.js&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/acdlite&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Andrew&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/unstubbable&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Hendrik&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lubieowoce&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Janka&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/huozhi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiachi&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/feedthejim&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jimmy&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/devjiwonchoi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiwon&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/ijjk&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;JJ&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gnoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Josh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gao_jude&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jude&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://x.com/samselikoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sam&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/sebmarkbage&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebastian&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/eps1lon&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebbie&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/wyattjoh&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Wyatt&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/ztanner&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Zack&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Turbopack&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/bgw&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Benjamin&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/Cy-Tek&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Josh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lukesandberg&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Luke&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/mischnic&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Niklas&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/timneutkens&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tim&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/sokra&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tobias&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/wbinnssmith&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Will&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Next.js Docs&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/delbaoliveira&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Delba&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/molebox&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Rich&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/ismaelrumzan&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Ismael&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/icyJoseph&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Joseph&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Huge thanks to @mischnic, @timneutkens, @unstubbable, @wyattjoh, @Cy-Tek, @lukesandberg, @OoMNoO, @ztanner, @icyJoseph, @huozhi, @gnoff, @ijjk, @povilasv, @dwrth, @obendev, @aymericzip, @devjiwonchoi, @SyMind, @vercel-release-bot, @Shireee, @eps1lon, @dharun36, @kachkaev, @bgw, @yousefdawood7, @TheAlexLichter, @sokra, @ericx0099, @leerob, @Copilot, @fireairforce, @fufuShih, @anvibanga, @hayes, @Milancen123, @martinfrancois, @lubieowoce, @gaojude, @lachlanjc, @liketiger, @styfle, @aaronbrown-vercel, @Samii2383, @FelipeChicaiza, @kevva, @m1abdullahh, @F7b5, @Anshuman71, @RobertFent, @poteto, @chloe-yan, @sireesha-siri, @brian-lou, @joao4xz, @stefanprobst, @samselikoff, @acdlite, @gwkline, @bgub, @brock-statsig, and @karlhorky for helping!&lt;/p&gt;</description><link>https://nextjs.org/blog/next-16</link><guid isPermaLink="false">https://nextjs.org/blog/next-16</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js 16 (beta)</title><description>&lt;p&gt;Next.js 16 (beta) is now available. This early release provides access to the latest improvements to Turbopack, caching, and the Next.js architecture ahead of the stable release. Highlights for this release include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-beta#turbopack-stable&quot;&gt;&lt;strong&gt;Turbopack (stable)&lt;/strong&gt;&lt;/a&gt;: Default bundler for all apps with up to 5-10x faster Fast Refresh, and 2-5x faster builds&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-beta#turbopack-file-system-caching-beta&quot;&gt;&lt;strong&gt;Turbopack File System Caching (beta)&lt;/strong&gt;&lt;/a&gt;: Even faster startup and compile times for the largest apps&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-beta#react-compiler-support-stable&quot;&gt;&lt;strong&gt;React Compiler Support (stable)&lt;/strong&gt;&lt;/a&gt;: Built-in integration for automatic memoization&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-beta#build-adapters-api-alpha&quot;&gt;&lt;strong&gt;Build Adapters API (alpha)&lt;/strong&gt;&lt;/a&gt;: Create custom adapters to modify the build process&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-beta#enhanced-routing-and-navigation&quot;&gt;&lt;strong&gt;Enhanced Routing&lt;/strong&gt;&lt;/a&gt;: Optimized navigations and prefetching with layout deduplication and incremental prefetching&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-beta#improved-caching-apis&quot;&gt;&lt;strong&gt;Improved Caching APIs&lt;/strong&gt;&lt;/a&gt;: New &lt;code&gt;updateTag()&lt;/code&gt; and refined &lt;code&gt;revalidateTag()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-beta#react-192-and-canary-features&quot;&gt;&lt;strong&gt;React 19.2&lt;/strong&gt;&lt;/a&gt;: View Transitions, &lt;code&gt;useEffectEvent()&lt;/code&gt;, &lt;code&gt;&amp;lt;Activity/&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-16-beta#breaking-changes-and-other-updates&quot;&gt;&lt;strong&gt;Breaking Changes&lt;/strong&gt;&lt;/a&gt;: Async params, &lt;code&gt;next/image&lt;/code&gt; defaults, and more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;We encourage you to try the beta and share your feedback.&lt;/strong&gt; Your testing helps us identify issues and improve Next.js before the stable release. Please report any bugs or issues you encounter on &lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Upgrade to the beta:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Use the automated upgrade CLI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; @next/codemod@canary&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; upgrade&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; beta&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or upgrade manually&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@beta&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react-dom@latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or start a new project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; create-next-app@beta&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;developer-experience&quot; data-docs-heading=&quot;&quot;&gt;Developer Experience&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#developer-experience&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;turbopack-stable&quot; data-docs-heading=&quot;&quot;&gt;Turbopack (stable)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#turbopack-stable&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Turbopack has reached stability for both development and production builds, and is now the default bundler for all new Next.js projects. Since its beta release earlier this summer, adoption has scaled rapidly: more than 50% of development sessions and 20% of production builds on Next.js 15.3+ are already running on Turbopack.&lt;/p&gt;
&lt;p&gt;With Turbopack, you can expect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2–5× faster production builds&lt;/li&gt;
&lt;li&gt;Up to 10× faster Fast Refresh&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&#39;re making Turbopack the default to bring these performance gains to every Next.js developer, no configuration required. For apps with custom webpack setups, you can continue using webpack by running:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; dev&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; --webpack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; --webpack&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;turbopack-file-system-caching-beta&quot; data-docs-heading=&quot;&quot;&gt;Turbopack File System Caching (beta)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#turbopack-file-system-caching-beta&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Turbopack now supports filesystem caching in development, storing compiler artifacts on disk between runs for significantly faster compile times across restarts, especially in large projects.&lt;/p&gt;
&lt;p&gt;Enable filesystem caching in your configuration:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    turbopackFileSystemCacheForDev&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All internal Vercel apps are already using this feature, and we’ve seen notable improvements in developer productivity across large repositories.&lt;/p&gt;
&lt;p&gt;We’d love to hear your feedback as we iterate on filesystem caching. Please try it out and share your experience.&lt;/p&gt;
&lt;h3 id=&quot;simplified-create-next-app&quot; data-docs-heading=&quot;&quot;&gt;Simplified &lt;code&gt;create-next-app&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#simplified-create-next-app&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;create-next-app&lt;/code&gt; has been redesigned with a simplified setup flow, updated project structure, and improved defaults. The new template includes the App Router by default, TypeScript-first configuration, Tailwind CSS, and ESLint.&lt;/p&gt;
&lt;h3 id=&quot;build-adapters-api-alpha&quot; data-docs-heading=&quot;&quot;&gt;Build Adapters API (alpha)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#build-adapters-api-alpha&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Following the &lt;a href=&quot;https://github.com/vercel/next.js/discussions/77740&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Build Adapters RFC&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, we&#39;ve worked with the community and deployment platforms to deliver the first alpha version of the Build Adapters API.&lt;/p&gt;
&lt;p&gt;Build Adapters allow you to create custom adapters that hook into the build process, enabling deployment platforms and custom build integrations to modify Next.js configuration or process build output.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg height=&quot;17&quot; style=&quot;margin-left:-1.5px&quot; viewBox=&quot;0 0 50 50&quot; width=&quot;17&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M 43.335938 4 L 6.667969 4 C 5.195313 4 4 5.195313 4 6.667969 L 4 43.332031 C 4 44.804688 5.195313 46 6.667969 46 L 43.332031 46 C 44.804688 46 46 44.804688 46 43.335938 L 46 6.667969 C 46 5.195313 44.804688 4 43.335938 4 Z M 27 36.183594 C 27 40.179688 24.65625 42 21.234375 42 C 18.140625 42 15.910156 39.925781 15 38 L 18.144531 36.097656 C 18.75 37.171875 19.671875 38 21 38 C 22.269531 38 23 37.503906 23 35.574219 L 23 23 L 27 23 Z M 35.675781 42 C 32.132813 42 30.121094 40.214844 29 38 L 32 36 C 32.816406 37.335938 33.707031 38.613281 35.589844 38.613281 C 37.171875 38.613281 38 37.824219 38 36.730469 C 38 35.425781 37.140625 34.960938 35.402344 34.199219 L 34.449219 33.789063 C 31.695313 32.617188 29.863281 31.148438 29.863281 28.039063 C 29.863281 25.179688 32.046875 23 35.453125 23 C 37.878906 23 39.621094 23.84375 40.878906 26.054688 L 37.910156 27.964844 C 37.253906 26.789063 36.550781 26.328125 35.453125 26.328125 C 34.335938 26.328125 33.628906 27.039063 33.628906 27.964844 C 33.628906 29.109375 34.335938 29.570313 35.972656 30.28125 L 36.925781 30.691406 C 40.171875 32.078125 42 33.496094 42 36.683594 C 42 40.117188 39.300781 42 35.675781 42 Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.js&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    adapterPath&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.resolve&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;./my-adapter.js&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;module&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;exports&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Share your feedback in the &lt;a href=&quot;https://github.com/vercel/next.js/discussions/77740&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;RFC discussion&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;react-compiler-support-stable&quot; data-docs-heading=&quot;&quot;&gt;React Compiler Support (stable)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#react-compiler-support-stable&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Built-in support for the React Compiler is now stable in Next.js 16 following the React Compiler&#39;s 1.0 release. The React Compiler automatically memoizes components, reducing unnecessary re-renders with zero manual code changes.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;reactCompiler&lt;/code&gt; configuration option has been promoted from &lt;code&gt;experimental&lt;/code&gt; to stable. It is not enabled by default as we continue gathering build performance data across different application types. Expect compile times in development and during builds to be higher when enabling this option as the React Compiler relies on Babel.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  reactCompiler&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Install the latest version of the React Compiler plugin:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; babel-plugin-react-compiler@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;core-features--architecture&quot; data-docs-heading=&quot;&quot;&gt;Core Features &amp;amp; Architecture&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#core-features--architecture&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;enhanced-routing-and-navigation&quot; data-docs-heading=&quot;&quot;&gt;Enhanced Routing and Navigation&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#enhanced-routing-and-navigation&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Next.js 16 includes a complete overhaul of the routing and navigation system,
making page transitions leaner and faster.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layout deduplication&lt;/strong&gt;: When prefetching multiple URLs with a shared layout, the layout is downloaded once instead of separately for each Link. For example, a page with 50 product links now downloads the shared layout once instead of 50 times, dramatically reducing the network transfer size.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Incremental prefetching&lt;/strong&gt;: Next.js only prefetches parts not already in cache, rather than entire pages. The prefetch cache now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cancels requests when the link leaves the viewport&lt;/li&gt;
&lt;li&gt;Prioritizes link prefetching on hover or when re-entering the viewport&lt;/li&gt;
&lt;li&gt;Re-prefetches links when their data is invalidated&lt;/li&gt;
&lt;li&gt;Works seamlessly with upcoming features like Cache Components&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Trade-off&lt;/strong&gt;: You may see more individual prefetch requests, but with much lower total transfer sizes. We believe this is the right trade-off for nearly all applications. If the increased request count causes issues, please let us know. We&#39;re working on additional optimizations to inline data chunks more efficiently.&lt;/p&gt;
&lt;p&gt;These changes require no code modifications and are designed to improve performance across all apps.&lt;/p&gt;
&lt;h3 id=&quot;ppr-and-cache-components&quot; data-docs-heading=&quot;&quot;&gt;PPR and Cache Components&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#ppr-and-cache-components&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Next.js 16 removes the experimental &lt;strong&gt;Partial Pre-Rendering (PPR)&lt;/strong&gt; flag and configuration options. PPR is being integrated into Cache Components.&lt;/p&gt;
&lt;p&gt;Starting with Next.js 16, you can opt into PPR using the &lt;code&gt;experimental.cacheComponents&lt;/code&gt; configuration. There are differences in the implementation and Cache Components brings additional features and behaviors that will be documented and announced ahead of Next.js Conf and the Next.js 16 stable release.&lt;/p&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;If your application relies on PPR&lt;/strong&gt; (&lt;code&gt;experimental.ppr = true&lt;/code&gt;): Stay on the pinned version of Next.js &lt;code&gt;canary&lt;/code&gt; you currently use. If you have trouble migrating, stay on your current version for now, and we will provide a migration guide ahead of the stable release.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;improved-caching-apis&quot; data-docs-heading=&quot;&quot;&gt;Improved Caching APIs&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#improved-caching-apis&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Next.js 16 introduces refined caching APIs for more explicit control over cache behavior.&lt;/p&gt;
&lt;h4 id=&quot;revalidatetag-updated&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;revalidateTag()&lt;/code&gt; (updated)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#revalidatetag-updated&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;revalidateTag()&lt;/code&gt; now requires a &lt;strong&gt;&lt;a href=&quot;https://nextjs.org/docs/app/api-reference/functions/cacheLife#reference&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;cacheLife&lt;/code&gt; profile&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt; as the second argument to enable stale-while-revalidate (SWR) behavior:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { revalidateTag } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/cache&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ✅ Use built-in cacheLife profile (we recommend &#39;max&#39; for most cases)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;revalidateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;blog-posts&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;max&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// Or use other built-in profiles&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;revalidateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;news-feed&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;hours&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;revalidateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;analytics&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;days&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// Or use an inline object with a custom revalidation time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;revalidateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;products&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { revalidate&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 3600&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ⚠️ Deprecated - single argument form&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;revalidateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;blog-posts&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The profile argument accepts built-in &lt;code&gt;cacheLife&lt;/code&gt; profile names (like &lt;code&gt;&#39;max&#39;&lt;/code&gt;, &lt;code&gt;&#39;hours&#39;&lt;/code&gt;, &lt;code&gt;&#39;days&#39;&lt;/code&gt;) or &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/functions/cacheLife#defining-reusable-cache-profiles&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;custom profiles&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; defined in your &lt;code&gt;next.config&lt;/code&gt;. You can also pass an inline &lt;code&gt;{ revalidate: number }&lt;/code&gt; object. We recommend using &lt;code&gt;&#39;max&#39;&lt;/code&gt; for most cases, as it enables background revalidation for long-lived content. When users request tagged content, they receive cached data immediately while Next.js revalidates in the background.&lt;/p&gt;
&lt;p&gt;Use &lt;code&gt;revalidateTag()&lt;/code&gt; when you want to invalidate only properly tagged cached entries with stale-while-revalidate behavior. This is ideal for static content that can tolerate eventual consistency.&lt;/p&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;Migration guidance:&lt;/strong&gt; Add the second argument with a &lt;code&gt;cacheLife&lt;/code&gt; profile (we recommend &lt;code&gt;&#39;max&#39;&lt;/code&gt;) for SWR behavior, or use &lt;code&gt;updateTag()&lt;/code&gt; in Server Actions if you need read-your-writes semantics.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;updatetag-new&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;updateTag()&lt;/code&gt; (new)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#updatetag-new&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;updateTag()&lt;/code&gt; is a new Server Actions-only API that provides &lt;strong&gt;read-your-writes&lt;/strong&gt; semantics, expiring and immediately refreshing cached data within the same request:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;use server&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { updateTag } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/cache&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; updateUserProfile&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(userId&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; profile&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; Profile&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; db&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;users&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.update&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(userId&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; profile);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Expire cache and refresh immediately - user sees their changes right away&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;  updateTag&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;`user-&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;userId&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This ensures interactive features reflect changes immediately. Perfect for forms, user settings, and any workflow where users expect to see their updates instantly.&lt;/p&gt;
&lt;h4 id=&quot;refresh-new&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;refresh()&lt;/code&gt; (new)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#refresh-new&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;refresh()&lt;/code&gt; is a new Server Actions-only API for refreshing &lt;strong&gt;uncached data only&lt;/strong&gt;. It doesn&#39;t touch the cache at all:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;use server&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { refresh } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/cache&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; async&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; markNotificationAsRead&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(notificationId&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Update the notification in the database&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  await&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; db&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;notifications&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.markAsRead&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(notificationId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Refresh the notification count displayed in the header&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // (which is fetched separately and not cached)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;  refresh&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This API is complementary to the client-side &lt;code&gt;router.refresh()&lt;/code&gt;. Use it when you need to refresh uncached data displayed elsewhere on the page after performing an action. Your cached page shells and static content remain fast while dynamic data like notification counts, live metrics, or status indicators refresh.&lt;/p&gt;
&lt;h3 id=&quot;react-192-and-canary-features&quot; data-docs-heading=&quot;&quot;&gt;React 19.2 and Canary Features&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#react-192-and-canary-features&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The App Router in Next.js 16 uses the latest React &lt;a href=&quot;https://react.dev/blog/2023/05/03/react-canaries&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Canary release&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, which includes the newly released React 19.2 features and other features being incrementally stabilized. Highlights include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://react.dev/reference/react/ViewTransition&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;View Transitions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Animate elements that update inside a Transition or navigation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://react.dev/reference/react/useEffectEvent&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;useEffectEvent&lt;/code&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Extract non-reactive logic from Effects into reusable Effect Event functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://react.dev/reference/react/Activity&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Activity&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Render &quot;background activity&quot; by hiding UI with &lt;code&gt;display: none&lt;/code&gt; while maintaining state and cleaning up Effects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learn more in the &lt;a href=&quot;https://react.dev/blog/2025/10/01/react-19-2&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;React 19.2 announcement&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;breaking-changes-and-other-updates&quot; data-docs-heading=&quot;&quot;&gt;Breaking Changes and Other Updates&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#breaking-changes-and-other-updates&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id=&quot;version-requirements&quot; data-docs-heading=&quot;&quot;&gt;Version Requirements&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#version-requirements&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;overflow-x-auto&quot;&gt;&lt;table class=&quot;w-full table-auto&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Change&lt;/th&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Details&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Node.js 20.9+&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Minimum version now 20.9.0 (LTS); Node.js 18 no longer supported&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;TypeScript 5+&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Minimum version now 5.1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Browsers&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Chrome 111+, Edge 111+, Firefox 111+, Safari 16.4+&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h3 id=&quot;removals&quot; data-docs-heading=&quot;&quot;&gt;Removals&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#removals&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These features were previously deprecated and are now removed:&lt;/p&gt;
&lt;div class=&quot;overflow-x-auto&quot;&gt;&lt;table class=&quot;w-full table-auto&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Removed&lt;/th&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Replacement&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;AMP support&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;All AMP APIs and configs removed (&lt;code&gt;useAmp&lt;/code&gt;, &lt;code&gt;export const config = { amp: true }&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;next lint&lt;/code&gt; command&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Use Biome or ESLint directly; &lt;code&gt;next build&lt;/code&gt; no longer runs linting. A codemod is available: &lt;code&gt;npx @next/codemod@canary next-lint-to-eslint-cli .&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;devIndicators&lt;/code&gt; options&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;appIsrStatus&lt;/code&gt;, &lt;code&gt;buildActivity&lt;/code&gt;, &lt;code&gt;buildActivityPosition&lt;/code&gt; removed from config. The indicator remains.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;serverRuntimeConfig&lt;/code&gt;, &lt;code&gt;publicRuntimeConfig&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Use environment variables (&lt;code&gt;.env&lt;/code&gt; files)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;experimental.turbopack&lt;/code&gt; location&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Config moved to top-level &lt;code&gt;turbopack&lt;/code&gt; (no longer in &lt;code&gt;experimental&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;experimental.dynamicIO&lt;/code&gt; flag&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Renamed to &lt;code&gt;experimental.cacheComponents&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;experimental.ppr&lt;/code&gt; flag&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;PPR flag removed; evolving into Cache Components programming model&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;export const experimental_ppr&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Route-level PPR export removed; evolving into Cache Components programming model&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Automatic &lt;code&gt;scroll-behavior: smooth&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Add &lt;code&gt;data-scroll-behavior=&quot;smooth&quot;&lt;/code&gt; to HTML document to opt back in&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;unstable_rootParams()&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;We are working on an alternative API that we will ship in an upcoming minor&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Sync &lt;code&gt;params&lt;/code&gt;, &lt;code&gt;searchParams&lt;/code&gt; props&lt;/strong&gt; access&lt;/td&gt;&lt;td&gt;Must use async: &lt;code&gt;await params&lt;/code&gt;, &lt;code&gt;await searchParams&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Sync &lt;code&gt;cookies()&lt;/code&gt;, &lt;code&gt;headers()&lt;/code&gt;, &lt;code&gt;draftMode()&lt;/code&gt;&lt;/strong&gt; access&lt;/td&gt;&lt;td&gt;Must use async: &lt;code&gt;await cookies()&lt;/code&gt;, &lt;code&gt;await headers()&lt;/code&gt;, &lt;code&gt;await draftMode()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Metadata image route &lt;code&gt;params&lt;/code&gt; argument&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Changed to async &lt;code&gt;params&lt;/code&gt;; &lt;code&gt;id&lt;/code&gt; from &lt;code&gt;generateImageMetadata&lt;/code&gt; now &lt;code&gt;Promise&amp;lt;string&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;next/image&lt;/code&gt; local src with query strings&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Now requires &lt;code&gt;images.localPatterns&lt;/code&gt; config to prevent enumeration attacks&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h3 id=&quot;behavior-changes&quot; data-docs-heading=&quot;&quot;&gt;Behavior Changes&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#behavior-changes&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These features have new default behaviors in Next.js 16:&lt;/p&gt;
&lt;div class=&quot;overflow-x-auto&quot;&gt;&lt;table class=&quot;w-full table-auto&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Changed Behavior&lt;/th&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Details&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Default bundler&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Turbopack is now the default bundler for all apps; opt out with &lt;code&gt;next build --webpack&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;images.minimumCacheTTL&lt;/code&gt; default&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Changed from 60s to 4 hours (14400s); reduces revalidation cost for images without cache-control headers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;images.imageSizes&lt;/code&gt; default&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Removed &lt;code&gt;16&lt;/code&gt; from default sizes (used by only 4.2% of projects); reduces srcset size and API variations&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;images.qualities&lt;/code&gt; default&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Changed from &lt;code&gt;[1..100]&lt;/code&gt; to &lt;code&gt;[75]&lt;/code&gt;; &lt;code&gt;quality&lt;/code&gt; prop is now coerced to closest value in &lt;code&gt;images.qualities&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;images.dangerouslyAllowLocalIP&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;New security restriction blocks local IP optimization by default; set to &lt;code&gt;true&lt;/code&gt; for private networks only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;images.maximumRedirects&lt;/code&gt; default&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Changed from unlimited to 3 redirects maximum; set to &lt;code&gt;0&lt;/code&gt; to disable or increase for rare edge cases&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;@next/eslint-plugin-next&lt;/code&gt; default&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Now defaults to ESLint Flat Config format, aligning with ESLint v10 which will drop legacy config support&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Prefetch cache behavior&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Complete rewrite with layout deduplication and incremental prefetching&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;revalidateTag()&lt;/code&gt; signature&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Now requires &lt;code&gt;cacheLife&lt;/code&gt; profile as second argument for stale-while-revalidate behavior&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Babel configuration in Turbopack&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Automatically enables Babel if a babel config is found (previously exited with hard error)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Terminal output&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Redesigned with clearer formatting, better error messages, and improved performance metrics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Dev and build output directories&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;next dev&lt;/code&gt; and &lt;code&gt;next build&lt;/code&gt; now use separate output directories, enabling concurrent execution&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Lockfile behavior&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Added lockfile mechanism to prevent multiple &lt;code&gt;next dev&lt;/code&gt; or &lt;code&gt;next build&lt;/code&gt; instances on the same project&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Parallel routes &lt;code&gt;default.js&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;All parallel route slots now require explicit &lt;code&gt;default.js&lt;/code&gt; files; builds fail without them. Create &lt;code&gt;default.js&lt;/code&gt; that calls &lt;code&gt;notFound()&lt;/code&gt; or returns &lt;code&gt;null&lt;/code&gt; for previous behavior&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Modern Sass API&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Bumped &lt;code&gt;sass-loader&lt;/code&gt; to v16, which supports modern Sass syntax and new features&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h3 id=&quot;deprecations&quot; data-docs-heading=&quot;&quot;&gt;Deprecations&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#deprecations&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These features are deprecated in Next.js 16 and will be removed in a future version:&lt;/p&gt;
&lt;div class=&quot;overflow-x-auto&quot;&gt;&lt;table class=&quot;w-full table-auto&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Deprecated&lt;/th&gt;&lt;th class=&quot;min-w-[12ch]&quot;&gt;Details&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;middleware.ts&lt;/code&gt; filename&lt;/td&gt;&lt;td&gt;Rename to &lt;code&gt;proxy.ts&lt;/code&gt; to clarify network boundary and routing focus&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;next/legacy/image&lt;/code&gt; component&lt;/td&gt;&lt;td&gt;Use &lt;code&gt;next/image&lt;/code&gt; instead for improved performance and features&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;images.domains&lt;/code&gt; config&lt;/td&gt;&lt;td&gt;Use &lt;code&gt;images.remotePatterns&lt;/code&gt; config instead for improved security restriction&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;revalidateTag()&lt;/code&gt; single argument&lt;/td&gt;&lt;td&gt;Use &lt;code&gt;revalidateTag(tag, profile)&lt;/code&gt; for SWR, or &lt;code&gt;updateTag(tag)&lt;/code&gt; in Actions for read-your-writes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
&lt;h3 id=&quot;additional-improvements&quot; data-docs-heading=&quot;&quot;&gt;Additional Improvements&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#additional-improvements&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance improvements&lt;/strong&gt;: Significant performance optimizations for &lt;code&gt;next dev&lt;/code&gt; and &lt;code&gt;next start&lt;/code&gt; commands&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js native TypeScript for &lt;code&gt;next.config.ts&lt;/code&gt;&lt;/strong&gt;: Run &lt;code&gt;next dev&lt;/code&gt;, &lt;code&gt;next build&lt;/code&gt;, and &lt;code&gt;next start&lt;/code&gt; commands with &lt;code&gt;--experimental-next-config-strip-types&lt;/code&gt; flag to enable native TypeScript for &lt;code&gt;next.config.ts&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&#39;ll aim to share a more comprehensive migration guide ahead of the stable release in our documentation.&lt;/p&gt;
&lt;h2 id=&quot;feedback-and-community&quot; data-docs-heading=&quot;&quot;&gt;Feedback and Community&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#feedback-and-community&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Share your feedback and help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/discord&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Discord Community&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;contributors&quot; data-docs-heading=&quot;&quot;&gt;Contributors&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-16-beta#contributors&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js is the result of the combined work of over 3,000 individual developers. This release was brought to you by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Next.js&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/acdlite&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Andrew&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/unstubbable&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Hendrik&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lubieowoce&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Janka&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/huozhi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiachi&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/feedthejim&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jimmy&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/devjiwonchoi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiwon&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/ijjk&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;JJ&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gnoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Josh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gao_jude&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jude&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://x.com/samselikoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sam&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/sebmarkbage&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebastian&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/eps1lon&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebbie&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/wyattjoh&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Wyatt&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/ztanner&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Zack&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Turbopack&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/bgw&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Benjamin&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/Cy-Tek&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Josh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lukesandberg&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Luke&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/mischnic&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Niklas&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/timneutkens&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tim&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/sokra&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tobias&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/wbinnssmith&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Will&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Next.js Docs&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/delbaoliveira&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Delba&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/molebox&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Rich&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/ismaelrumzan&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Ismael&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/icyJoseph&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Joseph&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Huge thanks to @mischnic, @timneutkens, @unstubbable, @wyattjoh, @Cy-Tek, @lukesandberg, @OoMNoO, @ztanner, @icyJoseph, @huozhi, @gnoff, @ijjk, @povilasv, @dwrth, @obendev, @aymericzip, @devjiwonchoi, @SyMind, @vercel-release-bot, @Shireee, @eps1lon, @dharun36, @kachkaev, @bgw, @yousefdawood7, @TheAlexLichter, @sokra, @ericx0099, @leerob, @Copilot, @fireairforce, @fufuShih, @anvibanga, @hayes, @Milancen123, @martinfrancois, @lubieowoce, @gaojude, @lachlanjc, @liketiger, @styfle, @aaronbrown-vercel, @Samii2383, @FelipeChicaiza, @kevva, @m1abdullahh, @F7b5, @Anshuman71, @RobertFent, @poteto, @chloe-yan, @sireesha-siri, @brian-lou, @joao4xz, @stefanprobst, @samselikoff, @acdlite, @gwkline, @bgub, @brock-statsig, and @karlhorky for helping!&lt;/p&gt;</description><link>https://nextjs.org/blog/next-16-beta</link><guid isPermaLink="false">https://nextjs.org/blog/next-16-beta</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js 15.5</title><description>&lt;p&gt;Next.js 15.5 includes Turbopack builds in beta, stable Node.js middleware, TypeScript improvements, &lt;code&gt;next lint&lt;/code&gt; deprecation, and deprecation warnings for Next.js 16. Highlights for this release include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-15-5#turbopack-builds-beta&quot;&gt;&lt;strong&gt;Turbopack Builds (beta)&lt;/strong&gt;&lt;/a&gt;: Production turbopack builds (&lt;code&gt;next build --turbopack&lt;/code&gt;) now in beta&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-15-5#nodejs-middleware-stable&quot;&gt;&lt;strong&gt;Node.js Middleware (stable)&lt;/strong&gt;&lt;/a&gt;: Node.js runtime support for middleware is now stable&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-15-5#typescript-improvements&quot;&gt;&lt;strong&gt;TypeScript Improvements&lt;/strong&gt;&lt;/a&gt;: Typed routes, route export validation, and route types helpers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-15-5#next-lint-deprecation&quot;&gt;&lt;strong&gt;&lt;code&gt;next lint&lt;/code&gt;&lt;/strong&gt;&lt;/a&gt;: Deprecation of &lt;code&gt;next lint&lt;/code&gt; command&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-15-5#deprecation-warnings-for-nextjs-16&quot;&gt;&lt;strong&gt;Next.js 16&lt;/strong&gt;&lt;/a&gt;: Deprecation warnings for Next.js 16&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Upgrade today, or get started with:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Use the automated upgrade CLI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; @next/codemod@canary&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; upgrade&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or upgrade manually&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react-dom@latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or start a new project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; create-next-app@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;turbopack-builds-beta&quot; data-docs-heading=&quot;&quot;&gt;Turbopack Builds (beta)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#turbopack-builds-beta&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We&#39;re excited to announce &lt;code&gt;next build --turbopack&lt;/code&gt; in beta. Turbopack now powers Vercel websites including &lt;a href=&quot;https://vercel.com/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;vercel.com&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://v0.app/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;v0.app&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://nextjs.org/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;nextjs.org&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, accelerating iteration velocity through faster preview and production deployment builds.&lt;/p&gt;
&lt;p&gt;These applications powered by Turbopack have been battle tested serving over &lt;strong&gt;1.2 billion&lt;/strong&gt; requests since the rollout.&lt;/p&gt;
&lt;h3 id=&quot;performance--production-results&quot; data-docs-heading=&quot;&quot;&gt;Performance &amp;amp; Production Results&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#performance--production-results&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;One of the original design goals for Turbopack was to be able to help developers scale build performance as their applications and codebases grow. To achieve this, Turbopack was designed from the ground up to take advantage of multiple CPU cores throughout all phases of the build.&lt;/p&gt;
&lt;p&gt;We&#39;ve deployed builds with Turbopack across many Vercel products and saw consistent improvements in compilation time:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Customer site&lt;/strong&gt;: 2x faster on a 4 core machine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customer site&lt;/strong&gt;: 2.2x faster on a 14 core machine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small site (10K modules)&lt;/strong&gt;: 4x faster on a 30 core machine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medium site (40K modules)&lt;/strong&gt;: 2.5x faster on a 30 core machine&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Large site (70K modules)&lt;/strong&gt;: 5x faster on a 30 core machine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As we rolled out Turbopack to our major web applications, we closely monitored for production performance regressions and breakages.&lt;/p&gt;
&lt;p&gt;When compared with Webpack, our production metrics monitoring shows that sites built with Turbopack serve similar or smaller amounts of JavaScript and CSS across fewer requests, leading to comparable or better FCP, LCP and TTFB metrics.&lt;/p&gt;
&lt;p&gt;For teams that have adopted Turbopack in development, we now recommend trying Turbopack for builds.&lt;/p&gt;
&lt;h3 id=&quot;known-differences&quot; data-docs-heading=&quot;&quot;&gt;Known Differences&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#known-differences&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Smaller projects&lt;/strong&gt;: On smaller machines or smaller projects, we measured marginal or neutral improvements to the build times due to Webpack&#39;s built-in persistent cache. We are currently working on a &lt;a href=&quot;https://nextjs.org/docs/15/app/api-reference/config/next-config-js/turbopackPersistentCaching&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Persistent Caching&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; solution for Turbopack to deliver on our design goal of making all builds incremental and fast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bundle optimization&lt;/strong&gt;: In some edge cases, we measured that webpack produced more optimized bundles. We are tracking those scenarios and are working on closing the gap before the stable release. See the &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/turbopack#bundle-sizes&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;documentation on bundle sizes&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for more information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CSS ordering&lt;/strong&gt;: Due to different heuristics about side-effects handling in Turbopack, CSS files can be concatenated in a different order than webpack, leading to potential visual differences. See &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/turbopack#css-module-ordering&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;the documentation&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for a more detailed explanation and suggested solutions.&lt;/p&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: These differences are documented and we&#39;re actively working on improvements. For detailed information and workarounds, see our &lt;a href=&quot;https://nextjs.org/docs/app/api-reference/turbopack#known-gaps-with-webpack&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Turbopack documentation&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As we iterate towards the stable release, please report any issues on &lt;a href=&quot;https://github.com/vercel/next.js/discussions/77721&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;nodejs-middleware-stable&quot; data-docs-heading=&quot;&quot;&gt;Node.js Middleware (stable)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#nodejs-middleware-stable&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After introducing experimental support for the Node.js runtime in our &lt;a href=&quot;https://nextjs.org/blog/next-15-2&quot;&gt;15.2 release&lt;/a&gt; and testing extensively on our production applications, we&#39;re excited to announce stable support for Node.js middleware runtime.&lt;/p&gt;
&lt;p&gt;Previously, Next.js middleware only supported the Edge Runtime, which provided better performance and isolation but had limitations when integrating with Node.js-specific libraries and APIs.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;middleware.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { NextRequest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; NextResponse } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/server&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  runtime&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;nodejs&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt; // Now stable!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; middleware&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(request&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; NextRequest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Access to full Node.js APIs and npm packages&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; fs&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;fs&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; crypto&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;crypto&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Complex authentication logic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; token&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; request&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;headers&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.get&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;authorization&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;isValidToken&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(token)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; NextResponse&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.redirect&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;/login&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; request&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.url));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; NextResponse&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;.next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; isValidToken&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(token&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; boolean&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Use Node.js crypto for validation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;  // Access file system, databases, etc.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This change enables middleware to handle more complex use cases while maintaining the same developer experience.&lt;/p&gt;
&lt;p&gt;Although Node.js runtime won&#39;t be the default in Next.js 16, we are exploring making it the default starting with Next.js 17 based on community feedback and usage patterns.&lt;/p&gt;
&lt;h2 id=&quot;typescript-improvements&quot; data-docs-heading=&quot;&quot;&gt;TypeScript Improvements&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#typescript-improvements&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js 15.5 brings major TypeScript improvements to the App Router, with full Turbopack compatibility and comprehensive type safety for routing.&lt;/p&gt;
&lt;h3 id=&quot;typed-routes-stable&quot; data-docs-heading=&quot;&quot;&gt;Typed Routes (stable)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#typed-routes-stable&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Typed routes provide compile-time type safety for your application&#39;s routes, catching invalid links before they reach production. This feature automatically generates types based on your file structure, ensuring that every &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt; component points to a valid route.&lt;/p&gt;
&lt;p&gt;This feature is available behind the &lt;code&gt;typedRoutes&lt;/code&gt; flag, which was previously experimental and is now stable. Statically typed routes now work with Turbopack through a new implementation that provides type safety across both Webpack and Turbopack builds:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  typedRoutes&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt; // Now stable!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; Link &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/link&#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// Full type safety for route paths&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;/blog/example-slug?ui=dark&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;Read Post&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// TypeScript catches invalid routes at compile time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;/invalid-route&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;Broken Link&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ← Type error&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;route-export-validation-turbopack&quot; data-docs-heading=&quot;&quot;&gt;Route Export Validation (Turbopack)&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#route-export-validation-turbopack&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Route export validation also works on Turbopack through a new system that generates a type guard file, validating pages, layouts, and route handlers using TypeScript&#39;s &lt;code&gt;satisfies&lt;/code&gt; operator.&lt;/p&gt;
&lt;p&gt;This catches invalid exports like incorrect &lt;code&gt;dynamic&lt;/code&gt; values during compilation when running &lt;code&gt;next build&lt;/code&gt;, replacing the old Webpack plugin with a more performant solution that works across both build systems.&lt;/p&gt;
&lt;h3 id=&quot;route-props-helpers&quot; data-docs-heading=&quot;&quot;&gt;Route Props Helpers&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#route-props-helpers&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Next.js automatically generates globally available &lt;code&gt;PageProps&lt;/code&gt;, &lt;code&gt;LayoutProps&lt;/code&gt;, and &lt;code&gt;RouteContext&lt;/code&gt; types with full parameter typing and no imports required:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before: Manual typing and imports&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { Metadata } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;interface&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; Props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  params&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;{ slug&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; }&amp;gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  children&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; React&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;ReactNode&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  analytics&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; React&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;ReactNode&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// Manual parallel route typing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  team&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; React&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;ReactNode&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// Manual parallel route typing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; DashboardLayout&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; Props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.children}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.analytics} {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;/* No type safety for parallel routes */&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.team} {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;/* No type safety for parallel routes */&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;After: Automatic typing with parallel route support&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// No need to import LayoutProps - globally available&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; DashboardLayout&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;(props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; LayoutProps&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&#39;/dashboard&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.children}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.analytics} {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;/* Fully typed parallel route slot */&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;props&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;.team} {&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;/* Fully typed parallel route slot */&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The system automatically discovers routes from your file structure, supporting dynamic routes, parallel routes, and custom routes from &lt;code&gt;next.config.js&lt;/code&gt;. Type generation runs in both development and build modes, immediately regenerating types when your file structure changes in development, and scales efficiently to large projects by generating only a few optimized files instead of the many individual files used in the previous implementation.&lt;/p&gt;
&lt;h3 id=&quot;next-typegen&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;next typegen&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#next-typegen&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;We&#39;ve added a &lt;code&gt;next typegen&lt;/code&gt; command for manual type generation without running &lt;code&gt;next dev&lt;/code&gt; or &lt;code&gt;next build&lt;/code&gt;. This is particularly useful for external type validation scenarios.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; typegen&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; [directory]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Previously, route types were only generated during &lt;code&gt;next dev&lt;/code&gt; or &lt;code&gt;next build&lt;/code&gt;, which meant running &lt;code&gt;tsc --noEmit&lt;/code&gt; directly wouldn&#39;t validate your route types. Now you can generate types independently and validate them externally:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Generate route types first, then validate with TypeScript&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; typegen&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; tsc&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; --noEmit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Or in CI workflows for type checking without building&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; typegen&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; run&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; type-check&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;next-lint-deprecation&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;next lint&lt;/code&gt; Deprecation&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#next-lint-deprecation&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Starting with Next.js 15.5, the &lt;code&gt;next lint&lt;/code&gt; command shows a deprecation warning and will be removed in Next.js 16. This modernizes the linting experience by transitioning to explicit ESLint configurations and introducing Biome as a fast alternative.&lt;/p&gt;
&lt;p&gt;When creating a new Next.js project, you can now choose between ESLint (comprehensive rules), Biome (fast with fewer rules), or no linter. ESLint projects now generate explicit &lt;code&gt;eslint.config.mjs&lt;/code&gt; files instead of relying on the &lt;code&gt;next lint&lt;/code&gt; command wrapper, providing complete transparency into your linting rules.&lt;/p&gt;
&lt;p&gt;Biome projects receive optimized configurations with Next.js and React rules plus built-in formatting capabilities. Generated &lt;code&gt;package.json&lt;/code&gt; scripts now call linters directly:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  &quot;scripts&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // ESLint projects&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;lint&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;eslint&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt; // Instead of &quot;next lint&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;lint:fix&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;eslint --fix&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // For Biome projects&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;lint&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;biome check&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;    &quot;format&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &quot;biome format --write&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For existing projects, a new codemod automates the migration from &lt;code&gt;next lint&lt;/code&gt; to ESLint CLI:&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] rounded-b-md bg-[var(--ds-bfackground-100)] [&amp;amp;_.line]:before:!hidden not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; @next/codemod@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next-lint-to-eslint-cli&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The codemod intelligently transforms &lt;code&gt;package.json&lt;/code&gt; scripts while preserving functionality, mapping Next.js-specific flags like &lt;code&gt;--strict&lt;/code&gt; to &lt;code&gt;--max-warnings 0&lt;/code&gt;, and automatically installing required dependencies.&lt;/p&gt;
&lt;p&gt;This transition gives developers direct control over their linting setup with better ecosystem compatibility.&lt;/p&gt;
&lt;blockquote class=&quot;p-3 text-sm&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: &lt;code&gt;next build&lt;/code&gt; will still run a linting validation step if an ESLint config is present. This automatic linting during builds will also be removed in Next.js 16, giving you complete control over when and how linting runs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;deprecation-warnings-for-nextjs-16&quot; data-docs-heading=&quot;&quot;&gt;Deprecation Warnings for Next.js 16&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#deprecation-warnings-for-nextjs-16&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js 15.5 introduces deprecation warnings to help you prepare for the upcoming Next.js 16 release. These warnings appear in development and build logs, giving you time to migrate before these features are removed.&lt;/p&gt;
&lt;h3 id=&quot;legacybehavior-for-nextlink&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;legacyBehavior&lt;/code&gt; for &lt;code&gt;next/link&lt;/code&gt;&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#legacybehavior-for-nextlink&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;legacyBehavior&lt;/code&gt; prop for &lt;code&gt;next/link&lt;/code&gt; will be removed in Next.js 16. This prop was introduced as a temporary compatibility layer during the Next.js 12 to 13 transition.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ❌ Will be removed in Next.js 16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;/about&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; legacyBehavior&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;About&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ✅ Modern approach (no changes needed)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;/about&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;About&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Link&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Migration&lt;/strong&gt;: Remove the &lt;code&gt;legacyBehavior&lt;/code&gt; prop and any child &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; elements. The &lt;code&gt;Link&lt;/code&gt; component now handles styling and accessibility automatically.&lt;/p&gt;
&lt;h3 id=&quot;amp-support&quot; data-docs-heading=&quot;&quot;&gt;AMP Support&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#amp-support&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Next.js AMP support will be removed in Next.js 16. AMP adoption has declined significantly, and maintaining this feature adds complexity to the framework. All AMP-related APIs and configurations will be removed.&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg height=&quot;17&quot; style=&quot;margin-left:-1.5px&quot; viewBox=&quot;0 0 50 50&quot; width=&quot;17&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;path d=&quot;M 43.335938 4 L 6.667969 4 C 5.195313 4 4 5.195313 4 6.667969 L 4 43.332031 C 4 44.804688 5.195313 46 6.667969 46 L 43.332031 46 C 44.804688 46 46 44.804688 46 43.335938 L 46 6.667969 C 46 5.195313 44.804688 4 43.335938 4 Z M 27 36.183594 C 27 40.179688 24.65625 42 21.234375 42 C 18.140625 42 15.910156 39.925781 15 38 L 18.144531 36.097656 C 18.75 37.171875 19.671875 38 21 38 C 22.269531 38 23 37.503906 23 35.574219 L 23 23 L 27 23 Z M 35.675781 42 C 32.132813 42 30.121094 40.214844 29 38 L 32 36 C 32.816406 37.335938 33.707031 38.613281 35.589844 38.613281 C 37.171875 38.613281 38 37.824219 38 36.730469 C 38 35.425781 37.140625 34.960938 35.402344 34.199219 L 34.449219 33.789063 C 31.695313 32.617188 29.863281 31.148438 29.863281 28.039063 C 29.863281 25.179688 32.046875 23 35.453125 23 C 37.878906 23 39.621094 23.84375 40.878906 26.054688 L 37.910156 27.964844 C 37.253906 26.789063 36.550781 26.328125 35.453125 26.328125 C 34.335938 26.328125 33.628906 27.039063 33.628906 27.964844 C 33.628906 29.109375 34.335938 29.570313 35.972656 30.28125 L 36.925781 30.691406 C 40.171875 32.078125 42 33.496094 42 36.683594 C 42 40.117188 39.300781 42 35.675781 42 Z&quot; fill=&quot;currentColor&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;pages/amp-page.js&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ❌ Will be removed in Next.js 16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { useAmp } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next/amp&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; config&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { amp&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; AmpPage&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; isAmp&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; useAmp&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;AMP Page: {isAmp &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;AMP&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;HTML&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  amp&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // ❌ Will be removed in Next.js 16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    canonicalBase&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;https://example.com&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Migration&lt;/strong&gt;: Remove all AMP-related code including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;export const config = { amp: true }&lt;/code&gt; from pages&lt;/li&gt;
&lt;li&gt;&lt;code&gt;amp&lt;/code&gt; configuration from your &lt;code&gt;next.config.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;next/amp&lt;/code&gt; hook imports and usage (&lt;code&gt;useAmp&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Any other AMP-specific APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Evaluate if AMP is still necessary for your use case. Most performance benefits can now be achieved through Next.js&#39;s built-in optimizations and modern web standards.&lt;/p&gt;
&lt;h3 id=&quot;nextimage-quality-settings&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;next/image&lt;/code&gt; Quality Settings&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#nextimage-quality-settings&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Starting in Next.js 16, the &lt;code&gt;quality&lt;/code&gt; prop will be restricted to only &lt;code&gt;75&lt;/code&gt; by default. Currently in Next.js 15, you can use any integer from 1 to 100, but Next.js 16 will require explicit configuration for qualities other than 75.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ⚠️ Will show deprecation warning in Next.js 15.5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// when images.qualities is undefined and quality !== 75&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Image&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;/photo.jpg&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; quality&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;alt&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;Photo&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ✅ Explicit configuration required for Next.js 16&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  images&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    qualities&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;75&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; 100&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt; // Explicitly allow quality={100}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Migration&lt;/strong&gt;: If you use &lt;code&gt;quality&lt;/code&gt; props other than 75, explicitly configure &lt;code&gt;images.qualities&lt;/code&gt; in your &lt;code&gt;next.config.ts&lt;/code&gt; to include the quality values you need for Next.js 16.&lt;/p&gt;
&lt;h3 id=&quot;nextimage-local-patterns&quot; data-docs-heading=&quot;&quot;&gt;&lt;code&gt;next/image&lt;/code&gt; Local Patterns&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#nextimage-local-patterns&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Starting in Next.js 16, using query strings with local image &lt;code&gt;src&lt;/code&gt; paths will require explicit configuration in &lt;code&gt;images.localPatterns&lt;/code&gt;. This affects images with query parameters like cache-busting or versioning.&lt;/p&gt;
&lt;div class=&quot;my-4 rounded-md group/copy relative overflow-hidden border border-[var(--ds-gray-400)] not-prose&quot; data-geist-code-block=&quot;&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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;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;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&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ⚠️ Will show deprecation warning in Next.js 15.5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// when images.localPatterns is not configured&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt;Image&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;/photo.jpg?v=1&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; alt&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt;&quot;Test&quot;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;// ✅ Explicit configuration required for Next.js 16&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  images&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    localPatterns&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;        pathname&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;/photo.jpg&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt; // allow exact path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;        // omitting &quot;search&quot; will allow all query parameters&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;        pathname&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;/photo.jpg&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt; // allow exact path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;        search&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;?v=1&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt; // allow exact query parameters&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;        pathname&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;/assets/**&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt; // allow wildcard path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;        search&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt; // empty search will block all query parameters&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;      }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    ]&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Migration&lt;/strong&gt;: Configure &lt;code&gt;images.localPatterns&lt;/code&gt; in your &lt;code&gt;next.config.ts&lt;/code&gt; to explicitly allow query strings in your image paths. This provides better security and performance optimization.&lt;/p&gt;
&lt;h3 id=&quot;timeline&quot; data-docs-heading=&quot;&quot;&gt;Timeline&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#timeline&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;These deprecation warnings will appear starting with Next.js 15.5. The features will be completely removed in Next.js 16. We recommend migrating as soon as possible to avoid issues during the upgrade.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Share your feedback and help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;contributors&quot; data-docs-heading=&quot;&quot;&gt;Contributors&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-5#contributors&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js is the result of the combined work of over 3,000 individual developers. This release was brought to you by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Next.js&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/acdlite&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Andrew&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/bgub&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Ben&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/unstubbable&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Hendrik&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lubieowoce&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Janka&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/huozhi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiachi&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/feedthejim&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jimmy&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/devjiwonchoi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiwon&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/ijjk&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;JJ&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gnoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Josh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gao_jude&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jude&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/robpruzan&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Rob&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://x.com/samselikoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sam&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/sebmarkbage&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebastian&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/eps1lon&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebbie&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/wyattjoh&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Wyatt&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/ztanner&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Zack&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Turbopack&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/bgw&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Benjamin&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/Cy-Tek&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Josh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lukesandberg&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Luke&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/padmaia&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Maia&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/mischnic&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Niklas&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/timneutkens&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tim&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/sokra&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tobias&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/wbinnssmith&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Will&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Next.js Docs&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/delbaoliveira&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Delba&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/molebox&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Rich&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/ismaelrumzan&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Ismael&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/icyJoseph&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Joseph&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/leerob&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Lee&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Huge thanks to @unstubbable, @gnoff, @RobPruzan, @mischnic, @huozhi, @delbaoliveira, @styfle, @ankur-arch, @skt-t1-byungi, @ijjk, @Han5991, @SyMind, @Anas-github-acc, @hf, @bgw, @wyattjoh, @ztanner, @prateekkish, @eps1lon, @lubieowoce, @timneutkens, @acdlite, @lukesandberg, @bgub, @Cy-Tek, @padmaia, @raunofreiberg, @devjiwonchoi, @sokra, @MidnightDesign, @stephenliang, @allenzhou101, @icyJoseph, @gaojude, @remcohaszing, @wesjune, @wbinnssmith, @m1abdullahh, @Sayakie, @startracex, @chadfennell, @dlehmhus, @Jarred-Sumner, @candymask0712, @stepan662, @PuppyOne, @huperniketes, @xusd320, @MichalMoravik, @fireairforce, @kitfoster, @feedthejim, and @r34son for helping!&lt;/p&gt;</description><link>https://nextjs.org/blog/next-15-5</link><guid isPermaLink="false">https://nextjs.org/blog/next-15-5</guid><pubDate>Invalid Date</pubDate></item><item><title>Next.js 15.4</title><description>&lt;p&gt;Next.js 15.4 includes updates to performance, stability, and Turbopack compatibility. Highlights for this release include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-15-4#turbopack-builds&quot;&gt;&lt;strong&gt;Turbopack Builds&lt;/strong&gt;&lt;/a&gt;: 100% integration test compatibility for &lt;code&gt;next build --turbopack&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nextjs.org/blog/next-15-4#notable-changes&quot;&gt;&lt;strong&gt;Stability Improvements&lt;/strong&gt;&lt;/a&gt;: Numerous stability and performance improvements to Next.js and Turbopack&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog post also includes an early preview of what&#39;s coming in Next.js 16, our next major release.&lt;/p&gt;
&lt;p&gt;Upgrade today, or get started with:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m1.53 12.78-.53.53-1.06-1.06.53-.53L4.19 8 .47 4.28l-.53-.53L1 2.69l.53.53L5.6 7.29a1 1 0 0 1 0 1.42zm7.22-.28H8V14h8v-1.5H8.75&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;Terminal&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# Use the automated upgrade CLI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; @next/codemod@canary&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; upgrade&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or upgrade manually&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; next@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react@latest&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; react-dom@latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;# ...or start a new project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string)&quot;&gt; create-next-app@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;turbopack-builds&quot; data-docs-heading=&quot;&quot;&gt;Turbopack Builds&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-4#turbopack-builds&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;next build --turbopack&lt;/code&gt; now passes &lt;a href=&quot;https://areweturboyet.com/&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;all 8298 integration tests&lt;/strong&gt;&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; for production builds and now powers &lt;code&gt;vercel.com&lt;/code&gt;. This is a crucial milestone towards marking Turbopack in Next.js stable.&lt;/p&gt;
&lt;p&gt;The team&#39;s current priority is to finish the swing on bundling optimizations via production chunking and to fix reported bugs from early adopters of the Alpha release. We&#39;ve also made numerous stability and performance improvements to Turbopack under the hood.&lt;/p&gt;
&lt;p&gt;We are confident that Turbopack will soon be ready for production use, and we&#39;re working towards a beta release in Next.js 16. If you had tried Turbopack previously, now is a good time to try again. If you run into any issues let us know on &lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;looking-ahead-nextjs-16&quot; data-docs-heading=&quot;&quot;&gt;Looking Ahead: Next.js 16&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-4#looking-ahead-nextjs-16&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Over the past few months, we&#39;ve been iterating on major improvements to Next.js, focusing on both the developer experience with Turbopack and the core capacities of the App Router with &lt;code&gt;PPR&lt;/code&gt; and &lt;code&gt;use cache&lt;/code&gt;. While we are not ready to enable those features on by default, we are looking to lay the groundwork for our users to try it out in Next.js 16 this summer.&lt;/p&gt;
&lt;p&gt;Here’s a preview of what&#39;s coming in Next.js 16:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cache Components (beta)&lt;/strong&gt;: Consolidates experimental caching features (Dynamic IO, &lt;code&gt;use cache&lt;/code&gt;, and Partial Prerendering) into a unified &lt;code&gt;cacheComponents&lt;/code&gt; flag, simplifying performance optimization strategies. The Next.js 16 blog post will detail our vision.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Turbopack Builds (beta)&lt;/strong&gt;: Introduces &lt;code&gt;next build --turbopack&lt;/code&gt;, fully passing integration tests, and validated internally on high-traffic sites like vercel.com. Ready for expanded public beta use in Next.js 16.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimized Client-Side Routing&lt;/strong&gt;: Enhances App Router navigation with smarter prefetching, improved cache invalidation strategies, and reduced bandwidth usage, resulting in faster and more responsive navigation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DevTools &amp;amp; Debugging&lt;/strong&gt;: Adds Route Info to inspect app structure and toggle components like &lt;code&gt;loading.tsx&lt;/code&gt;. Adds experimental browser log forwarding to the terminal to support AI-powered debugging workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js Middleware (stable)&lt;/strong&gt;: Promotes the previously experimental Node.js runtime support for Middleware, initially introduced in Next.js 15.2, to stable status.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployment Adapters (alpha)&lt;/strong&gt;: Enables developers to create custom deployment adapters for finer control over build and deploy targets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minor Deprecations and Changes&lt;/strong&gt;: Deprecates Node.js 18 support, AMP, and changes to select &lt;code&gt;next/image&lt;/code&gt; APIs with appropriate migration guidance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our goal is to make this update as smooth and straightforward as possible. We&#39;re managing these changes carefully to minimize disruption and will provide clear guidance and tools to support your transition to Next.js 16.&lt;/p&gt;
&lt;h2 id=&quot;preview-upcoming-features&quot; data-docs-heading=&quot;&quot;&gt;Preview Upcoming Features&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-4#preview-upcoming-features&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You can start experimenting with many of these features today by using the &lt;code&gt;canary&lt;/code&gt; channel and enabling the following flags in your &lt;code&gt;next.config.js&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;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&quot; data-geist-code-block=&quot;&quot;&gt;&lt;div class=&quot;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&quot;&gt;&lt;div class=&quot;gap-2 m-0 min-w-0 mr-auto flex items-center text-[13px] text-[var(--ds-gray-900)]&quot;&gt;&lt;div aria-hidden=&quot;true&quot; class=&quot;w-4 flex shrink-0 items-center&quot;&gt;&lt;svg fill=&quot;none&quot; height=&quot;14&quot; viewBox=&quot;0 0 512 512&quot; width=&quot;14&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;rect fill=&quot;currentColor&quot; height=&quot;512&quot; rx=&quot;50&quot; width=&quot;512&quot;&gt;&lt;/rect&gt;&lt;path clip-rule=&quot;evenodd&quot; d=&quot;m316.939 407.424v50.061c8.138 4.172 17.763 7.3 28.875 9.386s22.823 3.129 35.135 3.129c11.999 0 23.397-1.147 34.196-3.442 10.799-2.294 20.268-6.075 28.406-11.342 8.138-5.266 14.581-12.15 19.328-20.65s7.121-19.007 7.121-31.522c0-9.074-1.356-17.026-4.069-23.857s-6.625-12.906-11.738-18.225c-5.112-5.319-11.242-10.091-18.389-14.315s-15.207-8.213-24.18-11.967c-6.573-2.712-12.468-5.345-17.685-7.9-5.217-2.556-9.651-5.163-13.303-7.822-3.652-2.66-6.469-5.476-8.451-8.448-1.982-2.973-2.974-6.336-2.974-10.091 0-3.441.887-6.544 2.661-9.308s4.278-5.136 7.512-7.118c3.235-1.981 7.199-3.52 11.894-4.615 4.696-1.095 9.912-1.642 15.651-1.642 4.173 0 8.581.313 13.224.938 4.643.626 9.312 1.591 14.008 2.894 4.695 1.304 9.259 2.947 13.694 4.928 4.434 1.982 8.529 4.276 12.285 6.884v-46.776c-7.616-2.92-15.937-5.084-24.962-6.492s-19.381-2.112-31.066-2.112c-11.895 0-23.163 1.278-33.805 3.833s-20.006 6.544-28.093 11.967c-8.086 5.424-14.476 12.333-19.171 20.729-4.695 8.395-7.043 18.433-7.043 30.114 0 14.914 4.304 27.638 12.912 38.172 8.607 10.533 21.675 19.45 39.204 26.751 6.886 2.816 13.303 5.579 19.25 8.291s11.086 5.528 15.415 8.448c4.33 2.92 7.747 6.101 10.252 9.543 2.504 3.441 3.756 7.352 3.756 11.733 0 3.233-.783 6.231-2.348 8.995s-3.939 5.162-7.121 7.196-7.147 3.624-11.894 4.771c-4.748 1.148-10.303 1.721-16.668 1.721-10.851 0-21.597-1.903-32.24-5.71-10.642-3.806-20.502-9.516-29.579-17.13zm-84.159-123.342h64.22v-41.082h-179v41.082h63.906v182.918h50.874z&quot; fill=&quot;var(--ds-background-100)&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;span class=&quot;min-w-0 inline-block max-w-full truncate break-normal&quot;&gt;next.config.ts&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;gap-1 flex&quot;&gt;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; data-react-aria-pressable=&quot;true&quot; aria-label=&quot;Copy to clipboard&quot; data-testid=&quot;copy/button&quot; class=&quot;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))] 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]:transition-none data-[focus]:shadow-[var(--ds-focus-ring)] [&amp;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 geist-new-themed geist-new-tertiary geist-new-tertiary-fill rounded-md bg-transparent !text-[var(--themed-bg,_var(--ds-gray-1000))] [--themed-border:_transparent] [--themed-hover-bg:_var(--ds-gray-alpha-200)] [--lighten-color:_rgba(255,_255,_255,_0.8)] data-hover:![--themed-border:_var(--ds-gray-alpha-200)] p-0 w-[var(--geist-form-height)] h-[var(--geist-form-height)] data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_22%))] dark-theme:data-hover:bg-[var(--themed-hover-bg,_hsl(0,_0%,_80%))] data-hover:[--themed-border:var(--themed-hover-bg,_var(--ds-gray-200))] data-hover:disabled:bg-[var(--ds-gray-100)] !size-8 !rounded-[5px] [&amp;amp;_svg]:!text-[var(--ds-gray-900)]&quot; data-geist-button=&quot;&quot; data-prefix=&quot;false&quot; data-suffix=&quot;false&quot; data-version=&quot;v1&quot; style=&quot;--geist-icon-size:16px&quot;&gt;&lt;span class=&quot;truncate px-1.5 inline-flex items-center justify-center shrink-0&quot;&gt;&lt;div class=&quot;relative size-4&quot;&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-0 scale-50&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;m15.56 4-.53.53-8.8 8.8c-.68.68-1.78.68-2.47 0l.53-.54-.53.53-2.79-2.79L.44 10 1.5 8.94l.53.53 2.8 2.8c.1.09.25.09.35 0l8.79-8.8.53-.53z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div class=&quot;absolute transition-all duration-200 ease-in-out opacity-100 scale-100&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M8.25 2c.14 0 .25.11.25.25V3H10v-.75C10 1.28 9.22.5 8.25.5h-5.5C1.78.5 1 1.28 1 2.25v7.5c0 .97.78 1.75 1.75 1.75H4.5V10H2.75a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm5 4c.14 0 .25.11.25.25v7.5q-.02.23-.25.25h-5.5a.25.25 0 0 1-.25-.25v-7.5c0-.14.11-.25.25-.25zm0 9.5c.97 0 1.75-.78 1.75-1.75v-7.5c0-.97-.78-1.75-1.75-1.75h-5.5C6.78 4.5 6 5.28 6 6.25v7.5c0 .97.78 1.75 1.75 1.75z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre class=&quot;code-block-module__vF3MAa__pre&quot;&gt;&lt;code class=&quot;font-mono grid text-left !text-[13px] leading-[20px] break-normal hyphens-none whitespace-pre text-[var(--ds-gray-1000)]&quot; style=&quot;font-feature-settings:&amp;quot;liga&amp;quot; off&quot;&gt;&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; { NextConfig } &lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-string-expression)&quot;&gt; &#39;next&#39;&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; nextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-function)&quot;&gt; NextConfig&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  experimental&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // Forward browser logs to the terminal for easier debugging&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    browserDebugInfoInTerminal&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // Enable new caching and pre-rendering behavior&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    dynamicIO&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt; // will be renamed to cacheComponents in Next.js 16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // Activate new client-side router improvements&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    clientSegmentCache&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // Explore route composition and segment overrides via DevTools&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    devtoolSegmentExplorer&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // Enable support for `global-not-found`, which allows you to more easily define a global 404 page.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    globalNotFound&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-comment)&quot;&gt;    // Enable persistent caching for the turbopack dev server and build.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;    turbopackPersistentCaching&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-constant)&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;  }&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-punctuation)&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span class=&quot;line&quot; data-line=&quot;&quot;&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-token-keyword)&quot;&gt; default&lt;/span&gt;&lt;span style=&quot;color:var(--shiki-color-text)&quot;&gt; nextConfig;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;notable-changes&quot; data-docs-heading=&quot;&quot;&gt;Notable Changes&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-4#notable-changes&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[Improvement] Preserve RSC query during redirects (&lt;a href=&quot;https://github.com/vercel/next.js/pull/77963&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#77963&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Improvement] Graceful error fallback for bots (&lt;a href=&quot;https://github.com/vercel/next.js/pull/77916&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#77916&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Improvement] Disallow &lt;code&gt;unstable_rootParams&lt;/code&gt; in client components (&lt;a href=&quot;https://github.com/vercel/next.js/pull/79471&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#79471&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Improvement] Fix &lt;code&gt;bodySizeLimit&lt;/code&gt; errors and non-multipart actions (&lt;a href=&quot;https://github.com/vercel/next.js/pull/77746&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#77746&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Improvement] Respond with 404 for unknown action IDs (&lt;a href=&quot;https://github.com/vercel/next.js/pull/77012&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#77012&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Improvement] Check cache-busting params on RSC requests (&lt;a href=&quot;https://github.com/vercel/next.js/pull/80669&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#80669&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Improvement] Upgrade Vercel OG to 0.7.2 (&lt;a href=&quot;https://github.com/vercel/next.js/pull/81447&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#81447&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Improvement] List &lt;code&gt;assert/strict&lt;/code&gt; as external (&lt;a href=&quot;https://github.com/vercel/next.js/pull/80884&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#80884&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Improvement] Omit searchParam data from &lt;code&gt;FlightRouterState&lt;/code&gt; before transport (&lt;a href=&quot;https://github.com/vercel/next.js/pull/80734&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#80734&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Improvement] Render streaming metadata on the top level (&lt;a href=&quot;https://github.com/vercel/next.js/pull/80566&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#80566&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Fix] Clone the config module to avoid mutation (&lt;a href=&quot;https://github.com/vercel/next.js/pull/80573&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#80573&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Fix] Bugfix: Propagate &lt;code&gt;staleTime&lt;/code&gt; to seeded prefetch entry (&lt;a href=&quot;https://github.com/vercel/next.js/pull/81263&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#81263&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Fix] Reinstate vary (&lt;a href=&quot;https://github.com/vercel/next.js/pull/79939&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#79939&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Fix] Fix interestingness detection for React Compiler (&lt;a href=&quot;https://github.com/vercel/next.js/pull/79558&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#79558&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Fix] Fix react compiler usefulness detector (&lt;a href=&quot;https://github.com/vercel/next.js/pull/79480&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#79480&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Fix] Better handle edge-case file paths in launchEditor (&lt;a href=&quot;https://github.com/vercel/next.js/pull/79526&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#79526&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Fix] Client router should discard stale prefetch entries for static pages (&lt;a href=&quot;https://github.com/vercel/next.js/pull/79362&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#79362&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Feature] Add &lt;code&gt;onInvalidate&lt;/code&gt; to &lt;code&gt;router.prefetch&lt;/code&gt; (&lt;a href=&quot;https://github.com/vercel/next.js/pull/77880&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#77880&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Feature] Add &lt;code&gt;prefetch=&quot;auto&quot;&lt;/code&gt; as an alias to &lt;code&gt;prefetch={undefined}&lt;/code&gt; to Link (&lt;a href=&quot;https://github.com/vercel/next.js/pull/78689&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#78689&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Feature] Support metadata in global-not-found (&lt;a href=&quot;https://github.com/vercel/next.js/pull/78961&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#78961&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Feature] Restart dev server from error overlay (&lt;a href=&quot;https://github.com/vercel/next.js/pull/80060&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#80060&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Feature] Restart dev server from indicator preferences (&lt;a href=&quot;https://github.com/vercel/next.js/pull/80072&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#80072&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Feature] Add &lt;code&gt;--debug-prerender&lt;/code&gt; option for &lt;code&gt;next build&lt;/code&gt; (&lt;a href=&quot;https://github.com/vercel/next.js/pull/80667&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#80667&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Feature] Add htmlrewriter to server externals (&lt;a href=&quot;https://github.com/vercel/next.js/pull/80819&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#80819&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Feature] Allow partially prerendering intercepted dynamic routes (&lt;a href=&quot;https://github.com/vercel/next.js/pull/80851&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#80851&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Performance] Check files with SWC before React Compiler (&lt;a href=&quot;https://github.com/vercel/next.js/pull/75605&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#75605&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Performance] Improve static path generation performance and parameter handling (&lt;a href=&quot;https://github.com/vercel/next.js/pull/81254&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#81254&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[Misc] Fix &lt;code&gt;NEXT_CPU_PROF&lt;/code&gt; usage during development to allow capturing CPU traces (&lt;a href=&quot;https://github.com/vercel/next.js/pull/81248&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#81248&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Share your feedback and help shape the future of Next.js:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/discussions&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Discussions&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/next.js/issues&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;GitHub Issues&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;contributors&quot; data-docs-heading=&quot;&quot;&gt;Contributors&lt;a aria-label=&quot;Link to this section&quot; data-heading-link=&quot;&quot; href=&quot;https://nextjs.org/blog/next-15-4#contributors&quot;&gt;&lt;span&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;0.7em&quot; width=&quot;0.7em&quot;&gt;&lt;g stroke-width=&quot;1.2&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot;&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;path fill=&quot;none&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; stroke-miterlimit=&quot;10&quot; d=&quot;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&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Next.js is the result of the combined work of over 3,000 individual developers. This release was brought to you by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Next.js&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/acdlite&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Andrew&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/bgub&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Ben&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/unstubbable&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Hendrik&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lubieowoce&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Janka&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/huozhi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiachi&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/feedthejim&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jimmy&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/devjiwonchoi&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jiwon&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/ijjk&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;JJ&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gnoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Josh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/gao_jude&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Jude&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/robpruzan&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Rob&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://x.com/samselikoff&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sam&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/sebmarkbage&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebastian&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/eps1lon&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Sebbie&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/wyattjoh&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Wyatt&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/ztanner&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Zack&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Turbopack&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/bgw&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Benjamin&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/kdy1&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Donny&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/Cy-Tek&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Josh&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/lukesandberg&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Luke&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/padmaia&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Maia&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/mischnic&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Niklas&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/timneutkens&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tim&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/sokra&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Tobias&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/wbinnssmith&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Will&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Next.js Docs&lt;/strong&gt; team: &lt;a href=&quot;https://github.com/delbaoliveira&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Delba&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/molebox&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Rich&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/ismaelrumzan&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Ismael&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/icyJoseph&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Joseph&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/leerob&quot; rel=&quot;noopener noreferrer nofollow&quot; target=&quot;_blank&quot;&gt;Lee&lt;span class=&quot;inline-flex not-prose&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; height=&quot;16&quot; width=&quot;16&quot; data-slot=&quot;geist-icon&quot; style=&quot;color:currentColor&quot;&gt;&lt;path fill=&quot;currentColor&quot; fill-rule=&quot;evenodd&quot; d=&quot;M6.75 4H6v1.5h3.44L5.47 9.47l-.53.53L6 11.06l.53-.53 3.97-3.97V10H12V5a1 1 0 0 0-1-1z&quot; clip-rule=&quot;evenodd&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Huge thanks to @sokra, @huozhi, @Marukome0743, @mischnic, @wbinnssmith, @eps1lon, @razzeee, @delbaoliveira, @kdy1, @wyattjoh, @acdlite, @ztanner, @bgw, @jantimon, @lubieowoce, @Fonger, @ospira, @gnoff, @styfle, @Cy-Tek, @timneutkens, @raunofreiberg, @devchaudhary24k, @Neschadin, @OreQr, @drewlong314, @ijjk, @praizjosh, @unstubbable, @lukesandberg, @ScriptedAlchemy, @sqidermad, @Juneezee, @devjiwonchoi, @Kamitenshi, @feedthejim, @leerob, @mauerbac, @miki-tebe, @gaearon, @mrbadri, @luwes, @lucacasonato, @M4xymm, @jirihofman, @vicb, @jackwilson323, @SyMind, @kevva, @xyf7, @gaojude, @dario-piotrowicz, @mastoj, @nicole0707, @lourd, @Karibash, @chipit24, @icyJoseph, @xusd320, @fireairforce, @GenhaoLi, @igas, @Macw07, @amannn, @bcdipesh, @r34son, @ivasilov, @lpalmes, @imskyleen, @teamleaderleo, @vitaliemiron, @agadzik, @chdeskur, @nakanoh, @luiscobot, @GameRoMan, @dferber90, @maurobonfietti, @navandstokes, @sajadtorkamani, @bobziroll, @lumirlumir, @KkOoSsTtAa, @msabramo, @sommeeeer, @schoenwaldnils, @remcohaszing, @HerringtonDarkholme, @bgub, @RobPruzan, @lmammino, @MohammedYehia, @extoci, @padmaia, @aacosta11, @vercel-release-bot, @maral, @ethanniser, @MichalMoravik, @rajrawat37, @kidonng, @dnhn, @kristian240, @rachnac-emeritus, @rortan134, and @nick20name17 for helping!&lt;/p&gt;</description><link>https://nextjs.org/blog/next-15-4</link><guid isPermaLink="false">https://nextjs.org/blog/next-15-4</guid><pubDate>Invalid Date</pubDate></item></channel></rss>