Next.js v15.3.0stable Released Apr 09, 2025
Impact Score: 5/10

Next.js v15.3.0 โ€” Release Notes & Engineering Impact

Source available โ€” automated, not human-reviewed

Component: nextjs ยท Channel: stable. Automated analysis, not a compatibility certification. How this works.

Analysis updated: 2026-11-02.

Compatibility not verified โ€” check source notes
$ npm install --save-exact [email protected]
๐Ÿ“„ .MD
โšก Executive Summary (TL;DR)

Next.js v15.3.0. Source highlight: [dev-overlay] Customize `<select>` styling for consistency: #76973

Who Does This Impact? (Role-Based Analysis)

๐Ÿ’ป Software Engineers & Devs

Check the source notes against the package and APIs you use before upgrading.

๐Ÿ“Š Product & Engineering Leads

Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.

โš™๏ธ DevOps & Security

Verify the target version, runtime requirements and rollback procedure in the official documentation.

โœจ New Features & Capabilities (6)

  • [metadata]: add pinterest meta tag: #76988
  • [dev-overlay] Add `size` setting to preferences: #77027
  • Add config for only generating static env: #77038
  • Add dev warning for cross-origin and stabilize allowedDevOrigins: #77044
  • Add experimental build mode flag for env: #77089
  • (feat) support client-side instrumentation: #76916

โšก Performance & Enhancements (4)

  • Slightly improve error handling for unknown server actions: #77135
  • [perf] skip loading client manifest for static metadata routes: #77260
  • [logging] improve logging of port retry: #77868
  • perf(turbopack): Merge nodes with same starting point: #76938

๐Ÿ”ง Bug Fixes & Patches (6)

  • Fix JSDoc comment for `'seconds'` cache life profile: #77084
  • Fix output standalone for alternative bundler: #76971
  • [dev-overlay] Fix stacking order of highlighted line: #77189
  • fix(styled-jsx): Pass `useLightningcss` option to `styled-jsx` correctly: #77008
  • chore(HMR clients): Fix a bunch of typescript errors by including the appropriate webpack type declarations: #77207
  • fix: pass telemetry plugin rspack tests: #77257
