CINXE.COM
Next.js 15 | Next.js
<!DOCTYPE html><html class="__variable_b4bd81 __variable_4d318d" lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/569ce4b8f30dc480-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/93f479601ee12b01-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" as="image" imageSrcSet="/_next/image?url=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1714730590%2Ffront%2Fnextjs%2Fuwu%2Fnext-uwu-logo.png&w=64&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1714730590%2Ffront%2Fnextjs%2Fuwu%2Fnext-uwu-logo.png&w=128&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x"/><link rel="stylesheet" href="/_next/static/css/94930d6f827b22e1.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/3a4b7cc0153d49b4.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/58f50fdfd3cd38b6.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/bf98005f04f1b7f7.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/bfc235d8dfd01529.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/824202e71e79374d.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/83fe6bc36ad4703d.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/4ad309783bf416a2.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/baf446a5c20b5fd4.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/f4addedd731adba4.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-a905a987e08406bb.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/><script src="/_next/static/chunks/99092f3b-dd5f932fd9583573.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/9892-5407b200f0921b36.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/main-app-13c50f3c93ee782b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/5600-036b4f92f1d976a8.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/app/(next-site)/page-d065ed8aa15519a9.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/4056-9fa3824b33ab5ae6.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/6807-775e501a7f5d3c3f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script src="/_next/static/chunks/app/(next-site)/blog/%5Bslug%5D/page-298e9255ec207842.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><meta name="next-size-adjust" content=""/><title>Next.js 15 | Next.js</title><meta name="description" content="Next.js 15 introduces React 19 support, caching improvements, a stable release for Turbopack in development, new APIs, and more."/><link rel="canonical" href="https://nextjs.org/blog/next-15"/><meta property="og:title" content="Next.js 15"/><meta property="og:description" content="Next.js 15 introduces React 19 support, caching improvements, a stable release for Turbopack in development, new APIs, and more."/><meta property="og:url" content="https://nextjs.org/blog/next-15"/><meta property="og:image" content="https://nextjs.org/static/blog/next-15/twitter-card.png"/><meta property="og:type" content="article"/><meta property="article:published_time" content="2024-10-21T17:00:00.507Z"/><meta property="article:author" content="Delba de Oliveira"/><meta property="article:author" content="Jimmy Lai"/><meta property="article:author" content="Rich Haines"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Next.js 15"/><meta name="twitter:description" content="Next.js 15 introduces React 19 support, caching improvements, a stable release for Turbopack in development, new APIs, and more."/><meta name="twitter:image" content="https://nextjs.org/static/blog/next-15/twitter-card.png"/><link rel="icon" href="/favicon.ico" type="image/x-icon" sizes="48x48"/><style>.uwu-flex { display: none; } .uwu .uwu-flex { display: flex; } .uwu .uwu-hidden { display: none; }</style><script>try { if (['', 'true', '1'].includes(new URLSearchParams(document.location.search).get('uwu'))) { document.documentElement.classList.add('uwu'); console.log('Next.js uwu logo by SAWARATSUKI: https://github.com/SAWARATSUKI'); } } catch (e) {}</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" noModule=""></script></head><body><!--$--><!--/$--><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><!--$--><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><!--/$--><header class="header_header__zJOD0 header_sticky__2ak2z"><a class="skip-nav-link_skipLink__M2lut" href="#geist-skip-nav" tabindex="0">Skip to content</a><nav class="navbar_nav__dCdXi"><div class="navbar_mobileTop__yLNXQ"><div class="stack_stack__iZkUS stack" data-version="v1" style="--stack-flex:initial;--stack-direction:row;--stack-align:center;--stack-justify:flex-start;--stack-padding:0px;--stack-gap:4px"><a rel="noopener noreferrer" target="_blank" data-testid="navbar/vercel-logo" href="https://vercel.com/home?utm_source=next-site&utm_medium=banner&utm_campaign=blog_next-15" aria-label="Go to Vercel homepage" title="Go to Vercel homepage"><svg aria-label="Vercel logomark" height="22" role="img" style="width:auto;overflow:visible" viewBox="0 0 74 64"><path d="M37.5896 0.25L74.5396 64.25H0.639648L37.5896 0.25Z" fill="var(--geist-foreground)"></path></svg></a><svg height="32" viewBox="0 0 32 32" width="32"><path d="M22 5L9 28" stroke="var(--accents-2)" stroke-linecap="round" stroke-linejoin="round"></path></svg><div class="uwu-flex"><a class="navbar_uwuMobileLogo__zHGR_" title="Go to the homepage" data-zone="same" href="/?uwu=true"><img alt="Next.js uwu logo by SAWARATSUKI" width="54" height="34" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1714730590%2Ffront%2Fnextjs%2Fuwu%2Fnext-uwu-logo.png&w=64&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1714730590%2Ffront%2Fnextjs%2Fuwu%2Fnext-uwu-logo.png&w=128&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x" src="/_next/image?url=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1714730590%2Ffront%2Fnextjs%2Fuwu%2Fnext-uwu-logo.png&w=128&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/></a></div><div class="uwu-hidden"><a class="navbar_mobileLogo__Q5KxZ" title="Go to the homepage" data-zone="same" href="/"><svg aria-label="Next.js logotype" height="18" role="img" viewBox="0 0 394 79"><path d="M261.919 0.0330722H330.547V12.7H303.323V79.339H289.71V12.7H261.919V0.0330722Z" fill="var(--geist-foreground)"></path><path d="M149.052 0.0330722V12.7H94.0421V33.0772H138.281V45.7441H94.0421V66.6721H149.052V79.339H80.43V12.7H80.4243V0.0330722H149.052Z" fill="var(--geist-foreground)"></path><path d="M183.32 0.0661486H165.506L229.312 79.3721H247.178L215.271 39.7464L247.127 0.126654L229.312 0.154184L206.352 28.6697L183.32 0.0661486Z" fill="var(--geist-foreground)"></path><path d="M201.6 56.7148L192.679 45.6229L165.455 79.4326H183.32L201.6 56.7148Z" fill="var(--geist-foreground)"></path><path clip-rule="evenodd" d="M80.907 79.339L17.0151 0H0V79.3059H13.6121V16.9516L63.8067 79.339H80.907Z" fill="var(--geist-foreground)" fill-rule="evenodd"></path><path d="M333.607 78.8546C332.61 78.8546 331.762 78.5093 331.052 77.8186C330.342 77.1279 329.991 76.2917 330 75.3011C329.991 74.3377 330.342 73.5106 331.052 72.8199C331.762 72.1292 332.61 71.7838 333.607 71.7838C334.566 71.7838 335.405 72.1292 336.115 72.8199C336.835 73.5106 337.194 74.3377 337.204 75.3011C337.194 75.9554 337.028 76.5552 336.696 77.0914C336.355 77.6368 335.922 78.064 335.377 78.373C334.842 78.6911 334.252 78.8546 333.607 78.8546Z" fill="var(--geist-foreground)"></path><path d="M356.84 45.4453H362.872V68.6846C362.863 70.8204 362.401 72.6472 361.498 74.1832C360.585 75.7191 359.321 76.8914 357.698 77.7185C356.084 78.5364 354.193 78.9546 352.044 78.9546C350.079 78.9546 348.318 78.6001 346.75 77.9094C345.182 77.2187 343.937 76.1826 343.024 74.8193C342.101 73.456 341.649 71.7565 341.649 69.7207H347.691C347.7 70.6114 347.903 71.3838 348.29 72.0291C348.677 72.6744 349.212 73.1651 349.895 73.5105C350.586 73.8559 351.38 74.0286 352.274 74.0286C353.243 74.0286 354.073 73.8286 354.746 73.4196C355.419 73.0197 355.936 72.4199 356.296 71.6201C356.646 70.8295 356.831 69.8479 356.84 68.6846V45.4453Z" fill="var(--geist-foreground)"></path><path d="M387.691 54.5338C387.544 53.1251 386.898 52.0254 385.773 51.2438C384.638 50.4531 383.172 50.0623 381.373 50.0623C380.11 50.0623 379.022 50.2532 378.118 50.6258C377.214 51.0075 376.513 51.5164 376.033 52.1617C375.554 52.807 375.314 53.5432 375.295 54.3703C375.295 55.061 375.461 55.6608 375.784 56.1607C376.107 56.6696 376.54 57.0968 377.103 57.4422C377.656 57.7966 378.274 58.0874 378.948 58.3237C379.63 58.56 380.313 58.76 380.995 58.9236L384.14 59.6961C385.404 59.9869 386.631 60.3778 387.802 60.8776C388.973 61.3684 390.034 61.9955 390.965 62.7498C391.897 63.5042 392.635 64.413 393.179 65.4764C393.723 66.5397 394 67.7848 394 69.2208C394 71.1566 393.502 72.8562 392.496 74.3285C391.491 75.7917 390.043 76.9369 388.143 77.764C386.252 78.582 383.965 79 381.272 79C378.671 79 376.402 78.6002 374.493 77.8004C372.575 77.0097 371.08 75.8463 370.001 74.3194C368.922 72.7926 368.341 70.9294 368.258 68.7391H374.235C374.318 69.8842 374.687 70.8386 375.314 71.6111C375.95 72.3745 376.78 72.938 377.795 73.3197C378.819 73.6923 379.962 73.8832 381.226 73.8832C382.545 73.8832 383.707 73.6832 384.712 73.2924C385.708 72.9016 386.492 72.3564 387.055 71.6475C387.627 70.9476 387.913 70.1206 387.922 69.1754C387.913 68.312 387.654 67.5939 387.156 67.0304C386.649 66.467 385.948 65.9944 385.053 65.6127C384.15 65.231 383.098 64.8856 381.899 64.5857L378.081 63.6223C375.323 62.9225 373.137 61.8592 371.541 60.4323C369.937 59.0054 369.143 57.115 369.143 54.7429C369.143 52.798 369.678 51.0894 370.758 49.6261C371.827 48.1629 373.294 47.0268 375.148 46.2179C377.011 45.4 379.114 45 381.456 45C383.836 45 385.92 45.4 387.719 46.2179C389.517 47.0268 390.929 48.1538 391.952 49.5897C392.976 51.0257 393.511 52.6707 393.539 54.5338H387.691Z" fill="var(--geist-foreground)"></path></svg></a></div></div><div class="navbar_mobileTopRight__p4VGF"><button class="navbar_search__dZT2b" data-variant="large" type="button">Search documentation...</button><button class="navbar_search__dZT2b" data-variant="medium" type="button">Search...<kbd>⌘K</kbd></button><button aria-label="Search documentation" class="navbar_search__dZT2b" data-variant="small" type="button"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor"><path d="M11 17.25a6.25 6.25 0 110-12.5 6.25 6.25 0 010 12.5z"/><path d="M16 16l4.5 4.5"/></svg></button><button aria-label="open menu" class="navbar_menuButton__BJwt4" type="button"><div class="menu-toggle_wrap__qevaX "></div></button></div></div><div class="navbar_links__jysVN"><div class="stack_stack__iZkUS stack" data-version="v1" style="--stack-flex:initial;--stack-direction:row;--stack-align:center;--stack-justify:flex-start;--stack-padding:0px;--stack-gap:4px"><a rel="noopener noreferrer" target="_blank" data-testid="navbar/vercel-logo" href="https://vercel.com/home?utm_source=next-site&utm_medium=banner&utm_campaign=blog_next-15" aria-label="Go to Vercel homepage" title="Go to Vercel homepage"><svg aria-label="Vercel logomark" height="22" role="img" style="width:auto;overflow:visible" viewBox="0 0 74 64"><path d="M37.5896 0.25L74.5396 64.25H0.639648L37.5896 0.25Z" fill="var(--geist-foreground)"></path></svg></a><svg height="32" viewBox="0 0 32 32" width="32"><path d="M22 5L9 28" stroke="var(--accents-2)" stroke-linecap="round" stroke-linejoin="round"></path></svg><div class="navbar_uwuDesktopLogoWrapper__VynOK uwu-flex"><a aria-label="Go to the homepage" class="navbar_uwuDesktopLogo__MHsxN" title="Go to the homepage" data-state="closed" style="-webkit-touch-callout:none" data-zone="same" href="/?uwu=true"><img alt="Next.js uwu logo by SAWARATSUKI" width="54" height="34" decoding="async" data-nimg="1" style="color:transparent" srcSet="/_next/image?url=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1714730590%2Ffront%2Fnextjs%2Fuwu%2Fnext-uwu-logo.png&w=64&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1714730590%2Ffront%2Fnextjs%2Fuwu%2Fnext-uwu-logo.png&w=128&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x" src="/_next/image?url=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1714730590%2Ffront%2Fnextjs%2Fuwu%2Fnext-uwu-logo.png&w=128&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/></a></div><div class="uwu-hidden"><a aria-label="Go to the homepage" class="navbar_logo__wXwXy" title="Go to the homepage" data-state="closed" style="-webkit-touch-callout:none" data-zone="same" href="/"><svg aria-label="Next.js logotype" height="18" role="img" viewBox="0 0 394 79"><path d="M261.919 0.0330722H330.547V12.7H303.323V79.339H289.71V12.7H261.919V0.0330722Z" fill="var(--geist-foreground)"></path><path d="M149.052 0.0330722V12.7H94.0421V33.0772H138.281V45.7441H94.0421V66.6721H149.052V79.339H80.43V12.7H80.4243V0.0330722H149.052Z" fill="var(--geist-foreground)"></path><path d="M183.32 0.0661486H165.506L229.312 79.3721H247.178L215.271 39.7464L247.127 0.126654L229.312 0.154184L206.352 28.6697L183.32 0.0661486Z" fill="var(--geist-foreground)"></path><path d="M201.6 56.7148L192.679 45.6229L165.455 79.4326H183.32L201.6 56.7148Z" fill="var(--geist-foreground)"></path><path clip-rule="evenodd" d="M80.907 79.339L17.0151 0H0V79.3059H13.6121V16.9516L63.8067 79.339H80.907Z" fill="var(--geist-foreground)" fill-rule="evenodd"></path><path d="M333.607 78.8546C332.61 78.8546 331.762 78.5093 331.052 77.8186C330.342 77.1279 329.991 76.2917 330 75.3011C329.991 74.3377 330.342 73.5106 331.052 72.8199C331.762 72.1292 332.61 71.7838 333.607 71.7838C334.566 71.7838 335.405 72.1292 336.115 72.8199C336.835 73.5106 337.194 74.3377 337.204 75.3011C337.194 75.9554 337.028 76.5552 336.696 77.0914C336.355 77.6368 335.922 78.064 335.377 78.373C334.842 78.6911 334.252 78.8546 333.607 78.8546Z" fill="var(--geist-foreground)"></path><path d="M356.84 45.4453H362.872V68.6846C362.863 70.8204 362.401 72.6472 361.498 74.1832C360.585 75.7191 359.321 76.8914 357.698 77.7185C356.084 78.5364 354.193 78.9546 352.044 78.9546C350.079 78.9546 348.318 78.6001 346.75 77.9094C345.182 77.2187 343.937 76.1826 343.024 74.8193C342.101 73.456 341.649 71.7565 341.649 69.7207H347.691C347.7 70.6114 347.903 71.3838 348.29 72.0291C348.677 72.6744 349.212 73.1651 349.895 73.5105C350.586 73.8559 351.38 74.0286 352.274 74.0286C353.243 74.0286 354.073 73.8286 354.746 73.4196C355.419 73.0197 355.936 72.4199 356.296 71.6201C356.646 70.8295 356.831 69.8479 356.84 68.6846V45.4453Z" fill="var(--geist-foreground)"></path><path d="M387.691 54.5338C387.544 53.1251 386.898 52.0254 385.773 51.2438C384.638 50.4531 383.172 50.0623 381.373 50.0623C380.11 50.0623 379.022 50.2532 378.118 50.6258C377.214 51.0075 376.513 51.5164 376.033 52.1617C375.554 52.807 375.314 53.5432 375.295 54.3703C375.295 55.061 375.461 55.6608 375.784 56.1607C376.107 56.6696 376.54 57.0968 377.103 57.4422C377.656 57.7966 378.274 58.0874 378.948 58.3237C379.63 58.56 380.313 58.76 380.995 58.9236L384.14 59.6961C385.404 59.9869 386.631 60.3778 387.802 60.8776C388.973 61.3684 390.034 61.9955 390.965 62.7498C391.897 63.5042 392.635 64.413 393.179 65.4764C393.723 66.5397 394 67.7848 394 69.2208C394 71.1566 393.502 72.8562 392.496 74.3285C391.491 75.7917 390.043 76.9369 388.143 77.764C386.252 78.582 383.965 79 381.272 79C378.671 79 376.402 78.6002 374.493 77.8004C372.575 77.0097 371.08 75.8463 370.001 74.3194C368.922 72.7926 368.341 70.9294 368.258 68.7391H374.235C374.318 69.8842 374.687 70.8386 375.314 71.6111C375.95 72.3745 376.78 72.938 377.795 73.3197C378.819 73.6923 379.962 73.8832 381.226 73.8832C382.545 73.8832 383.707 73.6832 384.712 73.2924C385.708 72.9016 386.492 72.3564 387.055 71.6475C387.627 70.9476 387.913 70.1206 387.922 69.1754C387.913 68.312 387.654 67.5939 387.156 67.0304C386.649 66.467 385.948 65.9944 385.053 65.6127C384.15 65.231 383.098 64.8856 381.899 64.5857L378.081 63.6223C375.323 62.9225 373.137 61.8592 371.541 60.4323C369.937 59.0054 369.143 57.115 369.143 54.7429C369.143 52.798 369.678 51.0894 370.758 49.6261C371.827 48.1629 373.294 47.0268 375.148 46.2179C377.011 45.4 379.114 45 381.456 45C383.836 45 385.92 45.4 387.719 46.2179C389.517 47.0268 390.929 48.1538 391.952 49.5897C392.976 51.0257 393.511 52.6707 393.539 54.5338H387.691Z" fill="var(--geist-foreground)"></path></svg></a></div></div><a class="" data-zone="same" href="/showcase">Showcase</a><a class="" title="Documentation" data-zone="same" href="/docs">Docs</a><a class="navbar_selected__XbA4W" data-zone="same" href="/blog">Blog</a><a rel="noopener noreferrer" target="_blank" href="https://vercel.com/templates/next.js?utm_source=next-site&utm_medium=navbar&utm_campaign=next_site_nav_templates">Templates<svg aria-hidden="true" class="navbar_externalArrow___VWBd" height="7" viewBox="0 0 6 6" width="7"><path d="M1.25215 5.54731L0.622742 4.9179L3.78169 1.75597H1.3834L1.38936 0.890915H5.27615V4.78069H4.40513L4.41109 2.38538L1.25215 5.54731Z" fill="var(--accents-3)"></path></svg></a><a rel="noopener noreferrer" target="_blank" href="https://vercel.com/contact/sales/nextjs?utm_source=next-site&utm_medium=navbar&utm_campaign=next_site_nav_enterprise">Enterprise<svg aria-hidden="true" class="navbar_externalArrow___VWBd" height="7" viewBox="0 0 6 6" width="7"><path d="M1.25215 5.54731L0.622742 4.9179L3.78169 1.75597H1.3834L1.38936 0.890915H5.27615V4.78069H4.40513L4.41109 2.38538L1.25215 5.54731Z" fill="var(--accents-3)"></path></svg></a></div><div class="navbar_headerButtons__m6ZFa"><button class="navbar_search__dZT2b" data-variant="large" type="button">Search documentation...</button><button class="navbar_search__dZT2b" data-variant="medium" type="button">Search...<kbd>⌘K</kbd></button><button aria-label="Search documentation" class="navbar_search__dZT2b" data-variant="small" type="button"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor"><path d="M11 17.25a6.25 6.25 0 110-12.5 6.25 6.25 0 010 12.5z"/><path d="M16 16l4.5 4.5"/></svg></button><a role="link" tabindex="0" href="https://vercel.com/new/clone?utm_source=next-site&utm_medium=banner&b=main&s=https%3A%2F%2Fgithub.com%2Fvercel%2Fvercel%2Ftree%2Fmain%2Fexamples%2Fnextjs&showOptionalTeamCreation=false&template=nextjs&teamCreateStatus=hidden&utm_campaign=blog_next-15" type="submit" class="button_base__BjwbK reset_reset__KRyvc button_button__81573 reset_reset__KRyvc navbar_deploy__IKZN3 button_secondary__kMMNc button_small__iQMBm button_invert__YNhnn" data-geist-button="" data-prefix="true" data-suffix="false" data-version="v1" style="--geist-icon-size:16px"><span class="button_prefix__2XlwH"><svg aria-label="Vercel logomark" height="13" role="img" style="width:auto;overflow:visible" viewBox="0 0 74 64"><path d="M37.5896 0.25L74.5396 64.25H0.639648L37.5896 0.25Z" fill="var(--geist-foreground)"></path></svg></span><span class="button_content__1aE1_">Deploy</span></a><a role="link" tabindex="0" href="/learn" type="submit" class="button_base__BjwbK reset_reset__KRyvc button_button__81573 reset_reset__KRyvc geist-new-themed geist-new-default geist-new-default-fill button_small__iQMBm button_invert__YNhnn" data-geist-button="" data-prefix="false" data-suffix="false" data-version="v1" style="--geist-icon-size:16px"><span class="button_content__1aE1_">Learn</span></a></div></nav></header><script>!function(){try{var d=document.documentElement,c=d.classList;c.remove('light-theme','dark-theme');var e=localStorage.getItem('zeit-theme');if('system'===e||(!e&&true)){var t='(prefers-color-scheme: dark)',m=window.matchMedia(t);if(m.media!==t||m.matches){d.style.colorScheme = 'dark';c.add('dark-theme')}else{d.style.colorScheme = 'light';c.add('light-theme')}}else if(e){var x={"light":"light-theme","dark":"dark-theme"};c.add(x[e]|| '')}if(e==='light'||e==='dark')d.style.colorScheme=e}catch(e){}}()</script><!--$--><!--/$--><main><div class="relative mx-auto max-w-screen-xl gap-x-6 px-4 py-10 md:flex md:flex-row md:py-10"><div id="geist-skip-nav" tabindex="-1"></div><article class="detail_root__DU4wZ pb-20"><a class="detail_back__6w4Dy" href="/blog"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M19 12H5"/><path d="M12 19l-7-7 7-7"/></svg>Back to Blog</a><p class="text_wrapper__i87JK" data-version="v1" style="--text-color:var(--ds-gray-900);--text-size:0.875rem;--text-line-height:1rem;--text-letter-spacing:initial;--text-weight:400">Monday, October 21st 2024</p><h1 class="text_wrapper__i87JK font-semibold" data-version="v1" style="--text-color:var(--ds-gray-1000);--text-size:3rem;--text-line-height:3.5rem;--text-letter-spacing:-0.066875rem;--text-weight:700">Next.js 15</h1><span class="text_wrapper__i87JK" data-version="v1" style="--text-color:var(--ds-gray-900);--text-size:0.875rem;--text-line-height:1.25rem;--text-letter-spacing:initial;--text-weight:400">Posted by</span><div class="stack_stack__iZkUS stack detail_authors__59UPR mb-8 mt-3 pb-4" data-version="v1" style="--stack-flex:initial;--stack-direction:row;--stack-align:stretch;--stack-justify:flex-start;--stack-padding:0px;--stack-gap:16px"><a class="detail_author__AvoLc" href="https://twitter.com/delba_oliveira" target="_blank" rel="noopener noreferrer"><img alt="Delba de Oliveira" loading="lazy" width="32" height="32" decoding="async" data-nimg="1" class="rounded-full" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Fteam%2Fdelba.jpg&w=48&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=%2Fstatic%2Fteam%2Fdelba.jpg&w=64&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x" src="/_next/image?url=%2Fstatic%2Fteam%2Fdelba.jpg&w=64&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/><div class="stack_stack__iZkUS stack" data-version="v1" style="--stack-flex:initial;--stack-direction:column;--stack-align:stretch;--stack-justify:flex-start;--stack-padding:0px;--stack-gap:0px"><span class="text_wrapper__i87JK" data-version="v1" style="--text-color:var(--ds-gray-1000);--text-size:0.875rem;--text-line-height:1.25rem;--text-letter-spacing:initial;--text-weight:500">Delba de Oliveira</span><span class="text_wrapper__i87JK" data-version="v1" style="--text-color:var(--ds-gray-900);--text-size:0.75rem;--text-line-height:1rem;--text-letter-spacing:initial;--text-weight:400">@<!-- -->delba_oliveira</span></div></a><a class="detail_author__AvoLc" href="https://twitter.com/feedthejim" target="_blank" rel="noopener noreferrer"><img alt="Jimmy Lai" loading="lazy" width="32" height="32" decoding="async" data-nimg="1" class="rounded-full" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Fteam%2Fjimmy.jpg&w=48&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=%2Fstatic%2Fteam%2Fjimmy.jpg&w=64&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x" src="/_next/image?url=%2Fstatic%2Fteam%2Fjimmy.jpg&w=64&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/><div class="stack_stack__iZkUS stack" data-version="v1" style="--stack-flex:initial;--stack-direction:column;--stack-align:stretch;--stack-justify:flex-start;--stack-padding:0px;--stack-gap:0px"><span class="text_wrapper__i87JK" data-version="v1" style="--text-color:var(--ds-gray-1000);--text-size:0.875rem;--text-line-height:1.25rem;--text-letter-spacing:initial;--text-weight:500">Jimmy Lai</span><span class="text_wrapper__i87JK" data-version="v1" style="--text-color:var(--ds-gray-900);--text-size:0.75rem;--text-line-height:1rem;--text-letter-spacing:initial;--text-weight:400">@<!-- -->feedthejim</span></div></a><a class="detail_author__AvoLc" href="https://twitter.com/studio_hungry" target="_blank" rel="noopener noreferrer"><img alt="Rich Haines" loading="lazy" width="32" height="32" decoding="async" data-nimg="1" class="rounded-full" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Fteam%2Frich.jpg&w=48&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=%2Fstatic%2Fteam%2Frich.jpg&w=64&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x" src="/_next/image?url=%2Fstatic%2Fteam%2Frich.jpg&w=64&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/><div class="stack_stack__iZkUS stack" data-version="v1" style="--stack-flex:initial;--stack-direction:column;--stack-align:stretch;--stack-justify:flex-start;--stack-padding:0px;--stack-gap:0px"><span class="text_wrapper__i87JK" data-version="v1" style="--text-color:var(--ds-gray-1000);--text-size:0.875rem;--text-line-height:1.25rem;--text-letter-spacing:initial;--text-weight:500">Rich Haines</span><span class="text_wrapper__i87JK" data-version="v1" style="--text-color:var(--ds-gray-900);--text-size:0.75rem;--text-line-height:1rem;--text-letter-spacing:initial;--text-weight:400">@<!-- -->studio_hungry</span></div></a></div><div class="prose prose-vercel max-w-none"><p>Next.js 15 is officially stable and ready for production. This release builds on the updates from both <a href="/blog/next-15-rc">RC1</a> and <a href="/blog/next-15-rc2">RC2</a>. We've focused heavily on stability while adding some exciting updates we think you'll love. Try Next.js 15 today:</p> <div class="code-block_wrapper__t6FCO code-block_hasFileName__ezlBD not-prose" data-geist-code-block=""><div class="code-block_header__t3NRd"><div class="code-block_fileName__HmSv1"><div aria-hidden="true" class="code-block_iconWrapper__TuHFk"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="width:16px;height:16px;color:currentColor" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.53035 12.7804L1.00002 13.3108L-0.0606384 12.2501L0.469692 11.7198L4.18936 8.00011L0.469692 4.28044L-0.0606384 3.75011L1.00002 2.68945L1.53035 3.21978L5.60358 7.29301C5.9941 7.68353 5.9941 8.3167 5.60357 8.70722L1.53035 12.7804ZM8.75002 12.5001H8.00002V14.0001H8.75002H15.25H16V12.5001H15.25H8.75002Z" fill="currentColor" /></svg></div><span class="code-block_filenameP__02nok">terminal</span></div><div class="code-block_actions__yphRf"><button aria-label="Copy code" class="code-block_copyButton__uo5Yu" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button></div></div><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-comment)"># Use the new automated upgrade CLI</span></span> <span class="line"><span style="color:var(--shiki-color-text)">npx </span><span style="color:var(--shiki-token-string)">@next/codemod@canary</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string)">upgrade</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string)">latest</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-comment)"># ...or upgrade manually</span></span> <span class="line"><span style="color:var(--shiki-color-text)">npm </span><span style="color:var(--shiki-token-string)">install</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string)">next@latest</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string)">react@rc</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string)">react-dom@rc</span></span></code></pre></div> <p>We're also excited to share more about what's coming next at <a href="/conf">Next.js Conf</a> this Thursday, October 24th.</p> <p>Here's what is new in Next.js 15:</p> <ul> <li><a href="#smooth-upgrades-with-nextcodemod-cli"><strong><code>@next/codemod</code> CLI:</strong></a> Easily upgrade to the latest Next.js and React versions.</li> <li><a href="#async-request-apis-breaking-change"><strong>Async Request APIs (Breaking):</strong></a> Incremental step towards a simplified rendering and caching model.</li> <li><a href="#caching-semantics"><strong>Caching Semantics (Breaking):</strong></a> <code>fetch</code> requests, <code>GET</code> Route Handlers, and client navigations are no longer cached by default.</li> <li><a href="#react-19"><strong>React 19 Support:</strong></a> Support for React 19, React Compiler (Experimental), and hydration error improvements.</li> <li><a href="#turbopack-dev"><strong>Turbopack Dev (Stable):</strong></a> Performance and stability improvements.</li> <li><a href="#static-route-indicator"><strong>Static Indicator:</strong></a> New visual indicator shows static routes during development.</li> <li><a href="#executing-code-after-a-response-with-unstable_after-experimental"><strong><code>unstable_after</code> API (Experimental):</strong></a> Execute code after a response finishes streaming.</li> <li><a href="#instrumentationjs-stable"><strong><code>instrumentation.js</code> API (Stable):</strong></a> New API for server lifecycle observability.</li> <li><a href="#form-component"><strong>Enhanced Forms (<code>next/form</code>):</strong></a> Enhance HTML forms with client-side navigation.</li> <li><a href="#support-for-nextconfigts"><strong><code>next.config</code>:</strong></a> TypeScript support for <code>next.config.ts</code>.</li> <li><a href="#improvements-for-self-hosting"><strong>Self-hosting Improvements:</strong></a> More control over <code>Cache-Control</code> headers.</li> <li><a href="#enhanced-security-for-server-actions"><strong>Server Actions Security:</strong></a> Unguessable endpoints and removal of unused actions.</li> <li><a href="#optimizing-bundling-of-external-packages-stable"><strong>Bundling External Packages (Stable):</strong></a> New config options for App and Pages Router.</li> <li><a href="#eslint-9-support"><strong>ESLint 9 Support:</strong></a> Added support for ESLint 9.</li> <li><a href="#development-and-build-improvements"><strong>Development and Build Performance:</strong></a> Improved build times and Faster Fast Refresh.</li> </ul> <h2 id="smooth-upgrades-with-nextcodemod-cli" data-docs-heading=""><a href="#smooth-upgrades-with-nextcodemod-cli">Smooth upgrades with <code>@next/codemod</code> CLI<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>We include codemods (automated code transformations) with every major Next.js release to help automate upgrading breaking changes.</p> <p>To make upgrades even smoother, we've released an enhanced codemod CLI:</p> <div class="code-block_wrapper__t6FCO code-block_hasFileName__ezlBD code-block_hideLineNumbers__52YKH not-prose" data-geist-code-block=""><div class="code-block_header__t3NRd"><div class="code-block_fileName__HmSv1"><div aria-hidden="true" class="code-block_iconWrapper__TuHFk"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="width:16px;height:16px;color:currentColor" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.53035 12.7804L1.00002 13.3108L-0.0606384 12.2501L0.469692 11.7198L4.18936 8.00011L0.469692 4.28044L-0.0606384 3.75011L1.00002 2.68945L1.53035 3.21978L5.60358 7.29301C5.9941 7.68353 5.9941 8.3167 5.60357 8.70722L1.53035 12.7804ZM8.75002 12.5001H8.00002V14.0001H8.75002H15.25H16V12.5001H15.25H8.75002Z" fill="currentColor" /></svg></div><span class="code-block_filenameP__02nok">Terminal</span></div><div class="code-block_actions__yphRf"><button aria-label="Copy code" class="code-block_copyButton__uo5Yu" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button></div></div><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-color-text)">npx </span><span style="color:var(--shiki-token-string)">@next/codemod@canary</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string)">upgrade</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string)">latest</span></span></code></pre></div> <p>This tool helps you upgrade your codebase to the latest stable or prerelease versions. The CLI will update your dependencies, show available codemods, and guide you through applying them.</p> <p>The <code>canary</code> tag uses the latest version of the codemod while the latest specifies the Next.js version. We recommend using the canary version of the codemod even if you are upgrading to the latest Next.js version, as we plan to continue adding improvements to the tool based on your feedback.</p> <p>Learn more about <a href="/docs/app/building-your-application/upgrading/codemods">Next.js codemod CLI</a>.</p> <h2 id="async-request-apis-breaking-change" data-docs-heading=""><a href="#async-request-apis-breaking-change">Async Request APIs (Breaking Change)<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>In traditional Server-Side Rendering, the server waits for a request before rendering any content. However, not all components depend on request-specific data, so it's unnecessary to wait for the request to render them. Ideally, the server would prepare as much as possible before a request arrives. To enable this, and set the stage for future optimizations, we need to know when to wait for the request.</p> <p>Therefore, we are transitioning APIs that rely on request-specific data—such as <code>headers</code>, <code>cookies</code>, <code>params</code>, and <code>searchParams</code>—to be <strong>asynchronous</strong>.</p> <div class="code-block_wrapper__t6FCO not-prose" data-geist-code-block=""><button aria-label="Copy code" class="code-block_copyButton__uo5Yu code-block_copyFloatingButton__PsMvB" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-color-text)"> { cookies } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string-expression)">'next/headers'</span><span style="color:var(--shiki-color-text)">;</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">async</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">AdminPanel</span><span style="color:var(--shiki-color-text)">() {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">cookieStore</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">await</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">cookies</span><span style="color:var(--shiki-color-text)">();</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">token</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">cookieStore</span><span style="color:var(--shiki-token-function)">.get</span><span style="color:var(--shiki-color-text)">(</span><span style="color:var(--shiki-token-string-expression)">'token'</span><span style="color:var(--shiki-color-text)">);</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// ...</span></span> <span class="line"><span style="color:var(--shiki-color-text)">}</span></span></code></pre></div> <p>This is a <strong>breaking change</strong> and affects the following APIs:</p> <ul> <li><code>cookies</code></li> <li><code>headers</code></li> <li><code>draftMode</code></li> <li><code>params</code> in <code>layout.js</code>, <code>page.js</code>, <code>route.js</code>, <code>default.js</code>, <code>generateMetadata</code>, and <code>generateViewport</code></li> <li><code>searchParams</code> in <code>page.js</code></li> </ul> <p>For an easier migration, these APIs can temporarily be accessed synchronously, but will show warnings in development and production until the next major version. A <a href="/docs/app/building-your-application/upgrading/codemods">codemod</a> is available to automate the migration:</p> <div class="code-block_wrapper__t6FCO code-block_hasFileName__ezlBD code-block_hideLineNumbers__52YKH not-prose" data-geist-code-block=""><div class="code-block_header__t3NRd"><div class="code-block_fileName__HmSv1"><div aria-hidden="true" class="code-block_iconWrapper__TuHFk"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="width:16px;height:16px;color:currentColor" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.53035 12.7804L1.00002 13.3108L-0.0606384 12.2501L0.469692 11.7198L4.18936 8.00011L0.469692 4.28044L-0.0606384 3.75011L1.00002 2.68945L1.53035 3.21978L5.60358 7.29301C5.9941 7.68353 5.9941 8.3167 5.60357 8.70722L1.53035 12.7804ZM8.75002 12.5001H8.00002V14.0001H8.75002H15.25H16V12.5001H15.25H8.75002Z" fill="currentColor" /></svg></div><span class="code-block_filenameP__02nok">Terminal</span></div><div class="code-block_actions__yphRf"><button aria-label="Copy code" class="code-block_copyButton__uo5Yu" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button></div></div><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-color-text)">npx </span><span style="color:var(--shiki-token-string)">@next/codemod@canary</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string)">next-async-request-api</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string)">.</span></span></code></pre></div> <p>For cases where the codemod can't fully migrate your code, please read the <a href="/docs/app/building-your-application/upgrading/version-15">upgrade guide</a>. We have also provided an <a href="https://github.com/leerob/next-saas-starter/pull/62" rel="noopener noreferrer nofollow" target="_blank">example<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a> of how to migrate a Next.js application to the new APIs.</p> <h2 id="caching-semantics" data-docs-heading=""><a href="#caching-semantics">Caching Semantics<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>Next.js App Router launched with opinionated caching defaults. These were designed to provide the most performant option by default with the ability to opt out when required.</p> <p>Based on your feedback, we re-evaluated our <a href="https://x.com/feedthejim/status/1785242054773145636" rel="noopener noreferrer nofollow" target="_blank">caching heuristics<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a> and how they would interact with projects like Partial Prerendering (PPR) and with third party libraries using <code>fetch</code>.</p> <p>With Next.js 15, we're changing the caching default for <code>GET</code> Route Handlers and the Client Router Cache from cached by default to uncached by default. If you want to retain the previous behavior, you can continue to opt-into caching.</p> <p>We're continuing to improve caching in Next.js in the coming months and we'll share more details soon.</p> <h3 id="get-route-handlers-are-no-longer-cached-by-default" data-docs-heading=""><a href="#get-route-handlers-are-no-longer-cached-by-default"><code>GET</code> Route Handlers are no longer cached by default<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h3> <p>In Next 14, Route Handlers that used the <code>GET</code> HTTP method were cached by default unless they used a dynamic function or dynamic config option. In Next.js 15, <code>GET</code> functions are <strong>not cached by default</strong>.</p> <p>You can still opt into caching using a static route config option such as <code>export dynamic = 'force-static'</code>.</p> <p>Special Route Handlers like <a href="/docs/app/api-reference/file-conventions/metadata/sitemap"><code>sitemap.ts</code></a>, <a href="/docs/app/api-reference/file-conventions/metadata/opengraph-image"><code>opengraph-image.tsx</code></a>, and <a href="/docs/app/api-reference/file-conventions/metadata/app-icons"><code>icon.tsx</code></a>, and other <a href="/docs/app/api-reference/file-conventions/metadata">metadata files</a> remain static by default unless they use dynamic functions or dynamic config options.</p> <h3 id="client-router-cache-no-longer-caches-page-components-by-default" data-docs-heading=""><a href="#client-router-cache-no-longer-caches-page-components-by-default">Client Router Cache no longer caches Page components by default<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h3> <p>In Next.js 14.2.0, we introduced an experimental <a href="/docs/app/api-reference/next-config-js/staleTimes"><code>staleTimes</code></a> flag to allow custom configuration of the <a href="/docs/app/building-your-application/caching#client-side-router-cache">Router Cache</a>.</p> <p>In Next.js 15, this flag still remains accessible, but we are changing the default behavior to have a <code>staleTime</code> of <code>0</code> for Page segments. This means that as you navigate around your app, the client will always reflect the latest data from the Page component(s) that become active as part of the navigation. However, there are still important behaviors that remain unchanged:</p> <ul> <li>Shared layout data won't be refetched from the server to continue to support <a href="/docs/app/building-your-application/routing/linking-and-navigating#4-partial-rendering">partial rendering</a>.</li> <li>Back/forward navigation will still restore from cache to ensure the browser can restore scroll position.</li> <li><a href="/docs/app/api-reference/file-conventions/loading"><code>loading.js</code></a> will remain cached for 5 minutes (or the value of the <code>staleTimes.static</code> configuration).</li> </ul> <p>You can opt into the previous Client Router Cache behavior by setting the following configuration:</p> <div class="code-block_wrapper__t6FCO code-block_hasFileName__ezlBD not-prose" data-geist-code-block=""><div class="code-block_header__t3NRd"><div class="code-block_fileName__HmSv1"><div aria-hidden="true" class="code-block_iconWrapper__TuHFk"><svg fill="none" height="14" viewBox="0 0 512 512" width="14" xmlns="http://www.w3.org/2000/svg"><rect fill="currentColor" height="512" rx="50" width="512"></rect><rect fill="currentColor" height="512" rx="50" width="512"></rect><path clip-rule="evenodd" d="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" fill="var(--ds-background-100)" fill-rule="evenodd"></path></svg></div><span class="code-block_filenameP__02nok">next.config.ts</span></div><div class="code-block_actions__yphRf"><button aria-label="Copy code" class="code-block_copyButton__uo5Yu" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button></div></div><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">nextConfig</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> experimental</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> staleTimes</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> dynamic</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">30</span><span style="color:var(--shiki-token-punctuation)">,</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> }</span><span style="color:var(--shiki-token-punctuation)">,</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> }</span><span style="color:var(--shiki-token-punctuation)">,</span></span> <span class="line"><span style="color:var(--shiki-color-text)">};</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">default</span><span style="color:var(--shiki-color-text)"> nextConfig;</span></span></code></pre></div> <h2 id="react-19" data-docs-heading=""><a href="#react-19">React 19<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>As part of the Next.js 15 release, we've made the decision to align with the upcoming release of React 19.</p> <p>In version 15, the App Router uses React 19 RC, and we've also introduced backwards compatibility for React 18 with the Pages Router based on community feedback. If you're using the Pages Router, this allows you to upgrade to React 19 when ready.</p> <p>Although React 19 is still in the RC phase, our extensive testing across real-world applications and our close work with the React team have given us confidence in its stability. The core breaking changes have been well-tested and won't affect existing App Router users. Therefore, we've decided to release Next.js 15 as stable now, so your projects are fully prepared for React 19 GA.</p> <p>To ensure the transition is as smooth as possible, we've provided <a href="#smooth-upgrades-with-codemod-cli">codemods and automated tools</a> to help ease the migration process.</p> <p>Read the <a href="/docs/app/building-your-application/upgrading/version-15">Next.js 15 upgrade guide</a>, the <a href="https://react.dev/blog/2024/04/25/react-19-upgrade-guide" rel="noopener noreferrer nofollow" target="_blank">React 19 upgrade guide<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, and watch the <a href="https://www.youtube.com/live/T8TZQ6k4SLE?t=1788" rel="noopener noreferrer nofollow" target="_blank">React Conf Keynote<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a> to learn more.</p> <h3 id="pages-router-on-react-18" data-docs-heading=""><a href="#pages-router-on-react-18">Pages Router on React 18<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h3> <p>Next.js 15 maintains backward compatibility for the Pages Router with React 18, allowing users to continue using React 18 while benefiting from improvements in Next.js 15.</p> <p>Since the first Release Candidate (RC1), we've shifted our focus to include support for React 18 based on community feedback. This flexibility enables you to adopt Next.js 15 while using the Pages Router with React 18, giving you greater control over your upgrade path.</p> <blockquote class="p-3 text-sm"> <p><strong>Note:</strong> While it is possible to run the Pages Router on React 18 and the App Router on React 19 in the same application, we don't recommend this setup. Doing so could result in unpredictable behavior and typings inconsistencies, as the underlying APIs and rendering logic between the two versions may not fully align.</p> </blockquote> <h3 id="react-compiler-experimental" data-docs-heading=""><a href="#react-compiler-experimental">React Compiler (Experimental)<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h3> <p>The <a href="https://react.dev/learn/react-compiler" rel="noopener noreferrer nofollow" target="_blank">React Compiler<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a> is a new experimental compiler created by the React team at Meta. The compiler understands your code at a deep level through its understanding of plain JavaScript semantics and the <a href="https://react.dev/reference/rules" rel="noopener noreferrer nofollow" target="_blank">Rules of React<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, which allows it to add automatic optimizations to your code. The compiler reduces the amount of manual memoization developers have to do through APIs such as <code>useMemo</code> and <code>useCallback</code> - making code simpler, easier to maintain, and less error prone.</p> <p>With Next.js 15, we've added support for the <a href="https://react.dev/learn/react-compiler" rel="noopener noreferrer nofollow" target="_blank">React Compiler<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>. Learn more about the React Compiler, and the <a href="https://react.dev/learn/react-compiler#usage-with-nextjs" rel="noopener noreferrer nofollow" target="_blank">available Next.js config options<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>.</p> <blockquote class="p-3 text-sm"> <p><strong>Note:</strong> The React Compiler is currently only available as a Babel plugin, which will result in slower development and build times.</p> </blockquote> <h3 id="hydration-error-improvements" data-docs-heading=""><a href="#hydration-error-improvements">Hydration error improvements<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h3> <p>Next.js 14.1 <a href="/blog/next-14-1#improved-error-messages-and-fast-refresh">made improvements</a> to error messages and hydration errors. Next.js 15 continues to build on those by adding an improved hydration error view. Hydration errors now display the source code of the error with suggestions on how to address the issue.</p> <p>For example, this was a previous hydration error message in Next.js 14.1:</p> <figure><img alt="Hydration error message in Next.js 14.1" loading="lazy" width="962" height="517" decoding="async" data-nimg="1" class="block rounded-md border border-gray-200 bg-gray-100 dark:hidden" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-before-light.png&w=1080&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-before-light.png&w=2048&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x" src="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-before-light.png&w=2048&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/><img alt="Hydration error message in Next.js 14.1" loading="lazy" width="962" height="517" decoding="async" data-nimg="1" class="hidden rounded-md border border-gray-200 bg-gray-100 dark:block" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-before-dark.png&w=1080&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-before-dark.png&w=2048&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x" src="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-before-dark.png&w=2048&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/></figure> <p>Next.js 15 has improved this to:</p> <figure><img alt="Hydration error message improved in Next.js 15" loading="lazy" width="960" height="654" decoding="async" data-nimg="1" class="block rounded-md border border-gray-200 bg-gray-100 dark:hidden" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-after-light.png&w=1080&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-after-light.png&w=1920&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x" src="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-after-light.png&w=1920&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/><img alt="Hydration error message improved in Next.js 15" loading="lazy" width="960" height="654" decoding="async" data-nimg="1" class="hidden rounded-md border border-gray-200 bg-gray-100 dark:block" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-after-dark.png&w=1080&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-after-dark.png&w=1920&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x" src="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc%2Fhydration-error-after-dark.png&w=1920&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/></figure> <h2 id="turbopack-dev" data-docs-heading=""><a href="#turbopack-dev">Turbopack Dev<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>We are happy to announce that <code>next dev --turbo</code> is now <strong>stable and ready</strong> to speed up your development experience. We've been using it to iterate on <a href="https://vercel.com" rel="noopener noreferrer" target="_blank">vercel.com<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://nextjs.org" rel="noopener noreferrer" target="_blank">nextjs.org<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://v0.dev" rel="noopener noreferrer nofollow" target="_blank">v0<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, and all of our other applications with great results.</p> <p>For example, with <code>vercel.com</code>, a large Next.js app, we've seen:</p> <ul> <li>Up to <strong>76.7% faster</strong> local server startup.</li> <li>Up to <strong>96.3% faster</strong> code updates with Fast Refresh.</li> <li>Up to <strong>45.8% faster</strong> initial route compile without caching (Turbopack does not have disk caching yet).</li> </ul> <p>You can learn more about Turbopack Dev in our new <a href="/blog/turbopack-for-development-stable">blog post</a>.</p> <h2 id="static-route-indicator" data-docs-heading=""><a href="#static-route-indicator">Static Route Indicator<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>Next.js now displays a Static Route Indicator during development to help you identify which routes are static or dynamic. This visual cue makes it easier to optimize performance by understanding how your pages are rendered.</p> <figure><img alt="" loading="lazy" width="1720" height="516" decoding="async" data-nimg="1" class="block rounded-md border border-gray-200 bg-gray-100 dark:hidden" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc2%2Fstatic-route-light.png&w=1920&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc2%2Fstatic-route-light.png&w=3840&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x" src="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc2%2Fstatic-route-light.png&w=3840&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/><img alt="" loading="lazy" width="1720" height="516" decoding="async" data-nimg="1" class="hidden rounded-md border border-gray-200 bg-gray-100 dark:block" style="color:transparent" srcSet="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc2%2Fstatic-route-dark.png&w=1920&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 1x, /_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc2%2Fstatic-route-dark.png&w=3840&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z 2x" src="/_next/image?url=%2Fstatic%2Fblog%2Fnext-15-rc2%2Fstatic-route-dark.png&w=3840&q=75&dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z"/></figure> <p>You can also use the <a href="/docs/app/api-reference/cli/next#next-build-options">next build</a> output to view the rendering strategy for all routes.</p> <p>This update is part of our ongoing efforts to enhance observability in Next.js, making it easier for developers to monitor, debug, and optimize their applications. We're also working on dedicated developer tools, with more details to come soon.</p> <p>Learn more about the <a href="/docs/app/api-reference/next-config-js/devIndicators#appisrstatus-static-indicator">Static Route Indicator</a>, which can be disabled.</p> <h2 id="executing-code-after-a-response-with-unstable_after-experimental" data-docs-heading=""><a href="#executing-code-after-a-response-with-unstable_after-experimental">Executing code after a response with <code>unstable_after</code> (Experimental)<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>When processing a user request, the server typically performs tasks directly related to computing the response. However, you may need to perform tasks such as logging, analytics, and other external system synchronization.</p> <p>Since these tasks are not directly related to the response, the user should not have to wait for them to complete. Deferring the work after responding to the user poses a challenge because serverless functions stop computation immediately after the response is closed.</p> <p><code>after()</code> is a new experimental API that solves this problem by allowing you to schedule work to be processed after the response has finished streaming, enabling secondary tasks to run without blocking the primary response.</p> <p>To use it, add <code>experimental.after</code> to <code>next.config.js</code>:</p> <div class="code-block_wrapper__t6FCO code-block_hasFileName__ezlBD not-prose" data-geist-code-block=""><div class="code-block_header__t3NRd"><div class="code-block_fileName__HmSv1"><div aria-hidden="true" class="code-block_iconWrapper__TuHFk"><svg fill="none" height="14" viewBox="0 0 512 512" width="14" xmlns="http://www.w3.org/2000/svg"><rect fill="currentColor" height="512" rx="50" width="512"></rect><rect fill="currentColor" height="512" rx="50" width="512"></rect><path clip-rule="evenodd" d="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" fill="var(--ds-background-100)" fill-rule="evenodd"></path></svg></div><span class="code-block_filenameP__02nok">next.config.ts</span></div><div class="code-block_actions__yphRf"><button aria-label="Copy code" class="code-block_copyButton__uo5Yu" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button></div></div><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">nextConfig</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> experimental</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> after</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-token-punctuation)">,</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> }</span><span style="color:var(--shiki-token-punctuation)">,</span></span> <span class="line"><span style="color:var(--shiki-color-text)">};</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">default</span><span style="color:var(--shiki-color-text)"> nextConfig;</span></span></code></pre></div> <p>Then, import the function in Server Components, Server Actions, Route Handlers, or Middleware.</p> <div class="code-block_wrapper__t6FCO not-prose" data-geist-code-block=""><button aria-label="Copy code" class="code-block_copyButton__uo5Yu code-block_copyFloatingButton__PsMvB" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-color-text)"> { unstable_after </span><span style="color:var(--shiki-token-keyword)">as</span><span style="color:var(--shiki-color-text)"> after } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string-expression)">'next/server'</span><span style="color:var(--shiki-color-text)">;</span></span> <span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-color-text)"> { log } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string-expression)">'@/app/utils'</span><span style="color:var(--shiki-color-text)">;</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">default</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">Layout</span><span style="color:var(--shiki-color-text)">({ children }) {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// Secondary task</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">after</span><span style="color:var(--shiki-color-text)">(() </span><span style="color:var(--shiki-token-keyword)">=></span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">log</span><span style="color:var(--shiki-color-text)">();</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> });</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// Primary task</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-color-text)"> <>{children}</>;</span></span> <span class="line"><span style="color:var(--shiki-color-text)">}</span></span></code></pre></div> <p>Learn more about <a href="/docs/app/api-reference/functions/unstable_after"><code>unstable_after</code></a>.</p> <h2 id="instrumentationjs-stable" data-docs-heading=""><a href="#instrumentationjs-stable"><code>instrumentation.js</code> (Stable)<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>The <code>instrumentation</code> file, with the <code>register()</code> API, allows users to tap into the Next.js server lifecycle to monitor performance, track the source of errors, and deeply integrate with observability libraries like <a href="https://opentelemetry.io/" rel="noopener noreferrer nofollow" target="_blank">OpenTelemetry<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>.</p> <p>This feature is now <strong>stable</strong> and the <code>experimental.instrumentationHook</code> config option can be removed.</p> <p>In addition, we've collaborated with <a href="https://sentry.io/" rel="noopener noreferrer nofollow" target="_blank">Sentry<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a> on designing a new <code>onRequestError</code> hook that can be used to:</p> <ul> <li>Capture important context about all errors thrown on the server, including:<!-- --> <ul> <li>Router: Pages Router or App Router</li> <li>Server context: Server Component, Server Action, Route Handler, or Middleware</li> </ul> </li> <li>Report the errors to your favorite observability provider.</li> </ul> <div class="code-block_wrapper__t6FCO not-prose" data-geist-code-block=""><button aria-label="Copy code" class="code-block_copyButton__uo5Yu code-block_copyFloatingButton__PsMvB" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">async</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">onRequestError</span><span style="color:var(--shiki-color-text)">(err</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-color-text)"> request</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-color-text)"> context) {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">await</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">fetch</span><span style="color:var(--shiki-color-text)">(</span><span style="color:var(--shiki-token-string-expression)">'https://...'</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> method</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string-expression)">'POST'</span><span style="color:var(--shiki-token-punctuation)">,</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> body</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">JSON</span><span style="color:var(--shiki-token-function)">.stringify</span><span style="color:var(--shiki-color-text)">({ message</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">err</span><span style="color:var(--shiki-color-text)">.message</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-color-text)"> request</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-color-text)"> context })</span><span style="color:var(--shiki-token-punctuation)">,</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> headers</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> { </span><span style="color:var(--shiki-token-string-expression)">'Content-Type'</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string-expression)">'application/json'</span><span style="color:var(--shiki-color-text)"> }</span><span style="color:var(--shiki-token-punctuation)">,</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> });</span></span> <span class="line"><span style="color:var(--shiki-color-text)">}</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">async</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">register</span><span style="color:var(--shiki-color-text)">() {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// init your favorite observability provider SDK</span></span> <span class="line"><span style="color:var(--shiki-color-text)">}</span></span></code></pre></div> <p>Learn more about the <code>onRequestError</code> <a href="/docs/app/api-reference/file-conventions/instrumentation#onrequesterror-optional">function</a>.</p> <h2 id="form-component" data-docs-heading=""><a href="#form-component"><code><Form></code> Component<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>The new <code><Form></code> component extends the HTML <code><form></code> element with <a href="/docs/app/building-your-application/routing/linking-and-navigating#2-prefetching">prefetching</a>, <a href="/docs/app/building-your-application/routing/linking-and-navigating#5-soft-navigation">client-side navigation</a>, and progressive enhancement.</p> <p>It is useful for forms that navigate to a new page, such as a search form that leads to a results page.</p> <div class="code-block_wrapper__t6FCO code-block_hasFileName__ezlBD not-prose" data-geist-code-block=""><div class="code-block_header__t3NRd"><div class="code-block_fileName__HmSv1"><div aria-hidden="true" class="code-block_iconWrapper__TuHFk"><svg height="16" style="shape-rendering:auto" viewBox="-11.5 -10.23174 23 20.46348" width="16"><circle cx="0" cy="0" fill="currentColor" r="2.05"></circle><g fill="none" stroke="currentColor" stroke-width="1"><ellipse rx="11" ry="4.2"></ellipse><ellipse rx="11" ry="4.2" transform="rotate(60)"></ellipse><ellipse rx="11" ry="4.2" transform="rotate(120)"></ellipse></g></svg></div><span class="code-block_filenameP__02nok">app/page.jsx</span></div><div class="code-block_actions__yphRf"><button aria-label="Copy code" class="code-block_copyButton__uo5Yu" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button></div></div><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-color-text)"> Form </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string-expression)">'next/form'</span><span style="color:var(--shiki-color-text)">;</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">default</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">Page</span><span style="color:var(--shiki-color-text)">() {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-color-text)"> (</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> <</span><span style="color:var(--shiki-token-constant)">Form</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">action</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">"/search"</span><span style="color:var(--shiki-color-text)">></span></span> <span class="line"><span style="color:var(--shiki-color-text)"> <</span><span style="color:var(--shiki-token-string-expression)">input</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">name</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">"query"</span><span style="color:var(--shiki-color-text)"> /></span></span> <span class="line"><span style="color:var(--shiki-color-text)"> <</span><span style="color:var(--shiki-token-string-expression)">button</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">type</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">"submit"</span><span style="color:var(--shiki-color-text)">>Submit</</span><span style="color:var(--shiki-token-string-expression)">button</span><span style="color:var(--shiki-color-text)">></span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </</span><span style="color:var(--shiki-token-constant)">Form</span><span style="color:var(--shiki-color-text)">></span></span> <span class="line"><span style="color:var(--shiki-color-text)"> );</span></span> <span class="line"><span style="color:var(--shiki-color-text)">}</span></span></code></pre></div> <p>The <code><Form></code> component comes with:</p> <ul> <li><strong>Prefetching</strong>: When the form is in view, the <a href="/docs/app/api-reference/file-conventions/layout">layout</a> and <a href="/docs/app/api-reference/file-conventions/loading">loading</a> UI are prefetched, making navigation fast.</li> <li><strong>Client-side Navigation:</strong> On submission, shared layouts and client-side state are preserved.</li> <li><strong>Progressive Enhancement</strong>: If JavaScript hasn't loaded yet, the form still works via full-page navigation.</li> </ul> <p>Previously, achieving these features required a lot of manual boilerplate. For example:</p> <details><summary>Example</summary><div class="code-block_wrapper__t6FCO not-prose" data-geist-code-block=""><button aria-label="Copy code" class="code-block_copyButton__uo5Yu code-block_copyFloatingButton__PsMvB" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-comment)">// Note: This is abbreviated for demonstration purposes.</span></span> <span class="line"><span style="color:var(--shiki-token-comment)">// Not recommended for use in production code.</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-string-expression)">'use client'</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-color-text)"> { useEffect } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string-expression)">'react'</span></span> <span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-color-text)"> { useRouter } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string-expression)">'next/navigation'</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">default</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">Form</span><span style="color:var(--shiki-color-text)">(props) {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">action</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">props</span><span style="color:var(--shiki-color-text)">.action</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">router</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">useRouter</span><span style="color:var(--shiki-color-text)">()</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">useEffect</span><span style="color:var(--shiki-color-text)">(() </span><span style="color:var(--shiki-token-keyword)">=></span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// if form target is a URL, prefetch it</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">if</span><span style="color:var(--shiki-color-text)"> (</span><span style="color:var(--shiki-token-keyword)">typeof</span><span style="color:var(--shiki-color-text)"> action </span><span style="color:var(--shiki-token-keyword)">===</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string-expression)">'string'</span><span style="color:var(--shiki-color-text)">) {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">router</span><span style="color:var(--shiki-token-function)">.prefetch</span><span style="color:var(--shiki-color-text)">(action)</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> }</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> }</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-color-text)"> [action</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-color-text)"> router])</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">onSubmit</span><span style="color:var(--shiki-color-text)">(event) {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">event</span><span style="color:var(--shiki-token-function)">.preventDefault</span><span style="color:var(--shiki-color-text)">()</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// grab all of the form fields and trigger a `router.push` with the data URL encoded</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">formData</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">FormData</span><span style="color:var(--shiki-color-text)">(</span><span style="color:var(--shiki-token-constant)">event</span><span style="color:var(--shiki-color-text)">.currentTarget)</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">data</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">URLSearchParams</span><span style="color:var(--shiki-color-text)">()</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-color-text)"> (</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> [</span><span style="color:var(--shiki-token-constant)">name</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">value</span><span style="color:var(--shiki-color-text)">] </span><span style="color:var(--shiki-token-keyword)">of</span><span style="color:var(--shiki-color-text)"> formData) {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">data</span><span style="color:var(--shiki-token-function)">.append</span><span style="color:var(--shiki-color-text)">(name</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-color-text)"> value </span><span style="color:var(--shiki-token-keyword)">as</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">string</span><span style="color:var(--shiki-color-text)">)</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> }</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">router</span><span style="color:var(--shiki-token-function)">.push</span><span style="color:var(--shiki-color-text)">(</span><span style="color:var(--shiki-token-string-expression)">`</span><span style="color:var(--shiki-token-keyword)">${</span><span style="color:var(--shiki-color-text)">action</span><span style="color:var(--shiki-token-keyword)">}</span><span style="color:var(--shiki-token-string-expression)">?</span><span style="color:var(--shiki-token-keyword)">${</span><span style="color:var(--shiki-token-constant)">data</span><span style="color:var(--shiki-token-function)">.toString</span><span style="color:var(--shiki-color-text)">()</span><span style="color:var(--shiki-token-keyword)">}</span><span style="color:var(--shiki-token-string-expression)">`</span><span style="color:var(--shiki-color-text)">)</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> }</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">if</span><span style="color:var(--shiki-color-text)"> (</span><span style="color:var(--shiki-token-keyword)">typeof</span><span style="color:var(--shiki-color-text)"> action </span><span style="color:var(--shiki-token-keyword)">===</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string-expression)">'string'</span><span style="color:var(--shiki-color-text)">) {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-color-text)"> <</span><span style="color:var(--shiki-token-string-expression)">form</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">onSubmit</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)">{onSubmit} {</span><span style="color:var(--shiki-token-keyword)">...</span><span style="color:var(--shiki-color-text)">props} /></span></span> <span class="line"><span style="color:var(--shiki-color-text)"> }</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-color-text)"> <</span><span style="color:var(--shiki-token-string-expression)">form</span><span style="color:var(--shiki-color-text)"> {</span><span style="color:var(--shiki-token-keyword)">...</span><span style="color:var(--shiki-color-text)">props} /></span></span> <span class="line"><span style="color:var(--shiki-color-text)">}</span></span></code></pre></div></details> <p>Learn more about the <a href="/docs/app/api-reference/components/form"><code><Form></code> Component</a>.</p> <h2 id="support-for-nextconfigts" data-docs-heading=""><a href="#support-for-nextconfigts">Support for <code>next.config.ts</code><span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>Next.js now supports the TypeScript <code>next.config.ts</code> file type and provides a <code>NextConfig</code> type for autocomplete and type-safe options:</p> <div class="code-block_wrapper__t6FCO code-block_hasFileName__ezlBD not-prose" data-geist-code-block=""><div class="code-block_header__t3NRd"><div class="code-block_fileName__HmSv1"><div aria-hidden="true" class="code-block_iconWrapper__TuHFk"><svg fill="none" height="14" viewBox="0 0 512 512" width="14" xmlns="http://www.w3.org/2000/svg"><rect fill="currentColor" height="512" rx="50" width="512"></rect><rect fill="currentColor" height="512" rx="50" width="512"></rect><path clip-rule="evenodd" d="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" fill="var(--ds-background-100)" fill-rule="evenodd"></path></svg></div><span class="code-block_filenameP__02nok">next.config.ts</span></div><div class="code-block_actions__yphRf"><button aria-label="Copy code" class="code-block_copyButton__uo5Yu" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button></div></div><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">type</span><span style="color:var(--shiki-color-text)"> { NextConfig } </span><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-string-expression)">'next'</span><span style="color:var(--shiki-color-text)">;</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">nextConfig</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">NextConfig</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">/* config options here */</span></span> <span class="line"><span style="color:var(--shiki-color-text)">};</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">default</span><span style="color:var(--shiki-color-text)"> nextConfig;</span></span></code></pre></div> <p>Learn more about <a href="/docs/app/building-your-application/configuring/typescript#type-checking-nextconfigts">TypeScript support</a> in Next.js.</p> <h2 id="improvements-for-self-hosting" data-docs-heading=""><a href="#improvements-for-self-hosting">Improvements for self-hosting<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>When self-hosting applications, you may need more control over <code>Cache-Control</code> directives.</p> <p>One common case is controlling the <code>stale-while-revalidate</code> period sent for ISR pages. We've implemented two improvements:</p> <ol> <li>You can now configure the <a href="/docs/app/api-reference/next-config-js/expireTime"><code>expireTime</code></a> value in <code>next.config</code>. This was previously the <code>experimental.swrDelta</code> option.</li> <li>Updated the default value to one year, ensuring most CDNs can fully apply the <code>stale-while-revalidate</code> semantics as intended.</li> </ol> <p>We also no longer override custom <code>Cache-Control</code> values with our default values, allowing full control and ensuring compatibility with any CDN setup.</p> <p>Finally, we've improved image optimization when self-hosting. Previously, we recommended you install <code>sharp</code> for optimizing images on your Next.js server. This recommendation was sometimes missed. With Next.js 15, you no longer need to manually install <code>sharp</code> — Next.js will use <code>sharp</code> automatically when using <code>next start</code> or running with <a href="/docs/app/api-reference/next-config-js/output">standalone output mode</a>.</p> <p>To learn more, see our new <a href="https://x.com/leeerob/status/1843796169173995544" rel="noopener noreferrer nofollow" target="_blank">demo and tutorial video<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a> on self-hosting Next.js.</p> <h2 id="enhanced-security-for-server-actions" data-docs-heading=""><a href="#enhanced-security-for-server-actions">Enhanced Security for Server Actions<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p><a href="https://react.dev/reference/rsc/server-actions" rel="noopener noreferrer nofollow" target="_blank">Server Actions<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a> are server-side functions that can be called from the client. They are defined by adding the <code>'use server'</code> directive at the top of a file and exporting an async function.</p> <p>Even if a Server Action or utility function is not imported elsewhere in your code, it's still a publicly accessible HTTP endpoint. While this behavior is technically correct, it can lead to unintentional exposure of such functions.</p> <p>To improve security, we've introduced the following enhancements:</p> <ul> <li><strong>Dead code elimination:</strong> Unused Server Actions won't have their IDs exposed to the client-side JavaScript bundle, reducing bundle size and improving performance.</li> <li><strong>Secure action IDs:</strong> Next.js now creates unguessable, non-deterministic IDs to allow the client to reference and call the Server Action. These IDs are periodically recalculated between builds for enhanced security.</li> </ul> <div class="code-block_wrapper__t6FCO not-prose" data-geist-code-block=""><button aria-label="Copy code" class="code-block_copyButton__uo5Yu code-block_copyFloatingButton__PsMvB" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-comment)">// app/actions.js</span></span> <span class="line"><span style="color:var(--shiki-token-string-expression)">'use server'</span><span style="color:var(--shiki-color-text)">;</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-comment)">// This action **is** used in our application, so Next.js</span></span> <span class="line"><span style="color:var(--shiki-token-comment)">// will create a secure ID to allow the client to reference</span></span> <span class="line"><span style="color:var(--shiki-token-comment)">// and call the Server Action.</span></span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">async</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">updateUserAction</span><span style="color:var(--shiki-color-text)">(formData) {}</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-comment)">// This action **is not** used in our application, so Next.js</span></span> <span class="line"><span style="color:var(--shiki-token-comment)">// will automatically remove this code during `next build`</span></span> <span class="line"><span style="color:var(--shiki-token-comment)">// and will not create a public endpoint.</span></span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">async</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-function)">deleteUserAction</span><span style="color:var(--shiki-color-text)">(formData) {}</span></span></code></pre></div> <p>You should still treat Server Actions as public HTTP endpoints. Learn more about <a href="/blog/security-nextjs-server-components-actions#write">securing Server Actions</a>.</p> <h2 id="optimizing-bundling-of-external-packages-stable" data-docs-heading=""><a href="#optimizing-bundling-of-external-packages-stable">Optimizing bundling of external packages (Stable)<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>Bundling external packages can improve the cold start performance of your application. In the <strong>App Router</strong>, external packages are bundled by default, and you can opt-out specific packages using the new <a href="/docs/app/api-reference/next-config-js/serverExternalPackages"><code>serverExternalPackages</code></a> config option.</p> <p>In the <strong>Pages Router</strong>, external packages are not bundled by default, but you can provide a list of packages to bundle using the existing <a href="/docs/pages/api-reference/next-config-js/transpilePackages"><code>transpilePackages</code></a> option. With this configuration option, you need to specify each package.</p> <p>To unify configuration between App and Pages Router, we're introducing a new option, <a href="/docs/pages/api-reference/next-config-js/bundlePagesRouterDependencies"><code>bundlePagesRouterDependencies</code></a> to match the default automatic bundling of the App Router. You can then use <a href="/docs/app/api-reference/next-config-js/serverExternalPackages"><code>serverExternalPackages</code></a> to opt-out specific packages, if needed.</p> <div class="code-block_wrapper__t6FCO code-block_hasFileName__ezlBD not-prose" data-geist-code-block=""><div class="code-block_header__t3NRd"><div class="code-block_fileName__HmSv1"><div aria-hidden="true" class="code-block_iconWrapper__TuHFk"><svg fill="none" height="14" viewBox="0 0 512 512" width="14" xmlns="http://www.w3.org/2000/svg"><rect fill="currentColor" height="512" rx="50" width="512"></rect><rect fill="currentColor" height="512" rx="50" width="512"></rect><path clip-rule="evenodd" d="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" fill="var(--ds-background-100)" fill-rule="evenodd"></path></svg></div><span class="code-block_filenameP__02nok">next.config.ts</span></div><div class="code-block_actions__yphRf"><button aria-label="Copy code" class="code-block_copyButton__uo5Yu" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button></div></div><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">nextConfig</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// Automatically bundle external packages in the Pages Router:</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> bundlePagesRouterDependencies</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-token-punctuation)">,</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// Opt specific packages out of bundling for both App and Pages Router:</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> serverExternalPackages</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> [</span><span style="color:var(--shiki-token-string-expression)">'package-name'</span><span style="color:var(--shiki-color-text)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span> <span class="line"><span style="color:var(--shiki-color-text)">};</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">default</span><span style="color:var(--shiki-color-text)"> nextConfig;</span></span></code></pre></div> <p>Learn more about <a href="/docs/app/building-your-application/optimizing/package-bundling">optimizing external packages</a>.</p> <h2 id="eslint-9-support" data-docs-heading=""><a href="#eslint-9-support">ESLint 9 Support<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>Next.js 15 also introduces support for <a href="https://eslint.org/blog/2024/04/eslint-v9.0.0-released" rel="noopener noreferrer nofollow" target="_blank">ESLint 9<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, following the end-of-life for ESLint 8 on October 5, 2024.</p> <p>To ensure a smooth transition, Next.js remain backwards compatible, meaning you can continue using either ESLint 8 or 9.</p> <p>If you upgrade to ESLint 9, and we detect that you haven't yet adopted <a href="https://eslint.org/blog/2024/04/eslint-v9.0.0-released/#flat-config-is-now-the-default-and-has-some-changes" rel="noopener noreferrer nofollow" target="_blank">the new config format<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, Next.js will automatically apply the <code>ESLINT_USE_FLAT_CONFIG=false</code> escape hatch to ease migration.</p> <p>Additionally, deprecated options like <code>—ext</code> and <code>—ignore-path</code> will be removed when running <code>next lint</code>. Please note that ESLint will eventually disallow these older configurations in ESLint 10, so we recommend starting your migration soon.</p> <p>For more details on these changes, check out the <a href="https://eslint.org/docs/latest/use/migrate-to-9.0.0" rel="noopener noreferrer nofollow" target="_blank">migration guide<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>.</p> <p>As part of this update, we've also upgraded <code>eslint-plugin-react-hooks</code> to <code>v5.0.0</code>, which introduces new rules for React Hooks usage. You can review all changes in the <a href="https://github.com/facebook/react/releases/tag/eslint-plugin-react-hooks%405.0.0" rel="noopener noreferrer nofollow" target="_blank">changelog for eslint-plugin-react-hooks@5.0.0<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>.</p> <h2 id="development-and-build-improvements" data-docs-heading=""><a href="#development-and-build-improvements">Development and Build Improvements<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <h3 id="server-components-hmr" data-docs-heading=""><a href="#server-components-hmr">Server Components HMR<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h3> <p>During development, Server components are re-executed when saved. This means, any <code>fetch</code> requests to your API endpoints or third-party services are also called.</p> <p>To improve local development performance and reduce potential costs for billed API calls, we now ensure Hot Module Replacement (HMR) can re-use <code>fetch</code> responses from previous renders.</p> <p>Learn more about the <a href="/docs/app/api-reference/next-config-js/serverComponentsHmrCache">Server Components HMR Cache</a>.</p> <h3 id="faster-static-generation-for-the-app-router" data-docs-heading=""><a href="#faster-static-generation-for-the-app-router">Faster Static Generation for the App Router<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h3> <p>We've optimized static generation to improve build times, especially for pages with slow network requests.</p> <p>Previously, our static optimization process rendered pages twice—once to generate data for client-side navigation and a second time to render the HTML for the initial page visit. Now, we reuse the first render, cutting out the second pass, reducing workload and build times.</p> <p>Additionally, static generation workers now share the <code>fetch</code> cache across pages. If a <code>fetch</code> call doesn't opt out of caching, its results are reused by other pages handled by the same worker. This reduces the number of requests for the same data.</p> <h3 id="advanced-static-generation-control-experimental" data-docs-heading=""><a href="#advanced-static-generation-control-experimental">Advanced Static Generation Control (Experimental)<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h3> <p>We've added experimental support for more control over the static generation process for advanced use cases that would benefit from greater control.</p> <p>We recommend sticking to the current defaults unless you have specific requirements as these options can lead to increased resource usage and potential out-of-memory errors due to increased concurrency.</p> <div class="code-block_wrapper__t6FCO code-block_hasFileName__ezlBD not-prose" data-geist-code-block=""><div class="code-block_header__t3NRd"><div class="code-block_fileName__HmSv1"><div aria-hidden="true" class="code-block_iconWrapper__TuHFk"><svg fill="none" height="14" viewBox="0 0 512 512" width="14" xmlns="http://www.w3.org/2000/svg"><rect fill="currentColor" height="512" rx="50" width="512"></rect><rect fill="currentColor" height="512" rx="50" width="512"></rect><path clip-rule="evenodd" d="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" fill="var(--ds-background-100)" fill-rule="evenodd"></path></svg></div><span class="code-block_filenameP__02nok">next.config.ts</span></div><div class="code-block_actions__yphRf"><button aria-label="Copy code" class="code-block_copyButton__uo5Yu" type="button"><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M2.75 0.5C1.7835 0.5 1 1.2835 1 2.25V9.75C1 10.7165 1.7835 11.5 2.75 11.5H3.75H4.5V10H3.75H2.75C2.61193 10 2.5 9.88807 2.5 9.75V2.25C2.5 2.11193 2.61193 2 2.75 2H8.25C8.38807 2 8.5 2.11193 8.5 2.25V3H10V2.25C10 1.2835 9.2165 0.5 8.25 0.5H2.75ZM7.75 4.5C6.7835 4.5 6 5.2835 6 6.25V13.75C6 14.7165 6.7835 15.5 7.75 15.5H13.25C14.2165 15.5 15 14.7165 15 13.75V6.25C15 5.2835 14.2165 4.5 13.25 4.5H7.75ZM7.5 6.25C7.5 6.11193 7.61193 6 7.75 6H13.25C13.3881 6 13.5 6.11193 13.5 6.25V13.75C13.5 13.8881 13.3881 14 13.25 14H7.75C7.61193 14 7.5 13.8881 7.5 13.75V6.25Z" fill="currentColor"/></svg><svg data-testid="geist-icon" height="16" stroke-linejoin="round" style="color:currentColor" viewBox="0 0 16 16" width="16" aria-hidden="true"><path fill-rule="evenodd" clip-rule="evenodd" d="M15.5607 3.99999L15.0303 4.53032L6.23744 13.3232C5.55403 14.0066 4.44599 14.0066 3.76257 13.3232L4.2929 12.7929L3.76257 13.3232L0.969676 10.5303L0.439346 9.99999L1.50001 8.93933L2.03034 9.46966L4.82323 12.2626C4.92086 12.3602 5.07915 12.3602 5.17678 12.2626L13.9697 3.46966L14.5 2.93933L15.5607 3.99999Z" fill="currentColor"/></svg></button></div></div><pre class="code-block_pre___OLfy"><code class="code-block_code__isn_V"><span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">nextConfig</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> experimental</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> {</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// how many times Next.js will retry failed page generation attempts</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// before failing the build</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> staticGenerationRetryCount</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-constant)">1</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// how many pages will be processed per worker</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> staticGenerationMaxConcurrency: </span><span style="color:var(--shiki-token-constant)">8</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-comment)">// the minimum number of pages before spinning up a new export worker</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> staticGenerationMinPagesPerWorker: </span><span style="color:var(--shiki-token-constant)">25</span></span> <span class="line"><span style="color:var(--shiki-color-text)"> }</span><span style="color:var(--shiki-token-punctuation)">,</span></span> <span class="line"><span style="color:var(--shiki-color-text)">}</span></span> <span class="line"> </span> <span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-color-text)"> </span><span style="color:var(--shiki-token-keyword)">default</span><span style="color:var(--shiki-color-text)"> nextConfig;</span></span></code></pre></div> <p>Learn more about the <a href="/docs/app/api-reference/next-config-js/staticGeneration">Static Generation options</a>.</p> <h2 id="other-changes" data-docs-heading=""><a href="#other-changes">Other Changes<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <ul> <li><strong>[Breaking]</strong> next/image: Removed <code>squoosh</code> in favor of <code>sharp</code> as an optional dependency (<a href="https://github.com/vercel/next.js/pull/63321" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> next/image: Changed default <code>Content-Disposition</code> to <code>attachment</code> (<a href="https://github.com/vercel/next.js/pull/65631" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> next/image: Error when <code>src</code> has leading or trailing spaces (<a href="https://github.com/vercel/next.js/pull/65637" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> Middleware: Apply <code>react-server</code> condition to limit unrecommended React API imports (<a href="https://github.com/vercel/next.js/pull/65424" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> next/font: Removed support for external <code>@next/font</code> package (<a href="https://github.com/vercel/next.js/pull/65601" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> next/font: Removed <code>font-family</code> hashing (<a href="https://github.com/vercel/next.js/pull/53608" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> Caching: <code>force-dynamic</code> will now set a <code>no-store</code> default to the fetch cache (<a href="https://github.com/vercel/next.js/pull/64145" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> Config: Enable <code>swcMinify</code> (<a href="https://github.com/vercel/next.js/pull/65579" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>), <code>missingSuspenseWithCSRBailout</code> (<a href="https://github.com/vercel/next.js/pull/65688" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>), and <code>outputFileTracing</code> (<a href="https://github.com/vercel/next.js/pull/65579" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>) behavior by default and remove deprecated options</li> <li><strong>[Breaking]</strong> Remove auto-instrumentation for Speed Insights (must now use the dedicated <a href="https://www.npmjs.com/package/@vercel/speed-insights" rel="noopener noreferrer nofollow" target="_blank">@vercel/speed-insights<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a> package) (<a href="https://github.com/vercel/next.js/pull/64199" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> Remove <code>.xml</code> extension for dynamic sitemap routes and align sitemap URLs between development and production (<a href="https://github.com/vercel/next.js/pull/65507" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> We've deprecated exporting <code>export const runtime = "experimental-edge"</code> in the App Router. Users should now switch to <code>export const runtime = "edge"</code>. We've added a <a href="/docs/app/building-your-application/upgrading/codemods#app-dir-runtime-config-experimental-edge">codemod</a> to perform this (<a href="https://github.com/vercel/next.js/pull/70480" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> Calling <code>revalidateTag</code> and <code>revalidatePath</code> during render will now throw an error (<a href="https://github.com/vercel/next.js/pull/71093" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> The <code>instrumentation.js</code> and <code>middleware.js</code> files will now use the vendored React packages (<a href="https://github.com/vercel/next.js/pull/69619" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> The minimum required Node.js version has been updated to 18.18.0 (<a href="https://github.com/vercel/next.js/pull/67274" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> <code>next/dynamic</code>: the deprecated <code>suspense</code> prop has been removed and when the component is used in the App Router, it won't insert an empty Suspense boundary anymore (<a href="https://github.com/vercel/next.js/pull/67014" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> When resolving modules on the Edge Runtime, the <code>worker</code> module condition will not be applied (<a href="https://github.com/vercel/next.js/pull/66808" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Breaking]</strong> Disallow using <code>ssr: false</code> option with <code>next/dynamic</code> in Server Components (<a href="https://github.com/vercel/next.js/pull/70378" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Metadata: Updated environment variable fallbacks for <code>metadataBase</code> when hosted on Vercel (<a href="https://github.com/vercel/next.js/pull/65089" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Fix tree-shaking with mixed namespace and named imports from <code>optimizePackageImports</code> (<a href="https://github.com/vercel/next.js/pull/64894" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Parallel Routes: Provide unmatched catch-all routes with all known params (<a href="https://github.com/vercel/next.js/pull/65063" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Config <code>bundlePagesExternals</code> is now stable and renamed to <code>bundlePagesRouterDependencies</code></li> <li><strong>[Improvement]</strong> Config <code>serverComponentsExternalPackages</code> is now stable and renamed to <code>serverExternalPackages</code></li> <li><strong>[Improvement]</strong> create-next-app: New projects ignore all <code>.env</code> files by default (<a href="https://github.com/vercel/next.js/pull/61920" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> The <code>outputFileTracingRoot</code>, <code>outputFileTracingIncludes</code> and <code>outputFileTracingExcludes</code> have been upgraded from experimental and are now stable (<a href="https://github.com/vercel/next.js/pull/68464" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Avoid merging global CSS files with CSS module files deeper in the tree (<a href="https://github.com/vercel/next.js/pull/67373" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> The cache handler can be specified via the <code>NEXT_CACHE_HANDLER_PATH</code> environment variable (<a href="https://github.com/vercel/next.js/pull/70537/" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> The Pages Router now supports both React 18 and React 19 (<a href="https://github.com/vercel/next.js/pull/69484" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> The Error Overlay now displays a button to copy the Node.js Inspector URL if the inspector is enabled (<a href="https://github.com/vercel/next.js/pull/69357" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Client prefetches on the App Router now use the <code>priority</code> attribute (<a href="https://github.com/vercel/next.js/pull/67356" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Next.js now provides an <code>unstable_rethrow</code> function to rethrow Next.js internal errors in the App Router (<a href="https://github.com/vercel/next.js/pull/65831" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> <code>unstable_after</code> can now be used in static pages (<a href="https://github.com/vercel/next.js/pull/71231" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> If a <code>next/dynamic</code> component is used during SSR, the chunk will be prefetched (<a href="https://github.com/vercel/next.js/pull/65486" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> The <code>esmExternals</code> option is now supported on the App Router (<a href="https://github.com/vercel/next.js/pull/65041" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> The <code>experimental.allowDevelopmentBuild</code> option can be used to allow <code>NODE_ENV=development</code> with <code>next build</code> for debugging purposes (<a href="https://github.com/vercel/next.js/pull/65463" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> The Server Action transforms are now disabled in the Pages Router (<a href="https://github.com/vercel/next.js/pull/71028" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Build workers will now stop the build from hanging when they exit (<a href="https://github.com/vercel/next.js/pull/70997" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> When redirecting from a Server Action, revalidations will now apply correctly (<a href="https://github.com/vercel/next.js/pull/70715" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Dynamic params are now handled correctly for parallel routes on the Edge Runtime (<a href="https://github.com/vercel/next.js/pull/70667" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Static pages will now respect staleTime after initial load (<a href="https://github.com/vercel/next.js/pull/70640" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> <code>vercel/og</code> updated with a memory leak fix (<a href="https://github.com/vercel/next.js/pull/70214" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Patch timings updated to allow usage of packages like <code>msw</code> for APIs mocking (<a href="https://github.com/vercel/next.js/pull/68193" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> <li><strong>[Improvement]</strong> Prerendered pages should use static staleTime (<a href="https://github.com/vercel/next.js/pull/67868" rel="noopener noreferrer" target="_blank">PR<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>)</li> </ul> <p>To learn more, check out the <a href="/docs/app/building-your-application/upgrading/version-15">upgrade guide</a>.</p> <h2 id="contributors" data-docs-heading=""><a href="#contributors">Contributors<span><svg viewBox="0 0 16 16" height="0.7em" width="0.7em"> <g stroke-width="1.2" fill="none" stroke="currentColor"> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698"></path> <path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698"></path> </g> </svg></span></a></h2> <p>Next.js is the result of the combined work of over 3,000 individual developers, industry partners like Google and Meta, and our core team at Vercel. This release was brought to you by:</p> <ul> <li>The <strong>Next.js</strong> team: <a href="https://github.com/acdlite" rel="noopener noreferrer nofollow" target="_blank">Andrew<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/unstubbable" rel="noopener noreferrer nofollow" target="_blank">Hendrik<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/lubieowoce" rel="noopener noreferrer nofollow" target="_blank">Janka<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/huozhi" rel="noopener noreferrer nofollow" target="_blank">Jiachi<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/feedthejim" rel="noopener noreferrer nofollow" target="_blank">Jimmy<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/devjiwonchoi" rel="noopener noreferrer nofollow" target="_blank">Jiwon<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/ijjk" rel="noopener noreferrer nofollow" target="_blank">JJ<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/gnoff" rel="noopener noreferrer nofollow" target="_blank">Josh<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/samcx" rel="noopener noreferrer nofollow" target="_blank">Sam<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/sebmarkbage" rel="noopener noreferrer nofollow" target="_blank">Sebastian<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/eps1lon" rel="noopener noreferrer nofollow" target="_blank">Sebbie<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/shuding" rel="noopener noreferrer nofollow" target="_blank">Shu<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/wyattjoh" rel="noopener noreferrer nofollow" target="_blank">Wyatt<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, and <a href="https://github.com/ztanner" rel="noopener noreferrer nofollow" target="_blank">Zack<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>.</li> <li>The <strong>Turbopack</strong> team: <a href="https://github.com/arlyon" rel="noopener noreferrer nofollow" target="_blank">Alex<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/bgw" rel="noopener noreferrer nofollow" target="_blank">Benjamin<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/kdy1" rel="noopener noreferrer nofollow" target="_blank">Donny<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/padmaia" rel="noopener noreferrer nofollow" target="_blank">Maia<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/mischnic" rel="noopener noreferrer nofollow" target="_blank">Niklas<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/timneutkens" rel="noopener noreferrer nofollow" target="_blank">Tim<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/sokra" rel="noopener noreferrer nofollow" target="_blank">Tobias<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, and <a href="https://github.com/wbinnssmith" rel="noopener noreferrer nofollow" target="_blank">Will<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>.</li> <li>The <strong>Next.js Docs</strong> team: <a href="https://github.com/delbaoliveira" rel="noopener noreferrer nofollow" target="_blank">Delba<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/molebox" rel="noopener noreferrer nofollow" target="_blank">Rich<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, <a href="https://github.com/ismaelrumzan" rel="noopener noreferrer nofollow" target="_blank">Ismael<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>, and <a href="https://github.com/leerob" rel="noopener noreferrer nofollow" target="_blank">Lee<span class="inline-flex"><svg class="with-icon_icon__MHUeb" data-testid="geist-icon" fill="none" height="24" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24" style="color:currentColor;width:14px;height:14px"><path d="M7 17L17 7"/><path d="M7 7h10v10"/></svg></span></a>.</li> </ul> <p>Huge thanks to @AbhiShake1, @Aerilym, @AhmedBaset, @AnaTofuZ, @Arindam200, @Arinji2, @ArnaudFavier, @ArnoldVanN, @Auxdible, @B33fb0n3, @Bhavya031, @Bjornnyborg, @BunsDev, @CannonLock, @CrutchTheClutch, @DeepakBalaraman, @DerTimonius, @Develliot, @EffectDoplera, @Ehren12, @Ethan-Arrowood, @FluxCapacitor2, @ForsakenHarmony, @Francoscopic, @Gomah, @GyoHeon, @Hemanshu-Upadhyay, @HristovCodes, @HughHzyb, @IAmKushagraSharma, @IDNK2203, @IGassmann, @ImDR, @IncognitoTGT, @Jaaneek, @JamBalaya56562, @Jeffrey-Zutt, @JohnGemstone, @JoshuaKGoldberg, @Julian-Louis, @Juneezee, @KagamiChan, @Kahitar, @KeisukeNagakawa, @KentoMoriwaki, @Kikobeats, @KonkenBonken, @Kuboczoch, @Lada496, @LichuAcu, @LorisSigrist, @Lsnsh, @Luk-z, @Luluno01, @M-YasirGhaffar, @Maaz-Ahmed007, @Manoj-M-S, @ManuLpz4, @Marukome0743, @MaxLeiter, @MehfoozurRehman, @MildTomato, @MonstraG, @N2D4, @NavidNourani, @Nayeem-XTREME, @Netail, @NilsJacobsen, @Ocheretovich, @OlyaPolya, @PapatMayuri, @PaulAsjes, @PlagueFPS, @ProchaLu, @Pyr33x, @QiuranHu, @RiskyMH, @Sam-Phillemon9493, @Sayakie, @Shruthireddy04, @SouthLink, @Strift, @SukkaW, @Teddir, @Tim-Zj, @TrevorSayre, @Unsleeping, @Willem-Jaap, @a89529294, @abdull-haseeb, @abhi12299, @acdlite, @actopas, @adcichowski, @adiguno, @agadzik, @ah100101, @akazwz, @aktoriukas, @aldosch, @alessiomaffeis, @allanchau, @alpedia0, @amannn, @amikofalvy, @anatoliik-lyft, @anay-208, @andrii-bodnar, @anku255, @ankur-dwivedi, @aralroca, @archanaagivale30, @arlyon, @atik-persei, @avdeev, @baeharam, @balazsorban44, @bangseongbeom, @begalinsaf, @bennettdams, @bewinsnw, @bgw, @blvdmitry, @bobaaaaa, @boris-szl, @bosconian-dynamics, @brekk, @brianshano, @cfrank, @chandanpasunoori, @chentsulin, @chogyejin, @chrisjstott, @christian-bromann, @codeSTACKr, @coderfin, @coltonehrman, @controversial, @coopbri, @creativoma, @crebelskydico, @crutchcorn, @darthmaim, @datner, @davidsa03, @delbaoliveira, @devjiwonchoi, @devnyxie, @dhruv-kaushik, @dineshh-m, @diogocapela, @dnhn, @domdomegg, @domin-mnd, @dvoytenko, @ebCrypto, @ekremkenter, @emmerich, @flybayer, @floriangosse, @forsakenharmony, @francoscopic, @frys, @gabrielrolfsen, @gaojude, @gdborton, @greatvivek11, @gnoff, @guisehn, @GyoHeon, @hamirmahal, @hiro0218, @hirotomoyamada, @housseindjirdeh, @hungdoansy, @huozhi, @hwangstar156, @iampoul, @ianmacartney, @icyJoseph, @ijjk, @imddc, @imranolas, @iscekic, @jantimon, @jaredhan418, @jeanmax1me, @jericopulvera, @jjm2317, @jlbovenzo, @joelhooks, @joeshub, @jonathan-ingram, @jonluca, @jontewks, @joostmeijles, @jophy-ye, @jordienr, @jordyfontoura, @kahlstrm, @karlhorky, @karlkeefer, @kartheesan05, @kdy1, @kenji-webdev, @kevva, @khawajaJunaid, @kidonng, @kiner-tang, @kippmr, @kjac, @kjugi, @kshehadeh, @kutsan, @kwonoj, @kxlow, @leerob, @lforst, @li-jia-nan, @liby, @lonr, @lorensr, @lovell, @lubieowoce, @luciancah, @luismiramirez, @lukahartwig, @lumirlumir, @luojiyin1987, @mamuso, @manovotny, @marlier, @mauroaccornero, @maxhaomh, @mayank1513, @mcnaveen, @md-rejoyan-islam, @mehmetozguldev, @mert-duzgun, @mirasayon, @mischnic, @mknichel, @mobeigi, @molebox, @mratlamwala, @mud-ali, @n-ii-ma, @n1ckoates, @nattui, @nauvalazhar, @neila-a, @neoFinch, @niketchandivade, @nisabmohd, @none23, @notomo, @notrab, @nsams, @nurullah, @okoyecharles, @omahs, @paarthmadan, @pathliving, @pavelglac, @penicillin0, @phryneas, @pkiv, @pnutmath, @qqww08, @r34son, @raeyoung-kim, @remcohaszing, @remorses, @rezamauliadi, @rishabhpoddar, @ronanru, @royalfig, @rubyisrust, @ryan-nauman, @ryohidaka, @ryota-murakami, @s-ekai, @saltcod, @samcx, @samijaber, @sean-rallycry, @sebmarkbage, @shubh73, @shuding, @sirTangale, @sleevezip, @slimbde, @soedirgo, @sokra, @sommeeeer, @sopranopillow, @souporserious, @srkirkland, @steadily-worked, @steveluscher, @stipsan, @styfle, @stylessh, @syi0808, @symant233, @tariknh, @theoludwig, @timfish, @timfuhrmann, @timneutkens, @tknickman, @todor0v, @tokkiyaa, @torresgol10, @tranvanhieu01012002, @txxxxc, @typeofweb, @unflxw, @unstubbable, @versecafe, @vicb, @vkryachko, @wbinnssmith, @webtinax, @weicheng95, @wesbos, @whatisagi, @wiesson, @woutvanderploeg, @wyattjoh, @xiaohanyu, @xixixao, @xugetsu, @yosefbeder, @ypessoa, @ytori, @yunsii, @yurivangeffen, @z0n, @zce, @zhawtof, @zsh77, and @ztanner for helping!</p></div></article></div></main><!--$--><div class="jsx-1021054789 footer_root__6F7g2"><div class="geist-wrapper"><footer class="footer_footer__mqdak"><div class="footer_grid__yp2LW"><div class="stack_stack__iZkUS stack" data-version="v1" style="--stack-flex:initial;--stack-direction:row;--stack-align:stretch;--stack-justify:space-between;--stack-padding:0px;--stack-gap:0px" data-logo="true"><a class="stack_stack__iZkUS stack" data-version="v1" style="--stack-flex:initial;--stack-direction:column;--stack-align:stretch;--stack-justify:flex-start;--stack-padding:0px;--stack-gap:0px" aria-label="Vercel logo" data-logo-link="" href="https://vercel.com/home?utm_source=next-site&utm_medium=footer&utm_campaign=next-website" rel="noopener noreferrer" target="_blank" title="Go to the Vercel website"><svg fill="none" height="20" viewBox="0 0 283 64"><path d="M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z" fill="var(--geist-foreground)"></path></svg></a><div class="stack_stack__iZkUS stack footer_socialsDesktop__XZ__G" data-version="v1" style="--stack-flex:initial;--stack-direction:row;--stack-align:center;--stack-justify:flex-start;--stack-padding:0px;--stack-gap:12px"><a aria-label="GitHub" href="https://github.com/vercel/next.js" rel="noopener" target="_blank"><img alt="GitHub Logo" loading="lazy" width="16" height="16" decoding="async" data-nimg="1" style="color:transparent" src="/icons/github.svg"/></a><hr/><a aria-label="Twitter" href="https://twitter.com/nextjs" rel="noopener" target="_blank"><img alt="X Logo" loading="lazy" width="16" height="16" decoding="async" data-nimg="1" class="footer_x__r5_ph" style="color:transparent" src="/icons/x.svg"/></a></div></div><div><h4>Resources</h4><a href="/docs">Docs</a><a data-zone="same" href="/learn">Learn</a><a data-zone="same" href="/showcase">Showcase</a><a data-zone="same" href="/blog">Blog</a><!--$--><a href="https://vercel.com/analytics?utm_source=next-site&utm_medium=footer&utm_campaign=blog_next-15" rel="noopener" target="_blank">Analytics</a><!--/$--><a href="/conf" data-zone="nextjs-conf">Next.js Conf</a><!--$--><a href="https://vercel.com/products/previews?utm_source=next-site&utm_medium=footer&utm_campaign=blog_next-15" rel="noopener" target="_blank">Previews</a><!--/$--></div><div><h4>More</h4><!--$--><a href="https://vercel.com/templates/next.js/nextjs-commerce?utm_source=next-site&utm_medium=footer&utm_campaign=blog_next-15" rel="noopener" target="_blank">Next.js Commerce</a><!--/$--><!--$--><a href="https://vercel.com/contact/sales?utm_source=next-site&utm_medium=footer&utm_campaign=blog_next-15" rel="noopener" target="_blank">Contact Sales</a><!--/$--><a href="https://github.com/vercel/next.js" rel="noopener noreferrer" target="_blank">GitHub</a><a href="https://github.com/vercel/next.js/releases" rel="noopener noreferrer" target="_blank">Releases</a><a data-zone="same" href="/telemetry">Telemetry</a><a data-zone="same" href="/governance">Governance</a></div><div><h4>About Vercel</h4><!--$--><a href="https://vercel.com/solutions/nextjs?utm_source=next-site&utm_medium=footer&utm_campaign=blog_next-15" rel="noopener" target="_blank">Next.js + Vercel</a><!--/$--><!--$--><a href="https://vercel.com/oss?utm_source=next-site&utm_medium=footer&utm_campaign=blog_next-15" rel="noopener" target="_blank">Open Source Software</a><!--/$--><a href="https://github.com/vercel" rel="noopener noreferrer" target="_blank">GitHub</a><a href="https://twitter.com/vercel" rel="noopener noreferrer" target="_blank">X</a></div><div><h4>Legal</h4><a href="https://vercel.com/legal/privacy-policy" rel="noopener" target="_blank">Privacy Policy</a><button id="fides-modal-link" type="button">Cookie Preferences</button></div><div class="footer_newsletter__GlFxe"><h4>Subscribe to our newsletter</h4><p>Stay updated on new releases and features, guides, and case studies.</p><form data-input-wrapper="true" action="" encType="multipart/form-data" method="POST"><input type="hidden" name="$ACTION_REF_1"/><input type="hidden" name="$ACTION_1:0" value="{"id":"60512692ba118fb8e0c58cc05726b4afbb811fc09b","bound":"$@1"}"/><input type="hidden" name="$ACTION_1:1" value="[{"success":false,"error":""}]"/><input type="hidden" name="$ACTION_KEY" value="k1511711161"/><input aria-label="Enter your email" data-1p-ignore="true" placeholder="you@domain.com" required="" type="email" name="email"/><button type="submit">Subscribe</button></form></div></div><div class="stack_stack__iZkUS stack footer_copyright__z9dsS" data-version="v1" style="--stack-flex:initial;--stack-direction:row;--stack-align:center;--stack-justify:space-between;--stack-padding:0px;--stack-gap:0px"><div class="stack_stack__iZkUS stack" data-version="v1" style="--stack-flex:initial;--stack-direction:column;--stack-align:stretch;--stack-justify:flex-start;--stack-padding:0px;--stack-gap:16px"><p>© <!-- -->2024<!-- --> Vercel, Inc.</p><div class="stack_stack__iZkUS stack footer_socials__VfDh3" data-version="v1" style="--stack-flex:initial;--stack-direction:row;--stack-align:center;--stack-justify:flex-start;--stack-padding:0px;--stack-gap:12px"><a aria-label="GitHub" href="https://github.com/vercel/next.js" rel="noopener" target="_blank"><img alt="GitHub Logo" loading="lazy" width="16" height="16" decoding="async" data-nimg="1" style="color:transparent" src="/icons/github.svg"/></a><hr/><a aria-label="Twitter" href="https://twitter.com/nextjs" rel="noopener" target="_blank"><img alt="X Logo" loading="lazy" width="16" height="16" decoding="async" data-nimg="1" class="footer_x__r5_ph" style="color:transparent" src="/icons/x.svg"/></a></div></div><!--$--><!--/$--></div></footer></div></div><!--/$--><!--$--><!--/$--><!--$!--><template data-dgst="BAILOUT_TO_CLIENT_SIDE_RENDERING"></template><!--/$--><script src="/_next/static/chunks/webpack-a905a987e08406bb.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"d:\"$Sreact.fragment\"\ne:I[35844,[],\"\"]\nf:I[92802,[],\"\"]\n10:I[6426,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"Analytics\"]\n11:I[62913,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoG"])</script><script>self.__next_f.push([1,"u98bDDaP69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"PrefetchCrossZoneLinksProvider\"]\n12:I[85249,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/ch"])</script><script>self.__next_f.push([1,"unks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"Header\"]\n13:I[5788,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"Provider\"]\n14:I[23732,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b"])</script><script>self.__next_f.push([1,"78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5600\",\"static/chunks/5600-036b4f92f1d976a8.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"975\",\"static/chunks/app/(next-site)/page-d065ed8aa15519a9.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"HydrateMeLater\"]\n15:I[18402,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"default\"]\n16:I[23290,[\"6674\",\"static/chunks/6674-29ca2292c"])</script><script>self.__next_f.push([1,"2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"4056\",\"static/chunks/4056-9fa3824b33ab5ae6.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6807\",\"static/chunks/6807-775e501a7f5d3c3f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6532\",\"static/chunks/app/(next-site)/blog/%5Bslug%5D/page-298e9255ec207842.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"Image\"]\n17:I[62913,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDa"])</script><script>self.__next_f.push([1,"P69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"Link\"]\n18:\"$Sreact.suspense\"\n19:I[96225,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"ExternalFooterLink\"]\n1a:I[13866,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvC"])</script><script>self.__next_f.push([1,"aSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"NewsletterForm\"]\n1b:I[85849,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8"])</script><script>self.__next_f.push([1,"236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"ThemeSwitcher\"]\n1c:I[58067,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=d"])</script><script>self.__next_f.push([1,"pl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"Cmdk\"]\n1d:I[68269,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"TrackPageView\"]\n1e:I[62913,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5946\",\"static/chunks/5946-d1eec9b2fdd3b62e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7406\",\"static/chunks/7406-cab612fa14e1f3a7.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP"])</script><script>self.__next_f.push([1,"69z\",\"2901\",\"static/chunks/2901-e0da18f108f1acbc.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"9503\",\"static/chunks/9503-62dfc92085fff039.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8096\",\"static/chunks/8096-2eb55beb8d350999.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"2172\",\"static/chunks/2172-f536267f3bb28b63.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"8236\",\"static/chunks/8236-3ac9a6911d3b7cea.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"3228\",\"static/chunks/3228-1a11c56b7add424b.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1629\",\"static/chunks/1629-69a0cb023ea3ef9f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7525\",\"static/chunks/7525-b9f264b43b34f46e.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1080\",\"static/chunks/app/(next-site)/layout-d7abfba405cc6185.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"PrefetchCrossZoneLinks\"]\n20:I[70781,[],\"OutletBoundary\"]\n22:I[70781,[],\"MetadataBoundary\"]\n24:I[70781,[],\"ViewportBoundary\"]\n26:I[65371,[],\"\"]\n1:HL[\"/_next/static/media/569ce4b8f30dc480-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n2:HL[\"/_next/static/media/93f479601ee12b01-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n3:HL[\"/_next/static/css/94930d6f827b22e1.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"style\"]\n4:HL[\"/_next/static/css/3a4b7cc0153d49b4.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"style\"]\n5:HL[\"/_next/static/css/58f50fdfd3cd38b6.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"style\"]\n6:HL[\"/_next/static/css/bf98005f04f1b7f7.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"style\"]\n7:HL[\"/_next/static/css/bfc235d8dfd01529.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"style\"]\n8:HL[\"/_next/static/css/824202e71e79374d.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"style\"]\n9:HL[\"/_next/static/css/83fe6bc36ad4703d.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"style\"]\na:HL[\"/_next/static/css/4ad309783bf416a2.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"style\"]\nb:HL[\"/"])</script><script>self.__next_f.push([1,"_next/static/css/baf446a5c20b5fd4.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"style\"]\nc:HL[\"/_next/static/css/f4addedd731adba4.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"WCPI3mjpypLitLn798T0C\",\"p\":\"\",\"c\":[\"\",\"blog\",\"next-15\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"(next-site)\",{\"children\":[\"blog\",{\"children\":[[\"slug\",\"next-15\",\"d\"],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",true]}],[\"\",[\"$\",\"$d\",\"c\",{\"children\":[null,[\"$\",\"$Le\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Lf\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[],[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"(next-site)\",[\"$\",\"$d\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/94930d6f827b22e1.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/3a4b7cc0153d49b4.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/58f50fdfd3cd38b6.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/bf98005f04f1b7f7.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"4\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/bfc235d8dfd01529.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"5\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/824202e71e79374d.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"6\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/83fe6bc36ad4703d.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"7\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/4ad309783bf416a2.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"8\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/baf446a5c20b5fd4.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"9\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/f4addedd731adba4.css?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"className\":\"__variable_b4bd81 __variable_4d318d\",\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\".uwu-flex { display: none; } .uwu .uwu-flex { display: flex; } .uwu .uwu-hidden { display: none; }\"}}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"try { if (['', 'true', '1'].includes(new URLSearchParams(document.location.search).get('uwu'))) { document.documentElement.classList.add('uwu'); console.log('Next.js uwu logo by SAWARATSUKI: https://github.com/SAWARATSUKI'); } } catch (e) {}\"}}]]}],[\"$\",\"body\",null,{\"children\":[[\"$\",\"$L10\",null,{}],[\"$\",\"$L11\",null,{\"children\":[[\"$\",\"$L12\",null,{}],[\"$\",\"$L13\",null,{\"children\":[[\"$\",\"main\",null,{\"children\":[\"$\",\"$Le\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"(next-site)\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Lf\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[],[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:notFound:1:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:1:props:children:1:props:notFound:1:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:notFound:1:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:1:props:children:1:props:notFound:1:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}],[\"$\",\"$L14\",null,{\"children\":[\"$\",\"$L15\",null,{\"className\":\"footer_root__6F7g2\",\"wide\":true,\"children\":[\"$\",\"div\",null,{\"className\":\"geist-wrapper\",\"children\":[\"$\",\"footer\",null,{\"className\":\"footer_footer__mqdak\",\"children\":[[\"$\",\"div\",null,{\"className\":\"footer_grid__yp2LW\",\"children\":[[\"$\",\"div\",null,{\"className\":\"stack_stack__iZkUS stack\",\"data-testid\":\"$undefined\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--stack-flex\":\"initial\",\"--stack-direction\":\"row\",\"--stack-align\":\"stretch\",\"--stack-justify\":\"space-between\",\"--stack-padding\":\"0px\",\"--stack-gap\":\"0px\"},\"data-logo\":true,\"children\":[[\"$\",\"a\",null,{\"className\":\"stack_stack__iZkUS stack\",\"data-testid\":\"$undefined\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--stack-flex\":\"initial\",\"--stack-direction\":\"column\",\"--stack-align\":\"stretch\",\"--stack-justify\":\"flex-start\",\"--stack-padding\":\"0px\",\"--stack-gap\":\"0px\"},\"aria-label\":\"Vercel logo\",\"data-logo-link\":\"\",\"href\":\"https://vercel.com/home?utm_source=next-site\u0026utm_medium=footer\u0026utm_campaign=next-website\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"title\":\"Go to the Vercel website\",\"children\":[\"$\",\"svg\",null,{\"fill\":\"none\",\"height\":\"20\",\"viewBox\":\"0 0 283 64\",\"children\":[\"$\",\"path\",null,{\"d\":\"M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z\",\"fill\":\"var(--geist-foreground)\"}]}]}],[\"$\",\"div\",null,{\"className\":\"stack_stack__iZkUS stack footer_socialsDesktop__XZ__G\",\"data-testid\":\"$undefined\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--stack-flex\":\"initial\",\"--stack-direction\":\"row\",\"--stack-align\":\"center\",\"--stack-justify\":\"flex-start\",\"--stack-padding\":\"0px\",\"--stack-gap\":\"12px\"},\"children\":[[\"$\",\"a\",null,{\"aria-label\":\"GitHub\",\"href\":\"https://github.com/vercel/next.js\",\"rel\":\"noopener\",\"target\":\"_blank\",\"children\":[\"$\",\"$L16\",null,{\"alt\":\"GitHub Logo\",\"height\":\"16\",\"src\":\"/icons/github.svg\",\"width\":\"16\"}]}],[\"$\",\"hr\",null,{}],[\"$\",\"a\",null,{\"aria-label\":\"Twitter\",\"href\":\"https://twitter.com/nextjs\",\"rel\":\"noopener\",\"target\":\"_blank\",\"children\":[\"$\",\"$L16\",null,{\"alt\":\"X Logo\",\"className\":\"footer_x__r5_ph\",\"height\":\"16\",\"src\":\"/icons/x.svg\",\"width\":\"16\"}]}]]}]]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"h4\",null,{\"children\":\"Resources\"}],[\"$\",\"a\",null,{\"href\":\"/docs\",\"children\":\"Docs\"}],[\"$\",\"$L17\",null,{\"href\":\"/learn\",\"prefetch\":false,\"children\":\"Learn\"}],[\"$\",\"$L17\",null,{\"href\":\"/showcase\",\"prefetch\":false,\"children\":\"Showcase\"}],[\"$\",\"$L17\",null,{\"href\":\"/blog\",\"prefetch\":false,\"children\":\"Blog\"}],[\"$\",\"$18\",null,{\"fallback\":null,\"children\":[\"$\",\"$L19\",null,{\"path\":\"/analytics\",\"children\":\"Analytics\"}]}],[\"$\",\"$L17\",null,{\"href\":\"/conf\",\"prefetch\":false,\"children\":\"Next.js Conf\"}],[\"$\",\"$18\",null,{\"fallback\":null,\"children\":[\"$\",\"$L19\",null,{\"path\":\"/products/previews\",\"children\":\"Previews\"}]}]]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"h4\",null,{\"children\":\"More\"}],[\"$\",\"$18\",null,{\"fallback\":null,\"children\":[\"$\",\"$L19\",null,{\"path\":\"/templates/next.js/nextjs-commerce\",\"children\":\"Next.js Commerce\"}]}],[\"$\",\"$18\",null,{\"fallback\":null,\"children\":[\"$\",\"$L19\",null,{\"path\":\"/contact/sales\",\"children\":\"Contact Sales\"}]}],[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":\"GitHub\"}],[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/releases\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":\"Releases\"}],[\"$\",\"$L17\",null,{\"href\":\"/telemetry\",\"prefetch\":false,\"children\":\"Telemetry\"}],[\"$\",\"$L17\",null,{\"href\":\"/governance\",\"prefetch\":false,\"children\":\"Governance\"}]]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"h4\",null,{\"children\":\"About Vercel\"}],[\"$\",\"$18\",null,{\"fallback\":null,\"children\":[\"$\",\"$L19\",null,{\"path\":\"/solutions/nextjs\",\"children\":\"Next.js + Vercel\"}]}],[\"$\",\"$18\",null,{\"fallback\":null,\"children\":[\"$\",\"$L19\",null,{\"path\":\"/oss\",\"children\":\"Open Source Software\"}]}],[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":\"GitHub\"}],[\"$\",\"a\",null,{\"href\":\"https://twitter.com/vercel\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":\"X\"}]]}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"h4\",null,{\"children\":\"Legal\"}],[\"$\",\"a\",null,{\"href\":\"https://vercel.com/legal/privacy-policy\",\"rel\":\"noopener\",\"target\":\"_blank\",\"children\":\"Privacy Policy\"}],[\"$\",\"button\",null,{\"id\":\"fides-modal-link\",\"type\":\"button\",\"children\":\"Cookie Preferences\"}]]}],[\"$\",\"$L1a\",null,{}]]}],[\"$\",\"div\",null,{\"className\":\"stack_stack__iZkUS stack footer_copyright__z9dsS\",\"data-testid\":\"$undefined\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--stack-flex\":\"initial\",\"--stack-direction\":\"row\",\"--stack-align\":\"center\",\"--stack-justify\":\"space-between\",\"--stack-padding\":\"0px\",\"--stack-gap\":\"0px\"},\"children\":[[\"$\",\"div\",null,{\"className\":\"stack_stack__iZkUS stack\",\"data-testid\":\"$undefined\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--stack-flex\":\"initial\",\"--stack-direction\":\"column\",\"--stack-align\":\"stretch\",\"--stack-justify\":\"flex-start\",\"--stack-padding\":\"0px\",\"--stack-gap\":\"16px\"},\"children\":[[\"$\",\"p\",null,{\"children\":[\"© \",\"2024\",\" Vercel, Inc.\"]}],[\"$\",\"div\",null,{\"className\":\"stack_stack__iZkUS stack footer_socials__VfDh3\",\"data-testid\":\"$undefined\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--stack-flex\":\"initial\",\"--stack-direction\":\"row\",\"--stack-align\":\"center\",\"--stack-justify\":\"flex-start\",\"--stack-padding\":\"0px\",\"--stack-gap\":\"12px\"},\"children\":[[\"$\",\"a\",null,{\"aria-label\":\"GitHub\",\"href\":\"https://github.com/vercel/next.js\",\"rel\":\"noopener\",\"target\":\"_blank\",\"children\":[\"$\",\"$L16\",null,{\"alt\":\"GitHub Logo\",\"height\":\"16\",\"src\":\"/icons/github.svg\",\"width\":\"16\"}]}],[\"$\",\"hr\",null,{}],[\"$\",\"a\",null,{\"aria-label\":\"Twitter\",\"href\":\"https://twitter.com/nextjs\",\"rel\":\"noopener\",\"target\":\"_blank\",\"children\":[\"$\",\"$L16\",null,{\"alt\":\"X Logo\",\"className\":\"footer_x__r5_ph\",\"height\":\"16\",\"src\":\"/icons/x.svg\",\"width\":\"16\"}]}]]}]]}],[\"$\",\"$18\",null,{\"fallback\":null,\"children\":[\"$\",\"$L1b\",null,{}]}]]}]]}]}]}]}],[\"$\",\"$L14\",null,{\"children\":[\"$\",\"$L1c\",null,{}]}],[\"$\",\"$L14\",null,{\"children\":[\"$\",\"$L1d\",null,{}]}]]}]]}],[\"$\",\"$L1e\",null,{}],null]}]]}]]}],{\"children\":[\"blog\",[\"$\",\"$d\",\"c\",{\"children\":[null,[\"$\",\"div\",null,{\"className\":\"relative mx-auto max-w-screen-xl gap-x-6 px-4 py-10 md:flex md:flex-row md:py-10\",\"children\":[[\"$\",\"div\",null,{\"id\":\"geist-skip-nav\",\"ref\":\"$undefined\",\"tabIndex\":-1}],[\"$\",\"$Le\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"(next-site)\",\"children\",\"blog\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Lf\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}]]}],{\"children\":[[\"slug\",\"next-15\",\"d\"],[\"$\",\"$d\",\"c\",{\"children\":[null,[\"$\",\"$Le\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"(next-site)\",\"children\",\"blog\",\"children\",\"$0:f:0:1:2:children:2:children:2:children:0\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Lf\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$d\",\"c\",{\"children\":[\"$L1f\",null,[\"$\",\"$L20\",null,{\"children\":\"$L21\"}]]}],{},null]},null]},null]},null]},null],[\"$\",\"$d\",\"h\",{\"children\":[null,[\"$\",\"$d\",\"C6rg_fMa6RM9sbEBykMnY\",{\"children\":[[\"$\",\"$L22\",null,{\"children\":\"$L23\"}],[\"$\",\"$L24\",null,{\"children\":\"$L25\"}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]]}]]],\"m\":\"$undefined\",\"G\":[\"$26\",\"$undefined\"],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"27:I[34917,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"4056\",\"static/chunks/4056-9fa3824b33ab5ae6.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6807\",\"static/chunks/6807-775e501a7f5d3c3f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6532\",\"static/chunks/app/(next-site)/blog/%5Bslug%5D/page-298e9255ec207842.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"\"]\n28:I[37562,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"4056\",\"static/chunks/4056-9fa3824b33ab5ae6.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6807\",\"static/chunks/6807-775e501a7f5d3c3f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6532\",\"static/chunks/app/(next-site)/blog/%5Bslug%5D/page-298e9255ec207842.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"CodeBlock\"]\n29:I[83592,[\"6674\",\"static/chunks/6674-29ca2292c2e30e3a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"1686\",\"static/chunks/1686-1b78075b224d193f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"5189\",\"static/chunks/5189-8520d0180c7b10ad.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"505\",\"static/chunks/505-1890a27b852a9f28.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"4056\",\"static/chunks/4056-9fa3824b33ab5ae6.js?dpl=dpl_2mGsmvCaSn"])</script><script>self.__next_f.push([1,"PYzpRoGu98bDDaP69z\",\"7023\",\"static/chunks/7023-cbfefeaa2b64975d.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6911\",\"static/chunks/6911-fd55ad484417ba6a.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6807\",\"static/chunks/6807-775e501a7f5d3c3f.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\",\"6532\",\"static/chunks/app/(next-site)/blog/%5Bslug%5D/page-298e9255ec207842.js?dpl=dpl_2mGsmvCaSnPYzpRoGu98bDDaP69z\"],\"MDXImage\"]\n2a:T108a,"])</script><script>self.__next_f.push([1,"Huge thanks to @AbhiShake1, @Aerilym, @AhmedBaset, @AnaTofuZ, @Arindam200, @Arinji2, @ArnaudFavier, @ArnoldVanN, @Auxdible, @B33fb0n3, @Bhavya031, @Bjornnyborg, @BunsDev, @CannonLock, @CrutchTheClutch, @DeepakBalaraman, @DerTimonius, @Develliot, @EffectDoplera, @Ehren12, @Ethan-Arrowood, @FluxCapacitor2, @ForsakenHarmony, @Francoscopic, @Gomah, @GyoHeon, @Hemanshu-Upadhyay, @HristovCodes, @HughHzyb, @IAmKushagraSharma, @IDNK2203, @IGassmann, @ImDR, @IncognitoTGT, @Jaaneek, @JamBalaya56562, @Jeffrey-Zutt, @JohnGemstone, @JoshuaKGoldberg, @Julian-Louis, @Juneezee, @KagamiChan, @Kahitar, @KeisukeNagakawa, @KentoMoriwaki, @Kikobeats, @KonkenBonken, @Kuboczoch, @Lada496, @LichuAcu, @LorisSigrist, @Lsnsh, @Luk-z, @Luluno01, @M-YasirGhaffar, @Maaz-Ahmed007, @Manoj-M-S, @ManuLpz4, @Marukome0743, @MaxLeiter, @MehfoozurRehman, @MildTomato, @MonstraG, @N2D4, @NavidNourani, @Nayeem-XTREME, @Netail, @NilsJacobsen, @Ocheretovich, @OlyaPolya, @PapatMayuri, @PaulAsjes, @PlagueFPS, @ProchaLu, @Pyr33x, @QiuranHu, @RiskyMH, @Sam-Phillemon9493, @Sayakie, @Shruthireddy04, @SouthLink, @Strift, @SukkaW, @Teddir, @Tim-Zj, @TrevorSayre, @Unsleeping, @Willem-Jaap, @a89529294, @abdull-haseeb, @abhi12299, @acdlite, @actopas, @adcichowski, @adiguno, @agadzik, @ah100101, @akazwz, @aktoriukas, @aldosch, @alessiomaffeis, @allanchau, @alpedia0, @amannn, @amikofalvy, @anatoliik-lyft, @anay-208, @andrii-bodnar, @anku255, @ankur-dwivedi, @aralroca, @archanaagivale30, @arlyon, @atik-persei, @avdeev, @baeharam, @balazsorban44, @bangseongbeom, @begalinsaf, @bennettdams, @bewinsnw, @bgw, @blvdmitry, @bobaaaaa, @boris-szl, @bosconian-dynamics, @brekk, @brianshano, @cfrank, @chandanpasunoori, @chentsulin, @chogyejin, @chrisjstott, @christian-bromann, @codeSTACKr, @coderfin, @coltonehrman, @controversial, @coopbri, @creativoma, @crebelskydico, @crutchcorn, @darthmaim, @datner, @davidsa03, @delbaoliveira, @devjiwonchoi, @devnyxie, @dhruv-kaushik, @dineshh-m, @diogocapela, @dnhn, @domdomegg, @domin-mnd, @dvoytenko, @ebCrypto, @ekremkenter, @emmerich, @flybayer, @floriangosse, @forsakenharmony, @francoscopic, @frys, @gabrielrolfsen, @gaojude, @gdborton, @greatvivek11, @gnoff, @guisehn, @GyoHeon, @hamirmahal, @hiro0218, @hirotomoyamada, @housseindjirdeh, @hungdoansy, @huozhi, @hwangstar156, @iampoul, @ianmacartney, @icyJoseph, @ijjk, @imddc, @imranolas, @iscekic, @jantimon, @jaredhan418, @jeanmax1me, @jericopulvera, @jjm2317, @jlbovenzo, @joelhooks, @joeshub, @jonathan-ingram, @jonluca, @jontewks, @joostmeijles, @jophy-ye, @jordienr, @jordyfontoura, @kahlstrm, @karlhorky, @karlkeefer, @kartheesan05, @kdy1, @kenji-webdev, @kevva, @khawajaJunaid, @kidonng, @kiner-tang, @kippmr, @kjac, @kjugi, @kshehadeh, @kutsan, @kwonoj, @kxlow, @leerob, @lforst, @li-jia-nan, @liby, @lonr, @lorensr, @lovell, @lubieowoce, @luciancah, @luismiramirez, @lukahartwig, @lumirlumir, @luojiyin1987, @mamuso, @manovotny, @marlier, @mauroaccornero, @maxhaomh, @mayank1513, @mcnaveen, @md-rejoyan-islam, @mehmetozguldev, @mert-duzgun, @mirasayon, @mischnic, @mknichel, @mobeigi, @molebox, @mratlamwala, @mud-ali, @n-ii-ma, @n1ckoates, @nattui, @nauvalazhar, @neila-a, @neoFinch, @niketchandivade, @nisabmohd, @none23, @notomo, @notrab, @nsams, @nurullah, @okoyecharles, @omahs, @paarthmadan, @pathliving, @pavelglac, @penicillin0, @phryneas, @pkiv, @pnutmath, @qqww08, @r34son, @raeyoung-kim, @remcohaszing, @remorses, @rezamauliadi, @rishabhpoddar, @ronanru, @royalfig, @rubyisrust, @ryan-nauman, @ryohidaka, @ryota-murakami, @s-ekai, @saltcod, @samcx, @samijaber, @sean-rallycry, @sebmarkbage, @shubh73, @shuding, @sirTangale, @sleevezip, @slimbde, @soedirgo, @sokra, @sommeeeer, @sopranopillow, @souporserious, @srkirkland, @steadily-worked, @steveluscher, @stipsan, @styfle, @stylessh, @syi0808, @symant233, @tariknh, @theoludwig, @timfish, @timfuhrmann, @timneutkens, @tknickman, @todor0v, @tokkiyaa, @torresgol10, @tranvanhieu01012002, @txxxxc, @typeofweb, @unflxw, @unstubbable, @versecafe, @vicb, @vkryachko, @wbinnssmith, @webtinax, @weicheng95, @wesbos, @whatisagi, @wiesson, @woutvanderploeg, @wyattjoh, @xiaohanyu, @xixixao, @xugetsu, @yosefbeder, @ypessoa, @ytori, @yunsii, @yurivangeffen, @z0n, @zce, @zhawtof, @zsh77, and @ztanner for helping!"])</script><script>self.__next_f.push([1,"1f:[\"$\",\"article\",null,{\"className\":\"detail_root__DU4wZ pb-20\",\"children\":[[\"$\",\"$L27\",null,{\"className\":\"detail_back__6w4Dy\",\"href\":\"/blog\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M19 12H5\\\"/\u003e\u003cpath d=\\\"M12 19l-7-7 7-7\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}],\"Back to Blog\"]}],[\"$\",\"p\",null,{\"className\":\"text_wrapper__i87JK\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--text-color\":\"var(--ds-gray-900)\",\"--text-size\":\"0.875rem\",\"--text-line-height\":\"1rem\",\"--text-letter-spacing\":\"initial\",\"--text-weight\":\"400\"},\"children\":\"Monday, October 21st 2024\"}],[\"$\",\"h1\",null,{\"className\":\"text_wrapper__i87JK font-semibold\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--text-color\":\"var(--ds-gray-1000)\",\"--text-size\":\"3rem\",\"--text-line-height\":\"3.5rem\",\"--text-letter-spacing\":\"-0.066875rem\",\"--text-weight\":\"700\"},\"children\":\"Next.js 15\"}],[\"$\",\"span\",null,{\"className\":\"text_wrapper__i87JK\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--text-color\":\"var(--ds-gray-900)\",\"--text-size\":\"0.875rem\",\"--text-line-height\":\"1.25rem\",\"--text-letter-spacing\":\"initial\",\"--text-weight\":\"400\"},\"children\":\"Posted by\"}],[\"$\",\"div\",null,{\"className\":\"stack_stack__iZkUS stack detail_authors__59UPR mb-8 mt-3 pb-4\",\"data-testid\":\"$undefined\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--stack-flex\":\"initial\",\"--stack-direction\":\"row\",\"--stack-align\":\"stretch\",\"--stack-justify\":\"flex-start\",\"--stack-padding\":\"0px\",\"--stack-gap\":\"16px\"},\"children\":[[\"$\",\"a\",\"authors/delba-oliveira.md\",{\"className\":\"detail_author__AvoLc\",\"href\":\"https://twitter.com/delba_oliveira\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[[\"$\",\"$L16\",null,{\"alt\":\"Delba de Oliveira\",\"className\":\"rounded-full\",\"height\":32,\"src\":\"/static/team/delba.jpg\",\"width\":32}],[\"$\",\"div\",null,{\"className\":\"stack_stack__iZkUS stack\",\"data-testid\":\"$undefined\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--stack-flex\":\"initial\",\"--stack-direction\":\"column\",\"--stack-align\":\"stretch\",\"--stack-justify\":\"flex-start\",\"--stack-padding\":\"0px\",\"--stack-gap\":\"0px\"},\"children\":[[\"$\",\"span\",null,{\"className\":\"text_wrapper__i87JK\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--text-color\":\"var(--ds-gray-1000)\",\"--text-size\":\"0.875rem\",\"--text-line-height\":\"1.25rem\",\"--text-letter-spacing\":\"initial\",\"--text-weight\":500},\"children\":\"Delba de Oliveira\"}],[\"$\",\"span\",null,{\"className\":\"text_wrapper__i87JK\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--text-color\":\"var(--ds-gray-900)\",\"--text-size\":\"0.75rem\",\"--text-line-height\":\"1rem\",\"--text-letter-spacing\":\"initial\",\"--text-weight\":\"400\"},\"children\":[\"@\",\"delba_oliveira\"]}]]}]]}],[\"$\",\"a\",\"authors/jimmy-lai.md\",{\"className\":\"detail_author__AvoLc\",\"href\":\"https://twitter.com/feedthejim\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[[\"$\",\"$L16\",null,{\"alt\":\"Jimmy Lai\",\"className\":\"rounded-full\",\"height\":32,\"src\":\"/static/team/jimmy.jpg\",\"width\":32}],[\"$\",\"div\",null,{\"className\":\"stack_stack__iZkUS stack\",\"data-testid\":\"$undefined\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--stack-flex\":\"initial\",\"--stack-direction\":\"column\",\"--stack-align\":\"stretch\",\"--stack-justify\":\"flex-start\",\"--stack-padding\":\"0px\",\"--stack-gap\":\"0px\"},\"children\":[[\"$\",\"span\",null,{\"className\":\"text_wrapper__i87JK\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--text-color\":\"var(--ds-gray-1000)\",\"--text-size\":\"0.875rem\",\"--text-line-height\":\"1.25rem\",\"--text-letter-spacing\":\"initial\",\"--text-weight\":500},\"children\":\"Jimmy Lai\"}],[\"$\",\"span\",null,{\"className\":\"text_wrapper__i87JK\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--text-color\":\"var(--ds-gray-900)\",\"--text-size\":\"0.75rem\",\"--text-line-height\":\"1rem\",\"--text-letter-spacing\":\"initial\",\"--text-weight\":\"400\"},\"children\":[\"@\",\"feedthejim\"]}]]}]]}],[\"$\",\"a\",\"authors/rich-haines.md\",{\"className\":\"detail_author__AvoLc\",\"href\":\"https://twitter.com/studio_hungry\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[[\"$\",\"$L16\",null,{\"alt\":\"Rich Haines\",\"className\":\"rounded-full\",\"height\":32,\"src\":\"/static/team/rich.jpg\",\"width\":32}],[\"$\",\"div\",null,{\"className\":\"stack_stack__iZkUS stack\",\"data-testid\":\"$undefined\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--stack-flex\":\"initial\",\"--stack-direction\":\"column\",\"--stack-align\":\"stretch\",\"--stack-justify\":\"flex-start\",\"--stack-padding\":\"0px\",\"--stack-gap\":\"0px\"},\"children\":[[\"$\",\"span\",null,{\"className\":\"text_wrapper__i87JK\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--text-color\":\"var(--ds-gray-1000)\",\"--text-size\":\"0.875rem\",\"--text-line-height\":\"1.25rem\",\"--text-letter-spacing\":\"initial\",\"--text-weight\":500},\"children\":\"Rich Haines\"}],[\"$\",\"span\",null,{\"className\":\"text_wrapper__i87JK\",\"data-version\":\"v1\",\"ref\":\"$undefined\",\"style\":{\"--text-color\":\"var(--ds-gray-900)\",\"--text-size\":\"0.75rem\",\"--text-line-height\":\"1rem\",\"--text-letter-spacing\":\"initial\",\"--text-weight\":\"400\"},\"children\":[\"@\",\"studio_hungry\"]}]]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"prose prose-vercel max-w-none\",\"children\":[[\"$\",\"p\",null,{\"children\":[\"Next.js 15 is officially stable and ready for production. This release builds on the updates from both \",[\"$\",\"$L27\",null,{\"href\":\"/blog/next-15-rc\",\"children\":\"RC1\"}],\" and \",[\"$\",\"$L27\",null,{\"href\":\"/blog/next-15-rc2\",\"children\":\"RC2\"}],\". We've focused heavily on stability while adding some exciting updates we think you'll love. Try Next.js 15 today:\"]}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"terminal\",\"language\":\"bash\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"# Use the new automated upgrade CLI\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"npx \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"@next/codemod@canary\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"upgrade\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"latest\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"# ...or upgrade manually\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"npm \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"install\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"next@latest\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"react@rc\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"react-dom@rc\"}]]}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"We're also excited to share more about what's coming next at \",[\"$\",\"$L27\",null,{\"href\":\"/conf\",\"children\":\"Next.js Conf\"}],\" this Thursday, October 24th.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Here's what is new in Next.js 15:\"}],\"\\n\",[\"$\",\"ul\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#smooth-upgrades-with-nextcodemod-cli\",\"children\":[\"$\",\"strong\",null,{\"children\":[[\"$\",\"code\",null,{\"children\":\"@next/codemod\"}],\" CLI:\"]}]}],\" Easily upgrade to the latest Next.js and React versions.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#async-request-apis-breaking-change\",\"children\":[\"$\",\"strong\",null,{\"children\":\"Async Request APIs (Breaking):\"}]}],\" Incremental step towards a simplified rendering and caching model.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#caching-semantics\",\"children\":[\"$\",\"strong\",null,{\"children\":\"Caching Semantics (Breaking):\"}]}],\" \",[\"$\",\"code\",null,{\"children\":\"fetch\"}],\" requests, \",[\"$\",\"code\",null,{\"children\":\"GET\"}],\" Route Handlers, and client navigations are no longer cached by default.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#react-19\",\"children\":[\"$\",\"strong\",null,{\"children\":\"React 19 Support:\"}]}],\" Support for React 19, React Compiler (Experimental), and hydration error improvements.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#turbopack-dev\",\"children\":[\"$\",\"strong\",null,{\"children\":\"Turbopack Dev (Stable):\"}]}],\" Performance and stability improvements.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#static-route-indicator\",\"children\":[\"$\",\"strong\",null,{\"children\":\"Static Indicator:\"}]}],\" New visual indicator shows static routes during development.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#executing-code-after-a-response-with-unstable_after-experimental\",\"children\":[\"$\",\"strong\",null,{\"children\":[[\"$\",\"code\",null,{\"children\":\"unstable_after\"}],\" API (Experimental):\"]}]}],\" Execute code after a response finishes streaming.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#instrumentationjs-stable\",\"children\":[\"$\",\"strong\",null,{\"children\":[[\"$\",\"code\",null,{\"children\":\"instrumentation.js\"}],\" API (Stable):\"]}]}],\" New API for server lifecycle observability.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#form-component\",\"children\":[\"$\",\"strong\",null,{\"children\":[\"Enhanced Forms (\",[\"$\",\"code\",null,{\"children\":\"next/form\"}],\"):\"]}]}],\" Enhance HTML forms with client-side navigation.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#support-for-nextconfigts\",\"children\":[\"$\",\"strong\",null,{\"children\":[[\"$\",\"code\",null,{\"children\":\"next.config\"}],\":\"]}]}],\" TypeScript support for \",[\"$\",\"code\",null,{\"children\":\"next.config.ts\"}],\".\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#improvements-for-self-hosting\",\"children\":[\"$\",\"strong\",null,{\"children\":\"Self-hosting Improvements:\"}]}],\" More control over \",[\"$\",\"code\",null,{\"children\":\"Cache-Control\"}],\" headers.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#enhanced-security-for-server-actions\",\"children\":[\"$\",\"strong\",null,{\"children\":\"Server Actions Security:\"}]}],\" Unguessable endpoints and removal of unused actions.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#optimizing-bundling-of-external-packages-stable\",\"children\":[\"$\",\"strong\",null,{\"children\":\"Bundling External Packages (Stable):\"}]}],\" New config options for App and Pages Router.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#eslint-9-support\",\"children\":[\"$\",\"strong\",null,{\"children\":\"ESLint 9 Support:\"}]}],\" Added support for ESLint 9.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"#development-and-build-improvements\",\"children\":[\"$\",\"strong\",null,{\"children\":\"Development and Build Performance:\"}]}],\" Improved build times and Faster Fast Refresh.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"smooth-upgrades-with-nextcodemod-cli\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#smooth-upgrades-with-nextcodemod-cli\",\"children\":[\"Smooth upgrades with \",[\"$\",\"code\",null,{\"children\":\"@next/codemod\"}],\" CLI\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"We include codemods (automated code transformations) with every major Next.js release to help automate upgrading breaking changes.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"To make upgrades even smoother, we've released an enhanced codemod CLI:\"}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"Terminal\",\"language\":\"bash\",\"switcher\":\"$undefined\",\"children\":[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"npx \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"@next/codemod@canary\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"upgrade\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"latest\"}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"This tool helps you upgrade your codebase to the latest stable or prerelease versions. The CLI will update your dependencies, show available codemods, and guide you through applying them.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"The \",[\"$\",\"code\",null,{\"children\":\"canary\"}],\" tag uses the latest version of the codemod while the latest specifies the Next.js version. We recommend using the canary version of the codemod even if you are upgrading to the latest Next.js version, as we plan to continue adding improvements to the tool based on your feedback.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Learn more about \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/upgrading/codemods\",\"children\":\"Next.js codemod CLI\"}],\".\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"async-request-apis-breaking-change\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#async-request-apis-breaking-change\",\"children\":[\"Async Request APIs (Breaking Change)\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"In traditional Server-Side Rendering, the server waits for a request before rendering any content. However, not all components depend on request-specific data, so it's unnecessary to wait for the request to render them. Ideally, the server would prepare as much as possible before a request arrives. To enable this, and set the stage for future optimizations, we need to know when to wait for the request.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Therefore, we are transitioning APIs that rely on request-specific data—such as \",[\"$\",\"code\",null,{\"children\":\"headers\"}],\", \",[\"$\",\"code\",null,{\"children\":\"cookies\"}],\", \",[\"$\",\"code\",null,{\"children\":\"params\"}],\", and \",[\"$\",\"code\",null,{\"children\":\"searchParams\"}],\"—to be \",[\"$\",\"strong\",null,{\"children\":\"asynchronous\"}],\".\"]}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"$undefined\",\"language\":\"jsx\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"import\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" { cookies } \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"from\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'next/headers'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\";\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"async\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"function\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"AdminPanel\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"() {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"cookieStore\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"await\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"cookies\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"();\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"token\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"cookieStore\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\".get\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'token'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\");\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// ...\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"}\"}]}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"This is a \",[\"$\",\"strong\",null,{\"children\":\"breaking change\"}],\" and affects the following APIs:\"]}],\"\\n\",[\"$\",\"ul\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":[\"$\",\"code\",null,{\"children\":\"cookies\"}]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[\"$\",\"code\",null,{\"children\":\"headers\"}]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[\"$\",\"code\",null,{\"children\":\"draftMode\"}]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"code\",null,{\"children\":\"params\"}],\" in \",[\"$\",\"code\",null,{\"children\":\"layout.js\"}],\", \",[\"$\",\"code\",null,{\"children\":\"page.js\"}],\", \",[\"$\",\"code\",null,{\"children\":\"route.js\"}],\", \",[\"$\",\"code\",null,{\"children\":\"default.js\"}],\", \",[\"$\",\"code\",null,{\"children\":\"generateMetadata\"}],\", and \",[\"$\",\"code\",null,{\"children\":\"generateViewport\"}]]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"code\",null,{\"children\":\"searchParams\"}],\" in \",[\"$\",\"code\",null,{\"children\":\"page.js\"}]]}],\"\\n\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"For an easier migration, these APIs can temporarily be accessed synchronously, but will show warnings in development and production until the next major version. A \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/upgrading/codemods\",\"children\":\"codemod\"}],\" is available to automate the migration:\"]}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"Terminal\",\"language\":\"bash\",\"switcher\":\"$undefined\",\"children\":[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"npx \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"@next/codemod@canary\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\"next-async-request-api\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string)\"},\"children\":\".\"}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"For cases where the codemod can't fully migrate your code, please read the \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/upgrading/version-15\",\"children\":\"upgrade guide\"}],\". We have also provided an \",[\"$\",\"a\",null,{\"href\":\"https://github.com/leerob/next-saas-starter/pull/62\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"example\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\" of how to migrate a Next.js application to the new APIs.\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"caching-semantics\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#caching-semantics\",\"children\":[\"Caching Semantics\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Next.js App Router launched with opinionated caching defaults. These were designed to provide the most performant option by default with the ability to opt out when required.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Based on your feedback, we re-evaluated our \",[\"$\",\"a\",null,{\"href\":\"https://x.com/feedthejim/status/1785242054773145636\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"caching heuristics\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\" and how they would interact with projects like Partial Prerendering (PPR) and with third party libraries using \",[\"$\",\"code\",null,{\"children\":\"fetch\"}],\".\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"With Next.js 15, we're changing the caching default for \",[\"$\",\"code\",null,{\"children\":\"GET\"}],\" Route Handlers and the Client Router Cache from cached by default to uncached by default. If you want to retain the previous behavior, you can continue to opt-into caching.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"We're continuing to improve caching in Next.js in the coming months and we'll share more details soon.\"}],\"\\n\",[\"$\",\"h3\",null,{\"id\":\"get-route-handlers-are-no-longer-cached-by-default\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#get-route-handlers-are-no-longer-cached-by-default\",\"children\":[[\"$\",\"code\",null,{\"children\":\"GET\"}],\" Route Handlers are no longer cached by default\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"In Next 14, Route Handlers that used the \",[\"$\",\"code\",null,{\"children\":\"GET\"}],\" HTTP method were cached by default unless they used a dynamic function or dynamic config option. In Next.js 15, \",[\"$\",\"code\",null,{\"children\":\"GET\"}],\" functions are \",[\"$\",\"strong\",null,{\"children\":\"not cached by default\"}],\".\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"You can still opt into caching using a static route config option such as \",[\"$\",\"code\",null,{\"children\":\"export dynamic = 'force-static'\"}],\".\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Special Route Handlers like \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/file-conventions/metadata/sitemap\",\"children\":[\"$\",\"code\",null,{\"children\":\"sitemap.ts\"}]}],\", \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/file-conventions/metadata/opengraph-image\",\"children\":[\"$\",\"code\",null,{\"children\":\"opengraph-image.tsx\"}]}],\", and \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/file-conventions/metadata/app-icons\",\"children\":[\"$\",\"code\",null,{\"children\":\"icon.tsx\"}]}],\", and other \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/file-conventions/metadata\",\"children\":\"metadata files\"}],\" remain static by default unless they use dynamic functions or dynamic config options.\"]}],\"\\n\",[\"$\",\"h3\",null,{\"id\":\"client-router-cache-no-longer-caches-page-components-by-default\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#client-router-cache-no-longer-caches-page-components-by-default\",\"children\":[\"Client Router Cache no longer caches Page components by default\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"In Next.js 14.2.0, we introduced an experimental \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/next-config-js/staleTimes\",\"children\":[\"$\",\"code\",null,{\"children\":\"staleTimes\"}]}],\" flag to allow custom configuration of the \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/caching#client-side-router-cache\",\"children\":\"Router Cache\"}],\".\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"In Next.js 15, this flag still remains accessible, but we are changing the default behavior to have a \",[\"$\",\"code\",null,{\"children\":\"staleTime\"}],\" of \",[\"$\",\"code\",null,{\"children\":\"0\"}],\" for Page segments. This means that as you navigate around your app, the client will always reflect the latest data from the Page component(s) that become active as part of the navigation. However, there are still important behaviors that remain unchanged:\"]}],\"\\n\",[\"$\",\"ul\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":[\"Shared layout data won't be refetched from the server to continue to support \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/routing/linking-and-navigating#4-partial-rendering\",\"children\":\"partial rendering\"}],\".\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":\"Back/forward navigation will still restore from cache to ensure the browser can restore scroll position.\"}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/file-conventions/loading\",\"children\":[\"$\",\"code\",null,{\"children\":\"loading.js\"}]}],\" will remain cached for 5 minutes (or the value of the \",[\"$\",\"code\",null,{\"children\":\"staleTimes.static\"}],\" configuration).\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"You can opt into the previous Client Router Cache behavior by setting the following configuration:\"}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"next.config.ts\",\"language\":\"ts\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"nextConfig\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" experimental\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" staleTimes\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" dynamic\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"30\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" }\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" }\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"};\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"default\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" nextConfig;\"}]]}]]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"react-19\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#react-19\",\"children\":[\"React 19\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"As part of the Next.js 15 release, we've made the decision to align with the upcoming release of React 19.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"In version 15, the App Router uses React 19 RC, and we've also introduced backwards compatibility for React 18 with the Pages Router based on community feedback. If you're using the Pages Router, this allows you to upgrade to React 19 when ready.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Although React 19 is still in the RC phase, our extensive testing across real-world applications and our close work with the React team have given us confidence in its stability. The core breaking changes have been well-tested and won't affect existing App Router users. Therefore, we've decided to release Next.js 15 as stable now, so your projects are fully prepared for React 19 GA.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"To ensure the transition is as smooth as possible, we've provided \",[\"$\",\"a\",null,{\"href\":\"#smooth-upgrades-with-codemod-cli\",\"children\":\"codemods and automated tools\"}],\" to help ease the migration process.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Read the \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/upgrading/version-15\",\"children\":\"Next.js 15 upgrade guide\"}],\", the \",[\"$\",\"a\",null,{\"href\":\"https://react.dev/blog/2024/04/25/react-19-upgrade-guide\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"React 19 upgrade guide\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", and watch the \",[\"$\",\"a\",null,{\"href\":\"https://www.youtube.com/live/T8TZQ6k4SLE?t=1788\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"React Conf Keynote\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\" to learn more.\"]}],\"\\n\",[\"$\",\"h3\",null,{\"id\":\"pages-router-on-react-18\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#pages-router-on-react-18\",\"children\":[\"Pages Router on React 18\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Next.js 15 maintains backward compatibility for the Pages Router with React 18, allowing users to continue using React 18 while benefiting from improvements in Next.js 15.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Since the first Release Candidate (RC1), we've shifted our focus to include support for React 18 based on community feedback. This flexibility enables you to adopt Next.js 15 while using the Pages Router with React 18, giving you greater control over your upgrade path.\"}],\"\\n\",[\"$\",\"blockquote\",null,{\"className\":\"p-3 text-sm\",\"children\":[\"\\n\",[\"$\",\"p\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Note:\"}],\" While it is possible to run the Pages Router on React 18 and the App Router on React 19 in the same application, we don't recommend this setup. Doing so could result in unpredictable behavior and typings inconsistencies, as the underlying APIs and rendering logic between the two versions may not fully align.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"h3\",null,{\"id\":\"react-compiler-experimental\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#react-compiler-experimental\",\"children\":[\"React Compiler (Experimental)\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"The \",[\"$\",\"a\",null,{\"href\":\"https://react.dev/learn/react-compiler\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"React Compiler\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\" is a new experimental compiler created by the React team at Meta. The compiler understands your code at a deep level through its understanding of plain JavaScript semantics and the \",[\"$\",\"a\",null,{\"href\":\"https://react.dev/reference/rules\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Rules of React\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", which allows it to add automatic optimizations to your code. The compiler reduces the amount of manual memoization developers have to do through APIs such as \",[\"$\",\"code\",null,{\"children\":\"useMemo\"}],\" and \",[\"$\",\"code\",null,{\"children\":\"useCallback\"}],\" - making code simpler, easier to maintain, and less error prone.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"With Next.js 15, we've added support for the \",[\"$\",\"a\",null,{\"href\":\"https://react.dev/learn/react-compiler\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"React Compiler\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\". Learn more about the React Compiler, and the \",[\"$\",\"a\",null,{\"href\":\"https://react.dev/learn/react-compiler#usage-with-nextjs\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"available Next.js config options\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\".\"]}],\"\\n\",[\"$\",\"blockquote\",null,{\"className\":\"p-3 text-sm\",\"children\":[\"\\n\",[\"$\",\"p\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Note:\"}],\" The React Compiler is currently only available as a Babel plugin, which will result in slower development and build times.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"h3\",null,{\"id\":\"hydration-error-improvements\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#hydration-error-improvements\",\"children\":[\"Hydration error improvements\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Next.js 14.1 \",[\"$\",\"$L27\",null,{\"href\":\"/blog/next-14-1#improved-error-messages-and-fast-refresh\",\"children\":\"made improvements\"}],\" to error messages and hydration errors. Next.js 15 continues to build on those by adding an improved hydration error view. Hydration errors now display the source code of the error with suggestions on how to address the issue.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"For example, this was a previous hydration error message in Next.js 14.1:\"}],\"\\n\",[\"$\",\"$L29\",null,{\"alt\":\"Hydration error message in Next.js 14.1\",\"srcLight\":\"/static/blog/next-15-rc/hydration-error-before-light.png\",\"srcDark\":\"/static/blog/next-15-rc/hydration-error-before-dark.png\",\"width\":962,\"height\":517}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Next.js 15 has improved this to:\"}],\"\\n\",[\"$\",\"$L29\",null,{\"alt\":\"Hydration error message improved in Next.js 15\",\"srcLight\":\"/static/blog/next-15-rc/hydration-error-after-light.png\",\"srcDark\":\"/static/blog/next-15-rc/hydration-error-after-dark.png\",\"width\":960,\"height\":654}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"turbopack-dev\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#turbopack-dev\",\"children\":[\"Turbopack Dev\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"We are happy to announce that \",[\"$\",\"code\",null,{\"children\":\"next dev --turbo\"}],\" is now \",[\"$\",\"strong\",null,{\"children\":\"stable and ready\"}],\" to speed up your development experience. We've been using it to iterate on \",[\"$\",\"a\",null,{\"href\":\"https://vercel.com\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"vercel.com\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://nextjs.org\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"nextjs.org\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://v0.dev\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"v0\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", and all of our other applications with great results.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"For example, with \",[\"$\",\"code\",null,{\"children\":\"vercel.com\"}],\", a large Next.js app, we've seen:\"]}],\"\\n\",[\"$\",\"ul\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":[\"Up to \",[\"$\",\"strong\",null,{\"children\":\"76.7% faster\"}],\" local server startup.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[\"Up to \",[\"$\",\"strong\",null,{\"children\":\"96.3% faster\"}],\" code updates with Fast Refresh.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[\"Up to \",[\"$\",\"strong\",null,{\"children\":\"45.8% faster\"}],\" initial route compile without caching (Turbopack does not have disk caching yet).\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"You can learn more about Turbopack Dev in our new \",[\"$\",\"$L27\",null,{\"href\":\"/blog/turbopack-for-development-stable\",\"children\":\"blog post\"}],\".\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"static-route-indicator\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#static-route-indicator\",\"children\":[\"Static Route Indicator\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Next.js now displays a Static Route Indicator during development to help you identify which routes are static or dynamic. This visual cue makes it easier to optimize performance by understanding how your pages are rendered.\"}],\"\\n\",[\"$\",\"$L29\",null,{\"alt\":\"\",\"srcLight\":\"/static/blog/next-15-rc2/static-route-light.png\",\"srcDark\":\"/static/blog/next-15-rc2/static-route-dark.png\",\"width\":1720,\"height\":516}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"You can also use the \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/cli/next#next-build-options\",\"children\":\"next build\"}],\" output to view the rendering strategy for all routes.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"This update is part of our ongoing efforts to enhance observability in Next.js, making it easier for developers to monitor, debug, and optimize their applications. We're also working on dedicated developer tools, with more details to come soon.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Learn more about the \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/next-config-js/devIndicators#appisrstatus-static-indicator\",\"children\":\"Static Route Indicator\"}],\", which can be disabled.\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"executing-code-after-a-response-with-unstable_after-experimental\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#executing-code-after-a-response-with-unstable_after-experimental\",\"children\":[\"Executing code after a response with \",[\"$\",\"code\",null,{\"children\":\"unstable_after\"}],\" (Experimental)\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"When processing a user request, the server typically performs tasks directly related to computing the response. However, you may need to perform tasks such as logging, analytics, and other external system synchronization.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Since these tasks are not directly related to the response, the user should not have to wait for them to complete. Deferring the work after responding to the user poses a challenge because serverless functions stop computation immediately after the response is closed.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":[[\"$\",\"code\",null,{\"children\":\"after()\"}],\" is a new experimental API that solves this problem by allowing you to schedule work to be processed after the response has finished streaming, enabling secondary tasks to run without blocking the primary response.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"To use it, add \",[\"$\",\"code\",null,{\"children\":\"experimental.after\"}],\" to \",[\"$\",\"code\",null,{\"children\":\"next.config.js\"}],\":\"]}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"next.config.ts\",\"language\":\"tsx\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"nextConfig\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" experimental\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" after\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"true\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" }\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"};\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"default\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" nextConfig;\"}]]}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Then, import the function in Server Components, Server Actions, Route Handlers, or Middleware.\"}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"$undefined\",\"language\":\"jsx\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"import\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" { unstable_after \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"as\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" after } \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"from\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'next/server'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\";\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"import\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" { log } \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"from\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'@/app/utils'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\";\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"default\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"function\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"Layout\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"({ children }) {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// Secondary task\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"after\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(() \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\u003e\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"log\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"();\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" });\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// Primary task\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"return\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \u003c\u003e{children}\u003c/\u003e;\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"}\"}]}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Learn more about \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/functions/unstable_after\",\"children\":[\"$\",\"code\",null,{\"children\":\"unstable_after\"}]}],\".\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"instrumentationjs-stable\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#instrumentationjs-stable\",\"children\":[[\"$\",\"code\",null,{\"children\":\"instrumentation.js\"}],\" (Stable)\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"The \",[\"$\",\"code\",null,{\"children\":\"instrumentation\"}],\" file, with the \",[\"$\",\"code\",null,{\"children\":\"register()\"}],\" API, allows users to tap into the Next.js server lifecycle to monitor performance, track the source of errors, and deeply integrate with observability libraries like \",[\"$\",\"a\",null,{\"href\":\"https://opentelemetry.io/\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"OpenTelemetry\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\".\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"This feature is now \",[\"$\",\"strong\",null,{\"children\":\"stable\"}],\" and the \",[\"$\",\"code\",null,{\"children\":\"experimental.instrumentationHook\"}],\" config option can be removed.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"In addition, we've collaborated with \",[\"$\",\"a\",null,{\"href\":\"https://sentry.io/\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Sentry\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\" on designing a new \",[\"$\",\"code\",null,{\"children\":\"onRequestError\"}],\" hook that can be used to:\"]}],\"\\n\",[\"$\",\"ul\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":[\"Capture important context about all errors thrown on the server, including:\",\"\\n\",[\"$\",\"ul\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":\"Router: Pages Router or App Router\"}],\"\\n\",[\"$\",\"li\",null,{\"children\":\"Server context: Server Component, Server Action, Route Handler, or Middleware\"}],\"\\n\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":\"Report the errors to your favorite observability provider.\"}],\"\\n\"]}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"$undefined\",\"language\":\"jsx\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"async\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"function\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"onRequestError\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(err\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" request\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" context) {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"await\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"fetch\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'https://...'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" method\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'POST'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" body\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"JSON\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\".stringify\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"({ message\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"err\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\".message\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" request\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" context })\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" headers\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" { \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'Content-Type'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'application/json'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" }\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" });\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"}\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"async\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"function\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"register\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"() {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// init your favorite observability provider SDK\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"}\"}]}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Learn more about the \",[\"$\",\"code\",null,{\"children\":\"onRequestError\"}],\" \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/file-conventions/instrumentation#onrequesterror-optional\",\"children\":\"function\"}],\".\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"form-component\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#form-component\",\"children\":[[\"$\",\"code\",null,{\"children\":\"\u003cForm\u003e\"}],\" Component\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"The new \",[\"$\",\"code\",null,{\"children\":\"\u003cForm\u003e\"}],\" component extends the HTML \",[\"$\",\"code\",null,{\"children\":\"\u003cform\u003e\"}],\" element with \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/routing/linking-and-navigating#2-prefetching\",\"children\":\"prefetching\"}],\", \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/routing/linking-and-navigating#5-soft-navigation\",\"children\":\"client-side navigation\"}],\", and progressive enhancement.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"It is useful for forms that navigate to a new page, such as a search form that leads to a results page.\"}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"app/page.jsx\",\"language\":\"jsx\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"import\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" Form \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"from\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'next/form'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\";\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"default\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"function\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"Page\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"() {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"return\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" (\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \u003c\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"Form\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"action\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"\\\"/search\\\"\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"\u003e\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \u003c\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"input\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"name\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"\\\"query\\\"\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" /\u003e\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \u003c\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"button\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"type\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"\\\"submit\\\"\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"\u003eSubmit\u003c/\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"button\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"\u003e\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \u003c/\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"Form\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"\u003e\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" );\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"}\"}]}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"The \",[\"$\",\"code\",null,{\"children\":\"\u003cForm\u003e\"}],\" component comes with:\"]}],\"\\n\",[\"$\",\"ul\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Prefetching\"}],\": When the form is in view, the \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/file-conventions/layout\",\"children\":\"layout\"}],\" and \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/file-conventions/loading\",\"children\":\"loading\"}],\" UI are prefetched, making navigation fast.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Client-side Navigation:\"}],\" On submission, shared layouts and client-side state are preserved.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Progressive Enhancement\"}],\": If JavaScript hasn't loaded yet, the form still works via full-page navigation.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Previously, achieving these features required a lot of manual boilerplate. For example:\"}],\"\\n\",[\"$\",\"details\",null,{\"children\":[[\"$\",\"summary\",null,{\"children\":\"Example\"}],[\"$\",\"$L28\",null,{\"filename\":\"$undefined\",\"language\":\"jsx\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// Note: This is abbreviated for demonstration purposes.\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// Not recommended for use in production code.\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'use client'\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"import\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" { useEffect } \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"from\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'react'\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"import\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" { useRouter } \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"from\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'next/navigation'\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"default\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"function\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"Form\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(props) {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"action\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"props\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\".action\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"router\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"useRouter\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"()\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"useEffect\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(() \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\u003e\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// if form target is a URL, prefetch it\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"if\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" (\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"typeof\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" action \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"===\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'string'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\") {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"router\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\".prefetch\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(action)\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" }\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" }\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" [action\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" router])\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"function\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"onSubmit\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(event) {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"event\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\".preventDefault\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"()\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// grab all of the form fields and trigger a `router.push` with the data URL encoded\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"formData\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"new\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"FormData\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"event\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\".currentTarget)\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"data\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"new\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"URLSearchParams\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"()\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"for\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" (\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" [\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"name\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"value\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"] \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"of\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" formData) {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"data\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\".append\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(name\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" value \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"as\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"string\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\")\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" }\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"router\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\".push\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"`\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"$${\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"action\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"}\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"?\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"$${\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"data\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\".toString\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"()\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"}\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"`\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\")\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" }\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"if\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" (\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"typeof\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" action \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"===\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'string'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\") {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"return\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \u003c\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"form\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"onSubmit\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"{onSubmit} {\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"...\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"props} /\u003e\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" }\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"return\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \u003c\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"form\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"...\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"props} /\u003e\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"}\"}]}]]}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Learn more about the \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/components/form\",\"children\":[[\"$\",\"code\",null,{\"children\":\"\u003cForm\u003e\"}],\" Component\"]}],\".\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"support-for-nextconfigts\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#support-for-nextconfigts\",\"children\":[\"Support for \",[\"$\",\"code\",null,{\"children\":\"next.config.ts\"}],[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Next.js now supports the TypeScript \",[\"$\",\"code\",null,{\"children\":\"next.config.ts\"}],\" file type and provides a \",[\"$\",\"code\",null,{\"children\":\"NextConfig\"}],\" type for autocomplete and type-safe options:\"]}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"next.config.ts\",\"language\":\"ts\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"import\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"type\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" { NextConfig } \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"from\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'next'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\";\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"nextConfig\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"NextConfig\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"/* config options here */\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"};\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"default\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" nextConfig;\"}]]}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Learn more about \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/configuring/typescript#type-checking-nextconfigts\",\"children\":\"TypeScript support\"}],\" in Next.js.\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"improvements-for-self-hosting\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#improvements-for-self-hosting\",\"children\":[\"Improvements for self-hosting\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"When self-hosting applications, you may need more control over \",[\"$\",\"code\",null,{\"children\":\"Cache-Control\"}],\" directives.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"One common case is controlling the \",[\"$\",\"code\",null,{\"children\":\"stale-while-revalidate\"}],\" period sent for ISR pages. We've implemented two improvements:\"]}],\"\\n\",[\"$\",\"ol\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":[\"You can now configure the \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/next-config-js/expireTime\",\"children\":[\"$\",\"code\",null,{\"children\":\"expireTime\"}]}],\" value in \",[\"$\",\"code\",null,{\"children\":\"next.config\"}],\". This was previously the \",[\"$\",\"code\",null,{\"children\":\"experimental.swrDelta\"}],\" option.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[\"Updated the default value to one year, ensuring most CDNs can fully apply the \",[\"$\",\"code\",null,{\"children\":\"stale-while-revalidate\"}],\" semantics as intended.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"We also no longer override custom \",[\"$\",\"code\",null,{\"children\":\"Cache-Control\"}],\" values with our default values, allowing full control and ensuring compatibility with any CDN setup.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Finally, we've improved image optimization when self-hosting. Previously, we recommended you install \",[\"$\",\"code\",null,{\"children\":\"sharp\"}],\" for optimizing images on your Next.js server. This recommendation was sometimes missed. With Next.js 15, you no longer need to manually install \",[\"$\",\"code\",null,{\"children\":\"sharp\"}],\" — Next.js will use \",[\"$\",\"code\",null,{\"children\":\"sharp\"}],\" automatically when using \",[\"$\",\"code\",null,{\"children\":\"next start\"}],\" or running with \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/next-config-js/output\",\"children\":\"standalone output mode\"}],\".\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"To learn more, see our new \",[\"$\",\"a\",null,{\"href\":\"https://x.com/leeerob/status/1843796169173995544\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"demo and tutorial video\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\" on self-hosting Next.js.\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"enhanced-security-for-server-actions\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#enhanced-security-for-server-actions\",\"children\":[\"Enhanced Security for Server Actions\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[[\"$\",\"a\",null,{\"href\":\"https://react.dev/reference/rsc/server-actions\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Server Actions\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\" are server-side functions that can be called from the client. They are defined by adding the \",[\"$\",\"code\",null,{\"children\":\"'use server'\"}],\" directive at the top of a file and exporting an async function.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Even if a Server Action or utility function is not imported elsewhere in your code, it's still a publicly accessible HTTP endpoint. While this behavior is technically correct, it can lead to unintentional exposure of such functions.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"To improve security, we've introduced the following enhancements:\"}],\"\\n\",[\"$\",\"ul\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Dead code elimination:\"}],\" Unused Server Actions won't have their IDs exposed to the client-side JavaScript bundle, reducing bundle size and improving performance.\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"Secure action IDs:\"}],\" Next.js now creates unguessable, non-deterministic IDs to allow the client to reference and call the Server Action. These IDs are periodically recalculated between builds for enhanced security.\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"$undefined\",\"language\":\"jsx\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// app/actions.js\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'use server'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\";\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// This action **is** used in our application, so Next.js\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// will create a secure ID to allow the client to reference\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// and call the Server Action.\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"async\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"function\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"updateUserAction\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(formData) {}\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// This action **is not** used in our application, so Next.js\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// will automatically remove this code during `next build`\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// and will not create a public endpoint.\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"async\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"function\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-function)\"},\"children\":\"deleteUserAction\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"(formData) {}\"}]]}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"You should still treat Server Actions as public HTTP endpoints. Learn more about \",[\"$\",\"$L27\",null,{\"href\":\"/blog/security-nextjs-server-components-actions#write\",\"children\":\"securing Server Actions\"}],\".\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"optimizing-bundling-of-external-packages-stable\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#optimizing-bundling-of-external-packages-stable\",\"children\":[\"Optimizing bundling of external packages (Stable)\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Bundling external packages can improve the cold start performance of your application. In the \",[\"$\",\"strong\",null,{\"children\":\"App Router\"}],\", external packages are bundled by default, and you can opt-out specific packages using the new \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/next-config-js/serverExternalPackages\",\"children\":[\"$\",\"code\",null,{\"children\":\"serverExternalPackages\"}]}],\" config option.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"In the \",[\"$\",\"strong\",null,{\"children\":\"Pages Router\"}],\", external packages are not bundled by default, but you can provide a list of packages to bundle using the existing \",[\"$\",\"$L27\",null,{\"href\":\"/docs/pages/api-reference/next-config-js/transpilePackages\",\"children\":[\"$\",\"code\",null,{\"children\":\"transpilePackages\"}]}],\" option. With this configuration option, you need to specify each package.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"To unify configuration between App and Pages Router, we're introducing a new option, \",[\"$\",\"$L27\",null,{\"href\":\"/docs/pages/api-reference/next-config-js/bundlePagesRouterDependencies\",\"children\":[\"$\",\"code\",null,{\"children\":\"bundlePagesRouterDependencies\"}]}],\" to match the default automatic bundling of the App Router. You can then use \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/next-config-js/serverExternalPackages\",\"children\":[\"$\",\"code\",null,{\"children\":\"serverExternalPackages\"}]}],\" to opt-out specific packages, if needed.\"]}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"next.config.ts\",\"language\":\"ts\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"nextConfig\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// Automatically bundle external packages in the Pages Router:\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" bundlePagesRouterDependencies\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"true\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// Opt specific packages out of bundling for both App and Pages Router:\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" serverExternalPackages\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" [\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-string-expression)\"},\"children\":\"'package-name'\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"]\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"};\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"default\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" nextConfig;\"}]]}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Learn more about \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/optimizing/package-bundling\",\"children\":\"optimizing external packages\"}],\".\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"eslint-9-support\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#eslint-9-support\",\"children\":[\"ESLint 9 Support\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Next.js 15 also introduces support for \",[\"$\",\"a\",null,{\"href\":\"https://eslint.org/blog/2024/04/eslint-v9.0.0-released\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"ESLint 9\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", following the end-of-life for ESLint 8 on October 5, 2024.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"To ensure a smooth transition, Next.js remain backwards compatible, meaning you can continue using either ESLint 8 or 9.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"If you upgrade to ESLint 9, and we detect that you haven't yet adopted \",[\"$\",\"a\",null,{\"href\":\"https://eslint.org/blog/2024/04/eslint-v9.0.0-released/#flat-config-is-now-the-default-and-has-some-changes\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"the new config format\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", Next.js will automatically apply the \",[\"$\",\"code\",null,{\"children\":\"ESLINT_USE_FLAT_CONFIG=false\"}],\" escape hatch to ease migration.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Additionally, deprecated options like \",[\"$\",\"code\",null,{\"children\":\"—ext\"}],\" and \",[\"$\",\"code\",null,{\"children\":\"—ignore-path\"}],\" will be removed when running \",[\"$\",\"code\",null,{\"children\":\"next lint\"}],\". Please note that ESLint will eventually disallow these older configurations in ESLint 10, so we recommend starting your migration soon.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"For more details on these changes, check out the \",[\"$\",\"a\",null,{\"href\":\"https://eslint.org/docs/latest/use/migrate-to-9.0.0\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"migration guide\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\".\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"As part of this update, we've also upgraded \",[\"$\",\"code\",null,{\"children\":\"eslint-plugin-react-hooks\"}],\" to \",[\"$\",\"code\",null,{\"children\":\"v5.0.0\"}],\", which introduces new rules for React Hooks usage. You can review all changes in the \",[\"$\",\"a\",null,{\"href\":\"https://github.com/facebook/react/releases/tag/eslint-plugin-react-hooks%405.0.0\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"changelog for eslint-plugin-react-hooks@5.0.0\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\".\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"development-and-build-improvements\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#development-and-build-improvements\",\"children\":[\"Development and Build Improvements\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"h3\",null,{\"id\":\"server-components-hmr\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#server-components-hmr\",\"children\":[\"Server Components HMR\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"During development, Server components are re-executed when saved. This means, any \",[\"$\",\"code\",null,{\"children\":\"fetch\"}],\" requests to your API endpoints or third-party services are also called.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"To improve local development performance and reduce potential costs for billed API calls, we now ensure Hot Module Replacement (HMR) can re-use \",[\"$\",\"code\",null,{\"children\":\"fetch\"}],\" responses from previous renders.\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Learn more about the \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/next-config-js/serverComponentsHmrCache\",\"children\":\"Server Components HMR Cache\"}],\".\"]}],\"\\n\",[\"$\",\"h3\",null,{\"id\":\"faster-static-generation-for-the-app-router\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#faster-static-generation-for-the-app-router\",\"children\":[\"Faster Static Generation for the App Router\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"We've optimized static generation to improve build times, especially for pages with slow network requests.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Previously, our static optimization process rendered pages twice—once to generate data for client-side navigation and a second time to render the HTML for the initial page visit. Now, we reuse the first render, cutting out the second pass, reducing workload and build times.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Additionally, static generation workers now share the \",[\"$\",\"code\",null,{\"children\":\"fetch\"}],\" cache across pages. If a \",[\"$\",\"code\",null,{\"children\":\"fetch\"}],\" call doesn't opt out of caching, its results are reused by other pages handled by the same worker. This reduces the number of requests for the same data.\"]}],\"\\n\",[\"$\",\"h3\",null,{\"id\":\"advanced-static-generation-control-experimental\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#advanced-static-generation-control-experimental\",\"children\":[\"Advanced Static Generation Control (Experimental)\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"We've added experimental support for more control over the static generation process for advanced use cases that would benefit from greater control.\"}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"We recommend sticking to the current defaults unless you have specific requirements as these options can lead to increased resource usage and potential out-of-memory errors due to increased concurrency.\"}],\"\\n\",[\"$\",\"$L28\",null,{\"filename\":\"next.config.ts\",\"language\":\"ts\",\"switcher\":\"$undefined\",\"children\":[[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"const\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"nextConfig\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"=\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" experimental\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" {\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// how many times Next.js will retry failed page generation attempts\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// before failing the build\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" staticGenerationRetryCount\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\":\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"1\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// how many pages will be processed per worker\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" staticGenerationMaxConcurrency: \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"8\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-comment)\"},\"children\":\"// the minimum number of pages before spinning up a new export worker\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" staticGenerationMinPagesPerWorker: \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-constant)\"},\"children\":\"25\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" }\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-punctuation)\"},\"children\":\",\"}]]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\"}\"}]}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":\" \"}],\"\\n\",[\"$\",\"span\",null,{\"className\":\"line\",\"children\":[[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"export\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" \"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-token-keyword)\"},\"children\":\"default\"}],[\"$\",\"span\",null,{\"style\":{\"color\":\"var(--shiki-color-text)\"},\"children\":\" nextConfig;\"}]]}]]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"Learn more about the \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/api-reference/next-config-js/staticGeneration\",\"children\":\"Static Generation options\"}],\".\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"other-changes\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#other-changes\",\"children\":[\"Other Changes\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"ul\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" next/image: Removed \",[\"$\",\"code\",null,{\"children\":\"squoosh\"}],\" in favor of \",[\"$\",\"code\",null,{\"children\":\"sharp\"}],\" as an optional dependency (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/63321\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" next/image: Changed default \",[\"$\",\"code\",null,{\"children\":\"Content-Disposition\"}],\" to \",[\"$\",\"code\",null,{\"children\":\"attachment\"}],\" (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65631\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" next/image: Error when \",[\"$\",\"code\",null,{\"children\":\"src\"}],\" has leading or trailing spaces (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65637\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" Middleware: Apply \",[\"$\",\"code\",null,{\"children\":\"react-server\"}],\" condition to limit unrecommended React API imports (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65424\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" next/font: Removed support for external \",[\"$\",\"code\",null,{\"children\":\"@next/font\"}],\" package (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65601\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" next/font: Removed \",[\"$\",\"code\",null,{\"children\":\"font-family\"}],\" hashing (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/53608\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" Caching: \",[\"$\",\"code\",null,{\"children\":\"force-dynamic\"}],\" will now set a \",[\"$\",\"code\",null,{\"children\":\"no-store\"}],\" default to the fetch cache (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/64145\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" Config: Enable \",[\"$\",\"code\",null,{\"children\":\"swcMinify\"}],\" (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65579\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\"), \",[\"$\",\"code\",null,{\"children\":\"missingSuspenseWithCSRBailout\"}],\" (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65688\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\"), and \",[\"$\",\"code\",null,{\"children\":\"outputFileTracing\"}],\" (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65579\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\") behavior by default and remove deprecated options\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" Remove auto-instrumentation for Speed Insights (must now use the dedicated \",[\"$\",\"a\",null,{\"href\":\"https://www.npmjs.com/package/@vercel/speed-insights\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"@vercel/speed-insights\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\" package) (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/64199\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" Remove \",[\"$\",\"code\",null,{\"children\":\".xml\"}],\" extension for dynamic sitemap routes and align sitemap URLs between development and production (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65507\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" We've deprecated exporting \",[\"$\",\"code\",null,{\"children\":\"export const runtime = \\\"experimental-edge\\\"\"}],\" in the App Router. Users should now switch to \",[\"$\",\"code\",null,{\"children\":\"export const runtime = \\\"edge\\\"\"}],\". We've added a \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/upgrading/codemods#app-dir-runtime-config-experimental-edge\",\"children\":\"codemod\"}],\" to perform this (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/70480\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" Calling \",[\"$\",\"code\",null,{\"children\":\"revalidateTag\"}],\" and \",[\"$\",\"code\",null,{\"children\":\"revalidatePath\"}],\" during render will now throw an error (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/71093\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" The \",[\"$\",\"code\",null,{\"children\":\"instrumentation.js\"}],\" and \",[\"$\",\"code\",null,{\"children\":\"middleware.js\"}],\" files will now use the vendored React packages (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/69619\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" The minimum required Node.js version has been updated to 18.18.0 (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/67274\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" \",[\"$\",\"code\",null,{\"children\":\"next/dynamic\"}],\": the deprecated \",[\"$\",\"code\",null,{\"children\":\"suspense\"}],\" prop has been removed and when the component is used in the App Router, it won't insert an empty Suspense boundary anymore (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/67014\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" When resolving modules on the Edge Runtime, the \",[\"$\",\"code\",null,{\"children\":\"worker\"}],\" module condition will not be applied (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/66808\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Breaking]\"}],\" Disallow using \",[\"$\",\"code\",null,{\"children\":\"ssr: false\"}],\" option with \",[\"$\",\"code\",null,{\"children\":\"next/dynamic\"}],\" in Server Components (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/70378\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Metadata: Updated environment variable fallbacks for \",[\"$\",\"code\",null,{\"children\":\"metadataBase\"}],\" when hosted on Vercel (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65089\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Fix tree-shaking with mixed namespace and named imports from \",[\"$\",\"code\",null,{\"children\":\"optimizePackageImports\"}],\" (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/64894\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Parallel Routes: Provide unmatched catch-all routes with all known params (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65063\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Config \",[\"$\",\"code\",null,{\"children\":\"bundlePagesExternals\"}],\" is now stable and renamed to \",[\"$\",\"code\",null,{\"children\":\"bundlePagesRouterDependencies\"}]]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Config \",[\"$\",\"code\",null,{\"children\":\"serverComponentsExternalPackages\"}],\" is now stable and renamed to \",[\"$\",\"code\",null,{\"children\":\"serverExternalPackages\"}]]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" create-next-app: New projects ignore all \",[\"$\",\"code\",null,{\"children\":\".env\"}],\" files by default (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/61920\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" The \",[\"$\",\"code\",null,{\"children\":\"outputFileTracingRoot\"}],\", \",[\"$\",\"code\",null,{\"children\":\"outputFileTracingIncludes\"}],\" and \",[\"$\",\"code\",null,{\"children\":\"outputFileTracingExcludes\"}],\" have been upgraded from experimental and are now stable (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/68464\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Avoid merging global CSS files with CSS module files deeper in the tree (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/67373\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" The cache handler can be specified via the \",[\"$\",\"code\",null,{\"children\":\"NEXT_CACHE_HANDLER_PATH\"}],\" environment variable (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/70537/\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" The Pages Router now supports both React 18 and React 19 (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/69484\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" The Error Overlay now displays a button to copy the Node.js Inspector URL if the inspector is enabled (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/69357\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Client prefetches on the App Router now use the \",[\"$\",\"code\",null,{\"children\":\"priority\"}],\" attribute (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/67356\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Next.js now provides an \",[\"$\",\"code\",null,{\"children\":\"unstable_rethrow\"}],\" function to rethrow Next.js internal errors in the App Router (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65831\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" \",[\"$\",\"code\",null,{\"children\":\"unstable_after\"}],\" can now be used in static pages (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/71231\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" If a \",[\"$\",\"code\",null,{\"children\":\"next/dynamic\"}],\" component is used during SSR, the chunk will be prefetched (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65486\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" The \",[\"$\",\"code\",null,{\"children\":\"esmExternals\"}],\" option is now supported on the App Router (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65041\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" The \",[\"$\",\"code\",null,{\"children\":\"experimental.allowDevelopmentBuild\"}],\" option can be used to allow \",[\"$\",\"code\",null,{\"children\":\"NODE_ENV=development\"}],\" with \",[\"$\",\"code\",null,{\"children\":\"next build\"}],\" for debugging purposes (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/65463\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" The Server Action transforms are now disabled in the Pages Router (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/71028\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Build workers will now stop the build from hanging when they exit (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/70997\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" When redirecting from a Server Action, revalidations will now apply correctly (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/70715\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Dynamic params are now handled correctly for parallel routes on the Edge Runtime (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/70667\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Static pages will now respect staleTime after initial load (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/70640\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" \",[\"$\",\"code\",null,{\"children\":\"vercel/og\"}],\" updated with a memory leak fix (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/70214\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Patch timings updated to allow usage of packages like \",[\"$\",\"code\",null,{\"children\":\"msw\"}],\" for APIs mocking (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/68193\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[[\"$\",\"strong\",null,{\"children\":\"[Improvement]\"}],\" Prerendered pages should use static staleTime (\",[\"$\",\"a\",null,{\"href\":\"https://github.com/vercel/next.js/pull/67868\",\"rel\":\"noopener noreferrer\",\"target\":\"_blank\",\"children\":[\"PR\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\")\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":[\"To learn more, check out the \",[\"$\",\"$L27\",null,{\"href\":\"/docs/app/building-your-application/upgrading/version-15\",\"children\":\"upgrade guide\"}],\".\"]}],\"\\n\",[\"$\",\"h2\",null,{\"id\":\"contributors\",\"data-docs-heading\":\"\",\"children\":[\"$\",\"a\",null,{\"href\":\"#contributors\",\"children\":[\"Contributors\",[\"$\",\"span\",null,{\"children\":[\"$\",\"svg\",null,{\"viewBox\":\"0 0 16 16\",\"height\":\"0.7em\",\"width\":\"0.7em\",\"children\":[\"\\n \",[\"$\",\"g\",null,{\"strokeWidth\":\"1.2\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"children\":[\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M8.995,7.005 L8.995,7.005c1.374,1.374,1.374,3.601,0,4.975l-1.99,1.99c-1.374,1.374-3.601,1.374-4.975,0l0,0c-1.374-1.374-1.374-3.601,0-4.975 l1.748-1.698\"}],\"\\n \",[\"$\",\"path\",null,{\"fill\":\"none\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeMiterlimit\":\"10\",\"d\":\"M7.005,8.995 L7.005,8.995c-1.374-1.374-1.374-3.601,0-4.975l1.99-1.99c1.374-1.374,3.601-1.374,4.975,0l0,0c1.374,1.374,1.374,3.601,0,4.975 l-1.748,1.698\"}],\"\\n \"]}],\"\\n\"]}]}]]}]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"Next.js is the result of the combined work of over 3,000 individual developers, industry partners like Google and Meta, and our core team at Vercel.\\nThis release was brought to you by:\"}],\"\\n\",[\"$\",\"ul\",null,{\"children\":[\"\\n\",[\"$\",\"li\",null,{\"children\":[\"The \",[\"$\",\"strong\",null,{\"children\":\"Next.js\"}],\" team: \",[\"$\",\"a\",null,{\"href\":\"https://github.com/acdlite\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Andrew\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/unstubbable\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Hendrik\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/lubieowoce\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Janka\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/huozhi\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Jiachi\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/feedthejim\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Jimmy\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/devjiwonchoi\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Jiwon\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/ijjk\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"JJ\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/gnoff\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Josh\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/samcx\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Sam\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/sebmarkbage\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Sebastian\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/eps1lon\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Sebbie\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/shuding\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Shu\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/wyattjoh\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Wyatt\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", and \",[\"$\",\"a\",null,{\"href\":\"https://github.com/ztanner\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Zack\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\".\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[\"The \",[\"$\",\"strong\",null,{\"children\":\"Turbopack\"}],\" team: \",[\"$\",\"a\",null,{\"href\":\"https://github.com/arlyon\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Alex\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/bgw\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Benjamin\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/kdy1\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Donny\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/padmaia\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Maia\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/mischnic\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Niklas\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/timneutkens\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Tim\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/sokra\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Tobias\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", and \",[\"$\",\"a\",null,{\"href\":\"https://github.com/wbinnssmith\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Will\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\".\"]}],\"\\n\",[\"$\",\"li\",null,{\"children\":[\"The \",[\"$\",\"strong\",null,{\"children\":\"Next.js Docs\"}],\" team: \",[\"$\",\"a\",null,{\"href\":\"https://github.com/delbaoliveira\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Delba\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/molebox\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Rich\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", \",[\"$\",\"a\",null,{\"href\":\"https://github.com/ismaelrumzan\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Ismael\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\", and \",[\"$\",\"a\",null,{\"href\":\"https://github.com/leerob\",\"rel\":\"noopener noreferrer nofollow\",\"target\":\"_blank\",\"children\":[\"Lee\",[\"$\",\"span\",null,{\"className\":\"inline-flex\",\"children\":[\"$\",\"svg\",null,{\"className\":\"with-icon_icon__MHUeb\",\"data-testid\":\"geist-icon\",\"fill\":\"none\",\"height\":24,\"shapeRendering\":\"geometricPrecision\",\"stroke\":\"currentColor\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":1.5,\"viewBox\":\"0 0 24 24\",\"width\":24,\"dangerouslySetInnerHTML\":{\"__html\":\"\u003cpath d=\\\"M7 17L17 7\\\"/\u003e\u003cpath d=\\\"M7 7h10v10\\\"/\u003e\"},\"style\":{\"color\":\"currentColor\",\"verticalAlign\":\"$undefined\",\"width\":14,\"height\":14}}]}]]}],\".\"]}],\"\\n\"]}],\"\\n\",[\"$\",\"p\",null,{\"children\":\"$2a\"}]]}]]}]\n"])</script><script>self.__next_f.push([1,"25:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"23:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"1\",{\"children\":\"Next.js 15 | Next.js\"}],[\"$\",\"meta\",\"2\",{\"name\":\"description\",\"content\":\"Next.js 15 introduces React 19 support, caching improvements, a stable release for Turbopack in development, new APIs, and more.\"}],[\"$\",\"link\",\"3\",{\"rel\":\"canonical\",\"href\":\"https://nextjs.org/blog/next-15\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:title\",\"content\":\"Next.js 15\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:description\",\"content\":\"Next.js 15 introduces React 19 support, caching improvements, a stable release for Turbopack in development, new APIs, and more.\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:url\",\"content\":\"https://nextjs.org/blog/next-15\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:image\",\"content\":\"https://nextjs.org/static/blog/next-15/twitter-card.png\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"$\",\"meta\",\"9\",{\"property\":\"article:published_time\",\"content\":\"2024-10-21T17:00:00.507Z\"}],[\"$\",\"meta\",\"10\",{\"property\":\"article:author\",\"content\":\"Delba de Oliveira\"}],[\"$\",\"meta\",\"11\",{\"property\":\"article:author\",\"content\":\"Jimmy Lai\"}],[\"$\",\"meta\",\"12\",{\"property\":\"article:author\",\"content\":\"Rich Haines\"}],[\"$\",\"meta\",\"13\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"14\",{\"name\":\"twitter:title\",\"content\":\"Next.js 15\"}],[\"$\",\"meta\",\"15\",{\"name\":\"twitter:description\",\"content\":\"Next.js 15 introduces React 19 support, caching improvements, a stable release for Turbopack in development, new APIs, and more.\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:image\",\"content\":\"https://nextjs.org/static/blog/next-15/twitter-card.png\"}],[\"$\",\"link\",\"17\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\",\"sizes\":\"48x48\"}]]\n"])</script><script>self.__next_f.push([1,"21:null\n"])</script></body></html>