๐Ÿ“„ View Raw Release Notes (Original Developer Log)
### Core Changes - [dev-overlay] Customize `<select>` styling for consistency: #76973 - Upgrade React from `029e8bd6-20250306` to `0ca3deeb-20250311`: #76989 - [metadata]: add pinterest meta tag: #76988 - [dev-overlay] ensure stripping overlay bundle in prod build: #76976 - Apply env inlining during generate build mode: #76990 - Turbopack: Implement deploymentId: #76904 - track persistent caching usage: #76996 - [metadata] re-insert icons to head for streamed metadata: #76915 - Upgrade React from `0ca3deeb-20250311` to `6aa8254b-20250312`: #77033 - Move static-env imports: #77035 - [dev-overlay] Add `size` setting to preferences: #77027 - Add config for only generating static env: #77038 - chore(HMR clients): Clean up and share code between app and pages router: #76960 - Add dev warning for cross-origin and stabilize allowedDevOrigins: #77044 - unify allowed origin detection handling: #77053 - Handle hash change in all files for static env: #77058 - [dev-overlay] highlight errored code line for runtime errors: #77078 - NFT: Ignore all of Webpack: #77081 - Add experimental build mode flag for env: #77089 - (feat) support client-side instrumentation: #76916 - Fix JSDoc comment for `'seconds'` cache life profile: #77084 - refactor(HMR clients): Encapsulate some of the turbopack state tracking into a shared TurbopackHmr class: #76994 - Slightly improve error handling for unknown server actions: #77135 - Fix output standalone for alternative bundler: #76971 - Add alternate bundler plugin information to `next info`: #77059 - [metadata] remove the default segement check for metadata rendering: #77119 - [dev-overlay] Fix stacking order of highlighted line: #77189 - Upgrade React from `6aa8254b-20250312` to `5398b711-20250314`: #77129 - fix(styled-jsx): Pass `useLightningcss` option to `styled-jsx` correctly: #77008 - log the instrumentation-client execution time: #77121 - Turbopack: canary-gate production builds: #77146 - [dev-overlay] remove special handling for missing tag error : #77147 - chore(react-dev-overlay): Remove confusingly underscored variables in `useErrorOverlayReducer`: #77205 - Update middleware request header: #77201 - Update default allowed origins list: #77212 - Ensure deploymentId is used for CSS preloads: #77210 - chore(HMR clients): Fix a bunch of typescript errors by including the appropriate webpack type declarations: #77207 - Update cache handler interface: #76687 - Turbopack: don't include AMP optimizer in NFT: #77242 - Server actions should not read stale data after calling `revalidate*`: #76885 - [dev-overlay] Blur fader for scrollable container: #77196 - Make `revalidate*` work when followed by a redirect in a route handler: #77090 - feat: onNavigate for link: #77209 - fix: pass telemetry plugin rspack tests: #77257 - feat(eslint-plugin): add minimal built-in flat presets: #73873 - [perf] skip loading client manifest for static metadata routes: #77260 - Upgrade React from `5398b711-20250314` to `c69a5fc5-20250318`: #77249 - [ppr] Handle failed resume data cache entries: #77258 - Bypass `"use cache"` caches when Draft Mode is enabled: #77141 - chore(HMR clients): Clean up tryApplyUpdates, reduce differences between app/pages versions: #77219 - Upgrade React from `c69a5fc5-20250318` to `db7dfe05-20250319`: #77295 - Turbopack: layout segment optimization for Pages: #74815 - [dev-overlay] Make footer sticky without side effects: #77327 - Alternate bundler: show state in app info message: #77259 - Revert "Turbopack: layout segment optimization for Pages": #77339 - [metadata] add Yeti to html limited bots: #77335 - [dev-overlay] Remove unused code from pages: #77325 - [metadata] remove dead code of metadata routes handling: #77336 - Alternate bundler: pass more tests and update to 1.3.0-beta: #77269 - [metadata] fix the metadata route like pages and refactor utils: #77264 - fix: absolute assetPrefix url with path: #77256 - clean up useReducer code re dev indicator: #77354 - test: ensure that router identity stays stable when navigating: #77356 - [dev-overlay] Remove unused fields from hydration error state: #77332 - Turbopack: implement optimized css production chunking: #77284 - only log when instrumentation client takes too long: #77378 - switch development origin verification to be opt-in rather than opt-out: #77395 - remove direct ip/port bypass in dev origin check: #77414 - ensure /__next middleware URLs are included in the origin check: #77416 - exclude images and static media from dev origin check: #77417 - Refactor metadata and viewport preloading: #77400 - [dev-overlay] Remove unused fields from unhandled error action event: #77333 - Turbopack: Add --turbopack for next start: #77442 - Update README: #77464 - Remove unnecessary indirections around dispatch-related methods: #77423 - Lift public router instance to module level : #77426 - directly import param resolver in metadata: #77401 - [metadata] always serve streaming metadata in build: #77437 - directly import search param resolver in metadata: #77402 - Remove forwardRef from Link in App Router: #77471 - Match subrequest handling for edge and node: #77474 - Add deprecation warning for legacyBehavior prop: #77473 - feat: useLinkStatus: #77300 - [dynamicIO] Avoid memory leak warning for hanging promises: #77480 - [dev-overlay] Remove "Unhandled Runtime Error" label: #77484 - Upgrade React from `db7dfe05-20250319` to `740a4f7a-20250325`: #77507 - Upgrade React from `740a4f7a-20250325` to `313332d1-20250326`: #77527 - Do not call `expireTags`/`getExpiration` unnecessarily: #77570 - fix(jest): stricter regex for 'server-only' in default config: #77588 - Fix: RESTORE_ACTION should not be thenable: #77582 - Use `NEXT_PRIVATE_DEBUG_CACHE` env variable for cache handler debug logs: #77585 - fix: make sure body can be read using `nodejs` runtime in middleware: #77553 - Update alternate bundler and pass more tests : #77579 - Refactor build scripts and rewrite pack-next in TypeScript: #77536 - fix isCsrfOriginAllowed handling for localhost: #77594 - Turbopack build: fix deterministic build test: #77618 - Turbopack build: Fix urlencoding test: #77622 - [og] fix vercel og build issue on windows: #77650 - [Segment Cache] Add "client-only" option: #77655 - Remove useSyncExternalStore from useIsDevRendering: #77651 - Track navigation timestamp on CacheNode: #77251 - Upgrade @playwright/test and cleanup internal APIs: #77659 - Refactor: move `"use cache"` revalidation logic out of incremental cache: #77577 - Remove obsolete update of implicit tags expiration after server action: #77595 - Revert "Remove useSyncExternalStore from useIsDevRendering (#77651)": #77672 - Upgrade React from `313332d1-20250326` to `63779030-20250328`: #77643 - Turbopack build: Add marker for when a build used Turbopack: #77674 - feat(images): use experimental `isrFlushToDisk` option to prevent writing optimized images to cache: #70645 - doc: instrumentation-client: #77649 - Alternate bundler: use equivalent native plugins for built-in plugins: #77355 - Resolve Viewport separately from Metadata: #77427 - fix(turbopack): Suppress logging for short no-op turbopack HMRs: #76924 - Turbopack build: Fix node-file-trace test: #77641 - Turbopack build: Implement error when using next start without --turbopack: #77678 - legacyBehavior deprecation error should only trigger once: #77687 - Pass only required props to NonIndex: #77685 - Revert "fix: make sure body can be read using `nodejs` runtime in middleware": #77690 - [dev-overlay] Harden types when handling hydration mismatches: #77334 - [dev-overlay] Fix ref warning when Pages Router with React 18 is used: #77726 - add support for cssmodules-pure-no-check to allow global CSS features like View Transitions: #77321 - [dev-overlay] Only warn once per invalid sourcemap: #77444 - [dynamicIO] only abort once per prerender: #77747 - Turbopack build: Move Turbopack marker to SERVER_FILES_MANIFEST: #77711 - Reapply "Turbopack: layout segment optimization for Pages" (#77339): #77696 - feat(next/image): support `new URL()` for `images.remotePatterns`: #77692 - [dev-overlay] remove text wrap for terminal: #76953 - Upgrade React from `63779030-20250328` to `040f8286-20250402`: #77742 - Optimize server runtime bundles: #77723 - Turbopack Build: Remove cases of process.env.TURBOPACK: #77757 - [dev-overlay] Fix unactionable `useLayoutEffect` warning if React 18 is used: #77737 - [dev-tools] Fix flashing of disabled state on indicator: #77727 - Webpack build: Add compiled in x seconds in missing places: #77751 - Ignore an existing HMR refresh hash cookie with `next start`: #77714 - Turbopack build: Replace process.env.TURBOPACK usage: #77783 - Client instrumentation: onRouterTransitionStart: #77791 - Turbopack: log telemetry events when `TurbopackInternalError`s occur: #77660 - Rename alternate bundler package name: #77793 - Turbopack: fix `sideEffects` matching for non-relative globs: #77693 - Revert "Upgrade @playwright/test and cleanup internal APIs": #77814 - [next-ts-plugin] fix: language service crashes / metadata plugin not working: #77213 - [dev-overlay] always display bundler name on version info: #77739 - [dev-overlay] sync horizontal scrollbar style: #77769 - [dev-overlay] Read `issueCount` from non-async `errors` array: #77821 - [dev-overlay] Fix error dialog resizing logic: #77830 - Turbopack Build: Optimize instrumentation hook generation: #77832 - [next-server] skip setting vary header for basic routes: #77797 - Lazily call `refreshTags` and `getExpiration`: #77779 - Add debug logging to default cache handler and `"use cache"` wrapper: #77827 - [ts-next-plugin] fix: properly exit when failed to initialize: #77842 - Alternate bundler: correctly inject react refresh loader: #77713 - [dynamicIO] Fix dev warmup: #77829 - fix: don't reset the prefetch segment data routes on loop: #77845 - Ensure `searchParams` access in `"use cache"` triggers error when caught: #77838 - Revert "[dev-overlay] Fix error dialog resizing logic": #77849 - fix: add cache tags to segment prefetch responses: #77846 - Avoid microtaskiness when lazily fetching from cache handlers: #77843 - [Experiment] <Link unstable_dynamicOnHover>: #77866 - [dev-overlay] disable font ligatures: #77865 - Enable process.env.TURBOPACK when process.env.IS_TURBOPACK_TEST is set: #77894 - [ts-next-plugin] fix: use `getSourceFile` instead of `fileExists` to check file existence: #77863 - fix: only set request phase to "action" when actually running an action: #76993 - Alternate bundler: fix react refresh and adjust sourcemap: #77875 - Upgrade React from `040f8286-20250402` to `33661467-20250407`: #77899 - refactor: rename isAction to isPossibleServerAction: #77011 - [logging] improve logging of port retry: #77868 - Remove canary-gate and add experimental warning for alternate bundler: #77806 - fix(next/image): bump [email protected]: #77839 - Turbopack builds: Remove canary-gate and add experimental warning: #77808 - feat: Disable char frequency analysis for mangler: #77887 - Set Turbopack env var for internal modules: #77902 - Don't externalize various new `next/*` entrypoints: #77844 - Revert "Fix: RESTORE_ACTION should not be thenable": #77909 - Fix resolve alternate bundler in monorepo: #77913 - Output server.mjs for standalone with type: module: #77944 ### Example Changes - with-polyfills example: only link to specific browsers: #77211 - Add example for alternate bundler: #77057 - chore(examples): remove examples that can be v0'd: #77349 - Alternate bundler example: use `canary` version: #77754 - Fix Wasm example: #77924 ### Misc Changes - [test] consolidate hmr test for react 18.3: #76975 - docs: update API example: #76987 - docs: add Pinterest Rich Pins metadata example: #77025 - fix(CI): Correctly call test/update-bundler-manifest.js script: #77000 - Update bundler development test manifest: #77040 - Update bundler production test manifest: #77043 - Update Turbopack development test manifest: #77041 - chore(github): remove /examples from contribution guidelines, remove examples issue template: #77050 - Turbopack: when reading a non yet existing cell from a in progress tasks, wait for the computation to finish: #77029 - Turbopack: wait before reading cells when the task is scheduled: #77031 - Turbopack: don't call individual() again: #77048 - Turbopack: create module graph strongly consistent: #77051 - Turbopack: Vc stability of ModuleGraph: #77052 - Turbopack: fix corrected time calcuation for trace server: #77080 - Turbopack: fewer manifests for static metadata: #77087 - Update Turbopack development test manifest: #77071 - Update bundler production test manifest: #77069 - Update bundler development test manifest: #77068 - Revert "Update rust toolchain to 2025-03-12": #77103 - perf(turbopack): Merge nodes with same starting point: #76938 - refactor(actions): Remove turbopack magic comments: #77063 - Update Turbopack development test manifest: #77108 - Turbopack: move must_use to actually have an effect: #77111 - Turbopack: align chunking with graph entries: #76441 - Turbopack: ChunkGroup in evaluated_chunk_group: #76593 - Turbopack: `charset=utf-8` in data-url source maps: #77112 - Update bundler production test manifest: #77107 - Update bundler development test manifest: #77106 - Update Turbopack production test manifest: #77109 - docs(scripts): update Script -> beforeInteractive docs: #77136 - Add doc for instrumentation client hook: #77134 - docs(scripts): missing 'soon': #77137 - doc: diff between instrumentation vs instrumentation-client: #77143 - Alternate bundler: add index.d.ts types to plugin: #77144 - Alternate bundler: Add `react-refresh` as a dependency of plugin: #77142 - build: Update `swc_core` to `v16.6.0`: #77155 - Allow building node-pty in tests: #77187 - Don't mark ppr-errors Turbopack dev tests as failed: #76951 - Bump lightningcss: #77132 - Update Turbopack production test manifest: #77183 - Turbopack: fix graph layout segment optimization: #77094 - Turbopack: split up server actions modules for better treeshaking: #76877 - Turbopack: conditional parse in apply_module_type: #77191 - build: Update `swc_core` to `v16.6.2`: #77194 - Turbopack: more tracing: #75351 - Update bundler development test manifest: #77180 - Better failure tracking for middleware-custom-matchers-i18n: #76974 - Update bundler production test manifest: #77179 - fix(test/e2e/prerender): Remove race condition in test: #77222 - Update Turbopack production test manifest: #77228 - Update Turbopack development test manifest: #77227 - [Turbopack] basic production chunking for CSS: #75049 - docs: optimizing local dev: #77140 - Update bundler production test manifest: #77225 - devlow-bench: wait for complete ready for server startup event: #77217 - fix(CI): Re-enable retries for bundler integration tests: #77265 - Turbopack: handle non chunkable modules in module batches: #77282 - Update Turbopack development test manifest: #77276 - Update Turbopack production test manifest: #77275 - Turbopack: avoid single css chunks when there is only a single chunk item: #77283 - Update bundler development test manifest: #77272 - Update bundler production test manifest: #77273 - Turbopack: compute ordered entries in module batches: #77294 - Update Turbopack production test manifest: #77316 - Update Turbopack development test manifest: #77317 - Update bundler production test manifest: #77314 - fix(turbopack): Call `.minify()` of lightningcss `StyleSheet`: #77313 - fix(CI build_and_deploy): Use a larger fetch-depth for build-native job: #77307 - chore(turbopack): Fix a few syntactic nits: #77310 - Update bundler development test manifest: #77315 - Turbopack: refactor CssEmbed to avoid creating a chunk item: #77303 - fix: Update `swc_core` and use `rayon` instead of `chili`: #77338 - Fix chakra link: #77280 - Update Turbopack production test manifest: #77366 - Update Turbopack development test manifest: #77365 - Turbopack: ignore static asset imports for Edge: #77382 - Update bundler development test manifest: #77364 - docs: clarify middleware use cases: #77438 - fix(turbopack-bench): Limit `copy_dir` concurrency to avoid running out of file descriptors: #77468 - docs: fix typo: #77483 - Update `swc_core` to `v16.10.0`: #77489 - fix(turbopack): Use strongly consistent reads for sourcemaps in napi FFI boundary: #77511 - Update mappings in `launch.json` to improve debugging in VSCode: #76559 - chore(ci): Configure codspeed: #76884 - Update bundler production test manifest: #77602 - Update bundler development test manifest: #77603 - Update Turbopack development test manifest: #77605 - Update Turbopack production test manifest: #77604 - Turbopack build: Fix symbolic-file-links test: #77615 - Update pnpm swc-build-native's file path: #77623 - fix: Use standard PostCSS configuration in create-next-app format for ecosystem compatibility: #77376 - Turbopack build: Fix basepath test: #77630 - Turbopack: disable pages dir css test cases: #77380 - Update bundler development test manifest: #77627 - Update Turbopack development test manifest: #77628 - Update bundler production test manifest: #77626 - refactor(turbo-tasks): Make TraceRawVcs a supertrait of TaskInput: #77397 - refactor(turbo-tasks): Make TraceRawVcs a supertrait of MagicAny: #77596 - fix(turbopack): Recognize urls starting with // as external: #77526 - Update CI build caching docs to include `bun` and other package manager: #77633 - fix(turbopack): Fix panic while tree shaking optimization: #77492 - fix(turbopack): Prevent duplicate in tree shaking: #77491 - Turbopack: Skip ssr processing when next/dynamic ssr: false: #77636 - Turbopack Build: CSR bailout test skip check for file path: #77639 - Turbopack: fix side effects optimization bug: #77640 - Turbopack: add tracing for fetch calls: #77673 - [test] Update stale snapshots: #77680 - Turbopack: fix bug in handling of module batches: #77638 - pack-next: use default `--js-build` as option instead of `--no-js-build`: #77686 - Turbopack: Allow overriding tsconfig path via next-config: #77563 - Scripts: migrate unpack-next to TypeScript: #77538 - chore(turbopack): Make TaskInputs use ResolvedVc: #77700 - Getting Started Docs: Add `Metadata and OG images` page: #74077 - Getting Started Docs: Add `Upgrade` page: #77717 - Docs IA 2.0: Rename `Examples` to `Guides`: #77722 - build: Update `swc_core` to `v19.0.0`: #77669 - Add Josh to Turbopack team for created-by label: #77738 - Turbopack: use better ident for worker chunk group: #77731 - chore(turbo-tasks): Remove redundant ast-grep lint rule: #77701 - fix(docs): update error type in notFound function description: #77503 - Update bundler development test manifest: #77706 - Update Turbopack production test manifest: #77709 - Turbopack: refactor resolve_url_reference to avoid chunk_path: #77732 - Update Turbopack development test manifest: #77708 - Port "app-document" test to e2e: #77748 - [ci]: skip build-windows job for docs only change: #77743 - Update bundler production test manifest: #77707 - chore(turbo-tasks): Audit all remaining uses of `Vc` in a struct: #77756 - docs: `instrumentation-client` follow up: #77752 - [test] Get rid of unrelated "Invalid hook call" error from tests using `styled-components`: #77736 - Turbopack: keep side-effect-full imports: #76545 - Docs: Recommend inline `use server` and update examples: #77770 - Revert "Docs: Recommend inline `use server` and update examples": #77771 - doc: useLinkStatus: #77648 - Update Turbopack production test manifest: #77767 - Update bundler development test manifest: #77765 - [docs] fix lint issue in use link status doc: #77785 - doc: onNavigate: #77647 - Update bundler production test manifest: #77764 - doc: useLinkStatus doc follow-up: #77790 - Update Turbopack development test manifest: #77766 - [ci] remove needs build-native for lint job: #77787 - test(examples): update turbopack manifest: #75092 - [test] fix bad test fixuture for perf test: #77804 - [test] fix react 19.1 related tests: #77809 - doc: onNavigate follow-up: #77805 - fix(turbopack): Apply `hygiene` if mangling is disabled: #77815 - Turbopack: omit empty source map when code starts with a new line: #77734 - [next-lint] test: remove eslint config snapshot testing: #77818 - Turbopack: avoid deriving css source map path from generated code path: #77735 - Turbopack: pass asset to chunk_path to allow to use content hash later: #77772 - Docs IA 2.0: Add `Deep Dive` section placeholder: #77724 - Turbopack: use document.currentScript instead of chunk path literal: #77773 - Turbopack: don't include client-fs assets in NFT: #77799 - Turbopack: enable content hashing in production: #77775 - Turbopack: correctly track `await import("path")` in static analysis: #77811 - fix(turbopack-cli): Make turbopack_cli::dev::source a persistent (non-transient) task: #77798 - [test] temporarily disable flaky test for react 18: #77848 - Update Turbopack production test manifest: #77872 - Rename process.env.TURBOPACK to process.env.IS_TURBOPACK_TEST for tests: #77892 - [test] consolidate missing tag dev test: #77896 - fix(Turbopack): Intermittent CapacityExceeded Error in Persistent Caching: #77691 - fix: flaky test detection needs to use new turbopack flag: #77908 - fix: apply Geist fonts correctly on default cna template: #77237 - Update bundler development test manifest: #77884 - Update bundler production test manifest: #77885 - Update Turbopack development test manifest: #77886 - Update bundler production test manifest: #77914 - Update bundler development test manifest: #77915 - fix(turbopack): Apply `import_map` option of `swc_emotion` correctly: #71776 - Turbopack: handle removed routes: #77890 - build: Update `swc_core` to `v21.0.1`: #77918 - IA 2.0: Review `Getting Started` Section: #77921 - test: attempt to de-flake rsc-basic: #77934 - docs: revert image 15.3 change until live: #77941 - Turbopack: remove CSS comments when minifying: #77940 ### Credits Huge thanks to @raunofreiberg, @huozhi, @ijjk, @timneutkens, @gaojude, @leerob, @mezotv, @bgw, @samcx, @ztanner, @sokra, @mischnic, @wbinnssmith, @kdy1, @unstubbable, @ahabhgk, @ScriptedAlchemy, @SukkaW, @wyattjoh, @eps1lon, @Amirroid, @Netail, @lubieowoce, @gnoff, @jackwilson323, @acdlite, @sbougerel, @kevva, @kasperpeulen, @Cy-Tek, @dvoytenko, @husseinraoouf, @isBatak, @iamkd, @delbaoliveira, @jantimon, @padmaia, @Bernardoow, @styfle, @devjiwonchoi, @JamBalaya56562, and @Marukome0743 for helping!