React Router Updates & Release Notes
88 updates curated from 2 sources by the Releasebot Team. Last updated: Aug 28, 2026
- Aug 27, 2026
- Date parsed from source:Aug 27, 2026
- First seen by Releasebot:Aug 28, 2026
v8.3.1
React Router ships patch updates that fix navigation, fetcher, scroll restoration, and lazy route discovery bugs, improve route matching performance and action origin validation, and strengthen URL handling. It also updates dev, node, and serve packages with build, streaming, and well-known file fixes.
Patch Changes
react-router- FixExpected fetcher: <key>error thrown on navigation when a fetcher is aborted during its post-action revalidation (#15365)react-router- Fix lazy route discovery caching a path as discovered when the triggering navigation was aborted after the manifest response settled but before the route tree was patched, which permanently (for the session) shadowed the real route behind a catch-all or produced 404s on every subsequent visit (#15399)react-router- Improve route matching performance for long paths (#15417)react-router- Improve validation of action request origins (#15419)react-router- Fix<ScrollRestoration>leavinghistory.scrollRestorationset to"auto"after a bfcache restore, which let the browser restore scroll on subsequent history traversals before the destination route had rendered (#15397)react-router- Properly respect therelativeoption inuseSubmit/fetcher.submitwhen resolivng theactionpath (#15400)react-router- Add additional URL validation on client side navigations/redirects (#15445)@react-router/dev- Bump@remix-run/node-fetch-serverdependency (#15447)@react-router/dev- Generate JavaScript entry files at package build time soreact-router reveal --no-typescriptdoes not require Prettier at runtime (#15373)- Deprecate the
--no-typescriptflag ahead of its removal in React Router v9
- Deprecate the
@react-router/node- Bump@remix-run/node-fetch-serverdependency (#15447)@react-router/node- fix: Prevent client disconnects during streaming from crashing the Node process (#15324)@react-router/serve- Bump@remix-run/node-fetch-serverdependency (#15447)@react-router/serve- Serve/.well-known/*files from the client build directory. Express 5's static middleware ignores every dot-segment path by default, so RFC 8615 well-known URIs — ACME challenges, Android'sassetlinks.json, Apple'sapple-app-site-association— fell through to the request handler and came back as app-rendered HTML instead of the static file. Other dotfiles remain hidden. (#15340)
Full Changelog:
Original sourcev8.3.0...v8.3.1 - Aug 27, 2026
- Date parsed from source:Aug 27, 2026
- First seen by Releasebot:Aug 28, 2026
v8.3.1
React Router ships a patch release with navigation, fetcher, and scroll restoration fixes, better route matching performance, stricter URL and action origin validation, and updates for dev, node, and serve tooling including well-known file handling.
Patch Changes
- react-router - Fix Expected fetcher: error thrown on navigation when a fetcher is aborted during its post-action revalidation (#15365)
- react-router - Fix lazy route discovery caching a path as discovered when the triggering navigation was aborted after the manifest response settled but before the route tree was patched, which permanently (for the session) shadowed the real route behind a catch-all or produced 404s on every subsequent visit (#15399)
- react-router - Improve route matching performance for long paths (#15417)
- react-router - Improve validation of action request origins (#15419)
- react-router - Fix leaving history.scrollRestoration set to "auto" after a bfcache restore, which let the browser restore scroll on subsequent history traversals before the destination route had rendered (#15397)
- react-router - Properly respect the relative option in useSubmit/fetcher.submit when resolivng the action path (#15400)
- react-router - Add additional URL validation on client side navigations/redirects (#15445)
- @react-router/dev - Bump @remix-run/node-fetch-server dependency (#15447)
- @react-router/dev - Generate JavaScript entry files at package build time so react-router reveal --no-typescript does not require Prettier at runtime (#15373)
- Deprecate the --no-typescript flag ahead of its removal in React Router v9
- @react-router/node - Bump @remix-run/node-fetch-server dependency (#15447)
- @react-router/node - fix: Prevent client disconnects during streaming from crashing the Node process (#15324)
- @react-router/serve - Bump @remix-run/node-fetch-server dependency (#15447)
- @react-router/serve - Serve /.well-known/* files from the client build directory. Express 5's static middleware ignores every dot-segment path by default, so RFC 8615 well-known URIs — ACME challenges, Android's assetlinks.json, Apple's apple-app-site-association — fell through to the request handler and came back as app-rendered HTML instead of the static file. Other dotfiles remain hidden. (#15340)
Full Changelog: v8.3.0...v8.3.1
Original source All of your release notes in one feed
Join Releasebot and get updates from Remix and hundreds of other software products.
- Jul 22, 2026
- Date parsed from source:Jul 22, 2026
- First seen by Releasebot:Jul 23, 2026
v8.3.0
React Router releases improved RSC support, adding CSP nonce and subresource integrity handling for custom entries, plus safer client version wiring and stability fixes. It also improves path param encoding, fixes NavLink pending state, and expands TypeScript 7 support across packages.
What's Changed
RSC Entry Updates
This release includes several updates for unstable RSC apps that use custom entry files. Apps using the default RSC Framework entries do not need any changes.
If you maintain custom RSC entries, review the generated unstable change notes for the new client version, subresource integrity, and CSP nonce wiring. Custom
entry.rsc.tsxfiles should pass the generated client version tounstable_matchRSCServerRequest, and customentry.ssr.tsxfiles may need to pass the generated import map integrity data and request nonce through React's HTML renderer.Minor Changes
@react-router/dev- Restartreact-router devwith--conditions=developmentwhen not already configured (#15291)
Patch Changes
react-router- Encode path params inhref/generatePathper RFC 3986 path-segment rules instead ofencodeURIComponent(#15310)- Characters that are valid literally in a path segment (
$ & + , ; = : @— RFC 3986pchar) are no longer percent-encoded, so values like a semver build1.0.0+1interpolate unchanged instead of becoming1.0.0%2B1 - Structural/unsafe characters (
/ ? # %, whitespace, non-ASCII) are still escaped exactly as before
- Characters that are valid literally in a path segment (
react-router- Usecrypto.randomUUID()forcreateMemorySessionStoragesession ids (#15302)createMemorySessionStorageis only intended for local development and testing - sessions are lost when the server restarts
react-router- FixNavLinknot applying itspendingstate whentohas a trailing slash (#15300)@react-router/architect- Allowtypescript@7to be used (#15317)@react-router/cloudflare- Allowtypescript@7to be used (#15317)@react-router/dev- Allowtypescript@7to be used (#15317)@react-router/express- Allowtypescript@7to be used (#15317)@react-router/fs-routes- Allowtypescript@7to be used (#15317)@react-router/node- Allowtypescript@7to be used (#15317)@react-router/remix-routes-option-adapter- Allowtypescript@7to be used (#15317)
Unstable Changes
⚠️ Unstable features are not recommended for production use
react-router- Preserve RSC route component metadata so routes with aclientLoadercan skip unnecessary server requests once their components have rendered while still fetching missing server-rendered elements (#15323)react-router- Harden RSC CSRF code paths (#15311)react-router- Fix server crash (TypeError: Invalid state: Unable to enqueue) when a request is aborted while the RSC HTML stream has a pending flush (#15286)- Handle cancellation of the
injectRSCPayloadreadable side, clear the pending flush, and cancel the underlying RSC payload stream
- Handle cancellation of the
react-router- Detect stale RSC clients during lazy route discovery and reload the destination document (#15318)
Migration
Apps using the default RSC Framework entry do not need to make any changes. Apps with a custom
entry.rsc.tsxshould import the generated client version and pass it tounstable_matchRSCServerRequest:import clientVersion from "virtual:react-router/unstable_rsc/client-version"; return unstable_matchRSCServerRequest({ // ... clientVersion, });react-router- Add CSP nonce support to RSC document rendering (#15320)- Add
nonceoptions tounstable_routeRSCServerRequestandunstable_RSCStaticRouter - Forward the nonce to the HTML renderer and apply it to injected RSC payload scripts and nonce-aware framework components
- Add
To adopt nonce-based CSP, update your
entry.ssr.tsx(runreact-router reveal entry.ssrfirst in RSC Framework Mode) to generate a fresh nonce for each request. Pass it torouteRSCServerRequest, spread therenderHTMLoptions into React's HTML renderer, passoptions.noncetoRSCStaticRouter, and use the same nonce in theContent-Security-Policyresponse header:const nonce = crypto.randomUUID(); const response = await routeRSCServerRequest({ request, serverResponse, createFromReadableStream, nonce, async renderHTML(getPayload, options) { const payload = getPayload(); return renderHTMLToReadableStream( <RSCStaticRouter getPayload={getPayload} nonce={options.nonce} />, { ...options, bootstrapScriptContent, formState: await payload.formState, signal: request.signal, }, ); }, }); response.headers.set( "Content-Security-Policy", `script-src 'self' 'nonce-${nonce}'`, );@react-router/dev- Addunstable_rsc/client-versionclient build version virtual module (#15318)@react-router/dev- Support thesubResourceIntegrityconfig option in RSC Framework Mode (#15321)
Migration guide
No changes are required when using the default RSC SSR entry. If you maintain a custom
app/entry.ssr.tsx, import the new virtual module and pass its hashes to React'simportMaprender option:+import subResourceIntegrity from "virtual:react-router/unstable_rsc/subresource-integrity"; return renderToReadableStream(<RSCStaticRouter getPayload={getPayload} />, { ...options, bootstrapScriptContent, formState, + importMap: subResourceIntegrity + ? { integrity: subResourceIntegrity } + : undefined, signal: request.signal, });Full Changelog:
Original sourcev8.2.0...v8.3.0 - Jul 22, 2026
- Date parsed from source:Jul 22, 2026
- First seen by Releasebot:Jul 23, 2026
- Modified by Releasebot:Sep 1, 2026
v8.3.0
React Router ships RSC entry updates, stronger CSP nonce support, and several fixes for routing and memory session storage. It also improves dev startup, supports TypeScript 7 across packages, and hardens unstable RSC behavior with better client version handling and stream crash fixes.
What's Changed
RSC Entry Updates
This release includes several updates for unstable RSC apps that use custom entry files. Apps using the default RSC Framework entries do not need any changes.
If you maintain custom RSC entries, review the generated unstable change notes for the new client version, subresource integrity, and CSP nonce wiring. Custom entry.rsc.tsx files should pass the generated client version to unstable_matchRSCServerRequest, and custom entry.ssr.tsx files may need to pass the generated import map integrity data and request nonce through React's HTML renderer.
Minor Changes
- @react-router/dev - Restart react-router dev with --conditions=development when not already configured (#15291)
Patch Changes
- react-router - Encode path params in href/generatePath per RFC 3986 path-segment rules instead of encodeURIComponent (#15310)
- Characters that are valid literally in a path segment ($ & + , ; = : @ — RFC 3986 pchar) are no longer percent-encoded, so values like a semver build 1.0.0+1 interpolate unchanged instead of becoming 1.0.0%2B1
- Structural/unsafe characters (/ ? # %, whitespace, non-ASCII) are still escaped exactly as before
- react-router - Use crypto.randomUUID() for createMemorySessionStorage session ids (#15302)
- createMemorySessionStorage is only intended for local development and testing - sessions are lost when the server restarts
- react-router - Fix NavLink not applying its pending state when to has a trailing slash (#15300)
- @react-router/architect - Allow typescript@7 to be used (#15317)
- @react-router/cloudflare - Allow typescript@7 to be used (#15317)
- @react-router/dev - Allow typescript@7 to be used (#15317)
- @react-router/express - Allow typescript@7 to be used (#15317)
- @react-router/fs-routes - Allow typescript@7 to be used (#15317)
- @react-router/node - Allow typescript@7 to be used (#15317)
- @react-router/remix-routes-option-adapter - Allow typescript@7 to be used (#15317)
Unstable Changes
⚠️ Unstable features are not recommended for production use
- react-router - Preserve RSC route component metadata so routes with a clientLoader can skip unnecessary server requests once their components have rendered while still fetching missing server-rendered elements (#15323)
- react-router - Harden RSC CSRF code paths (#15311)
- react-router - Fix server crash (TypeError: Invalid state: Unable to enqueue) when a request is aborted while the RSC HTML stream has a pending flush (#15286)
- Handle cancellation of the injectRSCPayload readable side, clear the pending flush, and cancel the underlying RSC payload stream
- react-router - Detect stale RSC clients during lazy route discovery and reload the destination document (#15318)
Migration
Apps using the default RSC Framework entry do not need to make any changes. Apps with a custom entry.rsc.tsx should import the generated client version and pass it to unstable_matchRSCServerRequest:
import clientVersion from "virtual:react-router/unstable_rsc/client-version"; return unstable_matchRSCServerRequest({ clientVersion });- react-router - Add CSP nonce support to RSC document rendering (#15320)
- Add nonce options to unstable_routeRSCServerRequest and unstable_RSCStaticRouter
- Forward the nonce to the HTML renderer and apply it to injected RSC payload scripts and nonce-aware framework components
To adopt nonce-based CSP, update your entry.ssr.tsx (run react-router reveal entry.ssr first in RSC Framework Mode) to generate a fresh nonce for each request. Pass it to routeRSCServerRequest, spread the renderHTML options into React's HTML renderer, pass options.nonce to RSCStaticRouter, and use the same nonce in the Content-Security-Policy response header:
const nonce = crypto.randomUUID(); const response = await routeRSCServerRequest({ request, serverResponse, createFromReadableStream, nonce, async renderHTML(getPayload, options) { const payload = getPayload(); return renderHTMLToReadableStream(<RSCStaticRouter getPayload={getPayload} nonce={options.nonce} />, { ...options, bootstrapScriptContent, formState: await payload.formState, signal: request.signal }); }); response.headers.set("Content-Security-Policy", `script-src 'self' 'nonce-${nonce}'`);Full Changelog: v8.2.0...v8.3.0
Original source - Jul 8, 2026
- Date parsed from source:Jul 8, 2026
- First seen by Releasebot:Jul 10, 2026
v8.2.0
React Router adds a Web Streams default server entry for non-Node Framework mode apps, with an opt-in flag for Node apps, and improves routing, param handling, blockers, and Vite 8+ config detection while also fixing URL encoding and route ranking issues.
What's Changed
Web Streams Default Server Entry
Non-Node runtime Framework Mode apps no longer need a custom
entry.server.tsxfile using React'srenderToReadableStreamAPI. Apps with@react-router/{node,express,serve}dependencies will continue to default torenderToPipeableStream, while non-Node apps default torenderToReadableStream.Because Web Streams are stable in Node 22+, Node apps can also opt-into the Web Streams default entry with the new
future.unstable_enableNodeReadableStreamflag:import type { Config } from "@react-router/dev/config"; export default { future: { unstable_enableNodeReadableStream: true, }, } satisfies Config;This flag has no effect if you have a custom
entry.server.tsxkeep using their custom entry file. It only applies to the default entry used if one doesn't exist.Node apps opting-into the Web Streams API might even see a small performance boost because React Router already uses Web Streams internally, so this avoids additional conversions between Web/Node streams. If you see perf changes one way or another upon adopting this flag, please let us know!
Minor Changes
@react-router/dev- Add a Web Streams default server entry for non-Node Framework mode apps (#15290)- Apps using
@react-router/node,@react-router/express, or@react-router/servecontinue to use therenderToPipeableStreamdefault server entry - Apps without those Node server adapter dependencies use a
renderToReadableStreamdefault server entry - Non-Node apps with their own
entry.server.tsxmay be able to remove it in favor of the default if it is not doing anything custom
- Apps using
@react-router/dev- Detectnubas a supported package manager when installing framework dependencies (#15276)create-react-router- Detectnubas a supported package manager when creating new projects (#15276)
Patch Changes
react-router- Fixhref()to properly stringify and URL-encode param values, matchinggeneratePath()(#15277)- splat params preserve path separators while encoding each segment individually
react-router- Fix dynamic param extraction for routes with optional static segments (#15200)- When a route path contains optional static segments (e.g.
/school?/user/:id), the internal regex's incorrectly shifted parameter indices resulting in incorrect parameter extraction - Consecutive optional static segments (e.g.
/one?/two?) were only partially handled
- When a route path contains optional static segments (e.g.
react-router- Preserve navigation blocker state through a revalidation (#15246)react-router- Fix route ranking for dynamic parameters with static extension suffixes (#15273)- These were not being detected as dynamic param segments and instead got incorrectly scored higher as a static segment
- This meant they could potentially tie truly static routes like
/sitemap.xmland outrank them based on definition order - These are now correctly identified as dynamic parameter segments and scored correctly
react-router- Use ReactFormState types instead of unknown (#15263)@react-router/dev- Detect userrolldownOptionsconfig in Vite 8+ (#15278)
Unstable Changes
⚠️ Unstable features are not recommended for production use
@react-router/dev- Add thefuture.unstable_enableNodeReadableStreamflag to opt Node Framework mode apps into usingrenderToReadableStreaminstead ofrenderToPipeableStream(#15290)- This flag has no effect if you have your own
entry.server.tsx
- This flag has no effect if you have your own
Full Changelog:
Original sourcev8.1.0...v8.2.0 Similar to React Router with recent updates:
- React updates32 release notes · Latest Jul 21, 2026
- Next.js updates107 release notes · Latest Sep 3, 2026
- 1Password Browser updates56 release notes · Latest Aug 25, 2026
- 1Password Mac updates48 release notes · Latest Aug 25, 2026
- Claude Code updates437 release notes · Latest Sep 5, 2026
- Gemini updates408 release notes · Latest Sep 4, 2026
- Jul 8, 2026
- Date parsed from source:Jul 8, 2026
- First seen by Releasebot:Jul 9, 2026
- Modified by Releasebot:Sep 1, 2026
v8.2.0
React Router adds a Web Streams default server entry for non-Node Framework apps, brings a new opt-in flag for Node apps, and ships several routing, navigation, and developer experience fixes. It also improves project creation and server tooling.
What's Changed
Web Streams Default Server Entry
Non-Node runtime Framework Mode apps no longer need a custom entry.server.tsx file using React's renderToReadableStream API. Apps with @react-router/{node,express,serve} dependencies will continue to default to renderToPipeableStream, while non-Node apps default to renderToReadableStream.
Because Web Streams are stable in Node 22+, Node apps can also opt-into the Web Streams default entry with the new future.unstable_enableNodeReadableStream flag:
import type { Config } from "@react-router/dev/config"; export default { future: { unstable_enableNodeReadableStream: true, }, } satisfies Config;This flag has no effect if you have a custom entry.server.tsx keep using their custom entry file. It only applies to the default entry used if one doesn't exist.
Node apps opting-into the Web Streams API might even see a small performance boost because React Router already uses Web Streams internally, so this avoids additional conversions between Web/Node streams. If you see perf changes one way or another upon adopting this flag, please let us know!
Minor Changes
- @react-router/dev - Add a Web Streams default server entry for non-Node Framework mode apps (#15290)
- Apps using @react-router/node, @react-router/express, or @react-router/serve continue to use the renderToPipeableStream default server entry
- Apps without those Node server adapter dependencies use a renderToReadableStream default server entry
- Non-Node apps with their own entry.server.tsx may be able to remove it in favor of the default if it is not doing anything custom
- @react-router/dev - Detect nub as a supported package manager when installing framework dependencies (#15276)
- create-react-router - Detect nub as a supported package manager when creating new projects (#15276)
Patch Changes
- react-router - Fix href() to properly stringify and URL-encode param values, matching generatePath() (#15277)
- splat params preserve path separators while encoding each segment individually
- react-router - Fix dynamic param extraction for routes with optional static segments (#15200)
- When a route path contains optional static segments (e.g. /school?/user/:id), the internal regex's incorrectly shifted parameter indices resulting in incorrect parameter extraction
- Consecutive optional static segments (e.g. /one?/two?) were only partially handled
- react-router - Preserve navigation blocker state through a revalidation (#15246)
- react-router - Fix route ranking for dynamic parameters with static extension suffixes (#15273)
- These were not being detected as dynamic param segments and instead got incorrectly scored higher as a static segment
- This meant they could potentially tie truly static routes like /sitemap.xml and outrank them based on definition order
- These are now correctly identified as dynamic parameter segments and scored correctly
- react-router - Use ReactFormState types instead of unknown (#15263)
- @react-router/dev - Detect user rolldownOptions config in Vite 8+ (#15278)
Unstable Changes
⚠️ Unstable features are not recommended for production use
- @react-router/dev - Add the future.unstable_enableNodeReadableStream flag to opt Node Framework mode apps into using renderToReadableStream instead of renderToPipeableStream (#15290)
- This flag has no effect if you have your own entry.server.tsx
- react-router - Return route metadata from server request, client navigation, and client fetcher instrumentations (#15235)
- Adds result metadata after instrumented calls complete, including the URL, matched route pattern, and params
- Adds known HTTP status codes to server request handler instrumentation results
- create-react-router - Add a default-on CLI option to include the official React Router agent skill in generated projects (#15213)
- New projects include .agents/skills/react-router by default when running with --yes or in non-interactive shells
- Interactive runs prompt to include the skill, defaulting to yes
- Use --no-agent-skills to skip copying the skill
- @react-router/dev - Fix a regression with the new prerendering plugin where the react-router.config.ts buildEnd hook would run before prerendering was completed (#15211)
- @react-router/dev - Fixed react-router typegen crashes under the Bun runtime when Babel default imports are already unwrapped (#15214)
- @react-router/dev - Replace the deprecated envFile:false Vite config with envDir:false to eliminate a deprecation warning when using [email protected]+ (#15230)
- @react-router/dev - Only add the "node" Vite server condition for Framework mode apps that declare a Node server adapter dependency (#15242)
- This prevents non-Node SSR runtimes from resolving Node-specific package exports by default
- @react-router/serve - Use Node's built-in networking APIs to find an available port and remove the get-port dependency (#15239)
- create-react-router - Use Node's built-in utilities for CLI argument parsing, ANSI-stripping, and child process execution to remove the arg, strip-ansi, and execa dependencies (#15231)
Full Changelog: v8.1.0...v8.2.0
Original source - Jun 29, 2026
- Date parsed from source:Jun 29, 2026
- First seen by Releasebot:Jun 30, 2026
v8.1.0
React Router ships improved observability metadata, adding route and request details to instrumented results plus HTTP status codes for server handlers. It also expands create-react-router with optional Agent Skill setup by default in new projects, alongside several dev and CLI fixes.
What's Changed
Agent Skills Installation via
create-react-routercreate-react-routercan now setup the React Router Agent Skill in your new project. Interactive shells will issue a prompt on whether to include the skills, and they will be included by default with when running with--yesor in non-interactive shells. You can skip the skill addition with the--no-agent-skillsCLI flag.Observability Metadata
The Instrumentation APIs
infoparameter usually corresponds roughly to the inputs to the thing being instrumented (handler,loader, etc.). For route level instrumentations such as loaders, this contains useful information like thepattern(i.e.,/blog/:slug) that allows you to report information that is easily aggregated by pattern, instead of having to manually deduce one from the request url.However, for outer layers such as the
handleror a routernavigatecall - we can't provide apatternbecause we haven't yet done any route matching, so it wasn't easy to report at those levels based on a generic route pattern.The internal instrumentation results now contain relevant metadata in
result.metafor these outer instrumentation layers. For serverhandlerinstrumentations, we also expose thestatusCodeof the outgoing HTTP response:export const instrumentations = [ { handler(handler) { handler.instrument({ async request(handleRequest) { let result = await handleRequest(); // Available to server `handler`, and router `navigate`/`fetch` instrumentations let normalizedUrl = result.meta?.url; let routePattern = result.meta?.pattern; let routeParams = result.meta?.params; // Available to server `handler` only let statusCode = result.statusCode; }, }); }, }, ];Please see the docs for more information.
Minor Changes
react-router- Return route metadata from server request, client navigation, and client fetcher instrumentations (#15235)- Adds result metadata after instrumented calls complete, including the URL, matched route pattern, and params
- Adds known HTTP status codes to server request handler instrumentation results
create-react-router- Add a default-on CLI option to include the official React Router agent skill in generated projects (#15213)- New projects include
.agents/skills/react-routerby default when running with--yesor in non-interactive shells - Interactive runs prompt to include the skill, defaulting to yes
- Use
--no-agent-skillsto skip copying the skill
- New projects include
Patch Changes
@react-router/dev- Fix a regression with the new prerendering plugin where thereact-router.config.tsbuildEndhook would run before prerendering was completed (#15211)@react-router/dev- Fixedreact-router typegencrashes under the Bun runtime when Babel default imports are already unwrapped (#15214)@react-router/dev- Replace the deprecatedenvFile:falseVite config withenvDir:falseto eliminate a deprecation warning when using [email protected]+ (#15230)@react-router/dev- Only add the"node"Vite server condition for Framework mode apps that declare a Node server adapter dependency (#15242)- This prevents non-Node SSR runtimes from resolving Node-specific package exports by default
@react-router/serve- Use Node's built-in networking APIs to find an available port and remove theget-portdependency (#15239)create-react-router- Use Node's built-in utilities for CLI argument parsing, ANSI-stripping, and child process execution to remove thearg,strip-ansi, andexecadependencies (#15231)
Full Changelog:
Original sourcev8.0.1...v8.1.0 - Jun 29, 2026
- Date parsed from source:Jun 29, 2026
- First seen by Releasebot:Jun 30, 2026
- Modified by Releasebot:Sep 1, 2026
v8.1.0
React Router adds agent skills installation in create-react-router, richer observability metadata for server and router instrumentations, and vite preview support, while also fixing future flag warning URLs and duplicate logs.
Agent Skills Installation via create-react-router
create-react-router can now setup the React Router in your new project. Interactive shells will issue a prompt on whether to include the skills, and they will be included by default with when running with --yes or in non-interactive shells. You can skip the skill addition with the --no-agent-skills CLI flag.
Observability Metadata
The Instrumentation APIs info parameter usually corresponds roughly to the inputs to the thing being instrumented (handler, loader, etc.). For route level instrumentations such as loaders, this contains useful information like the pattern (i.e., /blog/:slug) that allows you to report information that is easily aggregated by pattern, instead of having to manually deduce one from the request url.
However, for outer layers such as the handler or a router navigate call - we can't provide a pattern because we haven't yet done any route matching, so it wasn't easy to report at those levels based on a generic route pattern.
The internal instrumentation results now contain relevant metadata in result.meta for these outer instrumentation layers. For server handler instrumentations, we also expose the statusCode of the outgoing HTTP response:
export const instrumentations = [ { handler(handler) { async request(handleRequest) { let result = await handleRequest(); // Available to server `handler`, and router `navigate`/`fetch` instrumentations let normalizedUrl = result.meta?.url; let routePattern = result.meta?.pattern; let routeParams = result.meta?.params; // Available to server `handler` only let statusCode = result.statusCode; } }, }, ];Minor Changes
- react-router - Return route metadata from server request, client navigation, and client fetcher instrumentations (#15235)
- @react-router/dev - Add vite preview support (#14507)
Patch Changes
- @react-router/dev - Fix future flag warning URLs and only log each future flag warning one time (#15138)
Full Changelog: v8.0.1...v8.1.0
Original source - Jun 18, 2026
- Date parsed from source:Jun 18, 2026
- First seen by Releasebot:Jun 19, 2026
v8.0.1
React Router removes the obsolete AppLoadContext export in a patch update.
Patch Changes
react-router- Remove the obsoleteAppLoadContexttype export accidentally left over from v7 now that middleware is always enabled and server request context is provided throughRouterContextProvider. (#15207)
Full Changelog:
Original sourcev8.0.0...v8.0.1 - Jun 18, 2026
- Date parsed from source:Jun 18, 2026
- First seen by Releasebot:Jun 18, 2026
v8.0.1
React Router fixes a patch release by removing the obsolete AppLoadContext export from v8.
Patch Changes
- react-router - Remove the obsolete AppLoadContext type export accidentally left over from v7 now that middleware is always enabled and server request context is provided through RouterContextProvider. (#15207)
Full Changelog: v8.0.0...v8.0.1
Original source - Jun 17, 2026
- Date parsed from source:Jun 17, 2026
- First seen by Releasebot:Jun 18, 2026
- Modified by Releasebot:Jun 19, 2026
v8.0.0
React Router ships v8 with a new yearly major release cadence, default future flag behavior, updated baseline support for Node 22.22.0+, React 19.2.7+ and Vite 7+, plus an ESM-only publish model and several breaking API removals.
What's Changed
React Router v8 is here!
We introduced a new Open Governance model last year and this marks the first major release on our new planned yearly major release cadence. We chose the June timeframe this year to align with the EOL timeframe for Node 20. Node 22 is scheduled to reach EOL in the May 2027 timeframe so we'll be aiming for a v9 release around the same time next year.
Our API Development Strategy aims to make major releases relatively boring by introducing breaking changes ahead of time behind Future Flags. If you've adopted all active future flags in v7, then from a React Router API surface you're in good shape for v8. All
future.v8_*flags have been removed (or lifted to a top-level config) and their behaviors are now the default.Baseline Support
React Router v8 updates the following minimum supported versions:
- Node 22.22.0+
- Starting with v8, React Router will officially support all Active LTS node versions and only the latest minor branch of Maintenance LTS versions
- This better allows us to bump minimum Maintenance LTS versions to account for newly released security patches
- It also allows us to more quickly and easily adopt new Active LTS features backported to Maintenance LTS lines
- Upgraded minimum Maintenance LTS versions will be done in React Router minor releases
- React 19.2.7+
- Vite 7+
To modernize the library, React Router is now published as an ESM-only module and tsconfig
target/libfields have been updated to ES2022 across the boardAdopted Future Flag Behavior
The following v8 future flags have been removed and their behaviors are now the default:
future.v8_trailingSlashAwareDataRequestsfuture.v8_passThroughRequestsfuture.v8_middlewarefuture.v8_viteEnvironmentApifuture.v8_splitRouteModuleshas been moved to a to a top-levelsplitRouteModulesconfig option and is enabled by default
Removed
react-router-domIn v7, we collapsed the DOM APIs into
react-router/dom, but to ease the v6->v7 upgrade we continued re-exporting everything throughreact-router-dom. We have now droppedreact-router-dom, so if you didn't get around to swapping your imports in v7, you will need to swap them toreact-routerandreact-router/domfor v8.Removed deprecated
metadatafieldsThe
datafields passed to route modulemetafunctions were deprecated in v7 and are remove din v8. UseloaderDatainstead ofdataonMetaArgsand each item inMetaArgs.matches.Cloudflare Vite Plugin
The React Router Cloudflare dev proxy (
@react-router/dev/vite/cloudflare) has been removed in v8. Cloudflare projects should use@cloudflare/vite-plugininstead.@react-router/architectuseRequestContextDomainNameThe
@react-router/architectcreateRequestHandleruseRequestContextDomainNameoption has been removed as that is now the default behavior in v8.Pre-rendering Flow
In v7 we had a
future.unstable_previewServerPrerenderingflag that would opt you into a new pre-rendering flow using the Vite preview server (leveraging the Vite environment API). Now that the Vite environment API is always available on our new Vite 7+ baseline, we dropped this flag and the preview server flow has replaced our old pre-rendering implementation. It should be a non-breaking change but if you see issues, please let us know!Major Changes
react-router- Update minimum Node version to 22.22.0 (#14928)react-router- Update minimum React version to 19.2.7 (#15062)react-router- Remove thefuture.v8_trailingSlashAwareDataRequestsflag (#15100)- Trailing slash-aware data request URLs are now the default behavior.
react-router- Removefuture.v8_passThroughRequestsflag - the raw incomingrequestis now always passed through toloader/action. Useurlfor the normalized URL without React Router-specific implementation details (.datasuffixes,index/_routessearch params). (#15079)react-router- Removefuture.v8_middlewareflag — middleware is always enabled in v8 (#15078)- The
future.v8_middlewareflag has been removed; middleware is now always enabled - The
contextparameter passed toloader,action, andmiddlewarefunctions is always aRouterContextProviderinstance getLoadContextfunctions in custom servers must return aRouterContextProvider— returning a plain object is no longer supported- The
MiddlewareEnabledtype (previously exported asUNSAFE_MiddlewareEnabled) has been removed since the conditional it gated is now unconditional - The
Futuremodule augmentation pattern (interface Future { v8_middleware: true }) is no longer needed to typecontextin Data Mode
- The
react-router- Removefuture.v8_passThroughRequestsflag - the raw incomingrequestis now always passed through toloader/action. (#15079)react-router- Movefuture.v8_splitRouteModulesto a top-levelsplitRouteModulesconfig option and change the default behavior totrue(#15086)- Set
splitRouteModules: falseto keep route modules in a single chunk - Set
splitRouteModules: "enforce"to require all routes to be splittable
- Set
@react-router/dev- Removed thefuture.v8_viteEnvironmentApiflag because the Vite Environment API is always enabled (#15077)@react-router/dev- Removed thefuture.unstable_previewServerPrerenderingflag and make prerendering with the Vite Environment API the default. (#15077)react-router- Updatetsconfig.jsontarget/libfromES2020 -> ES2022(591853e)react-router- Switch the published packages inpackages/to ESM-only. (#14895) (59ebcf1)react-router- Remove deprecateddataparameter in favor ofloaderDataformetaAPIs (to align withRoute.ComponentProps) (#14931)Route.MetaArgs,Route.MetaMatch,MetaArgs,MetaMatch,Route.ComponentProps.matches,UIMatch
react-router- Remove internalhasErrorBoundaryfield added torouter.routeswhen using a data router (#15074)- This should not impact user-facing code since this was an internal prop and was computed based on the presence of
ErrorBoundaryorerrorElementon your route hasErrorBoundaryis no longer accepted onRouteObject(IndexRouteObject/NonIndexRouteObject),DataRouteObject,<Route>JSX props, or as a key inlazyroute definitions.- The
MapRoutePropertiesFunctionsignature no longer requires returninghasErrorBoundary; the router infers it directly.
- This should not impact user-facing code since this was an internal prop and was computed based on the presence of
react-router- Removereact-router-dompackage (#15076)- In v7 everything DOM-specific was collapsed into
react-router/domreact-router-domwas kept around as a convenience so existing v6 app imports would still work
- For v8, you will need to swap
react-router-domimports:RouterProvider/HydratedRoutershould be imported fromreact-router/dom- Everything else should be imported from
react-router
- In v7 everything DOM-specific was collapsed into
@react-router/architect- Bump@architect/functionsto v8 (#15106)@react-router/architect- Remove theuseRequestContextDomainNameoption fromcreateRequestHandler- this is now the default behavior (#15188)@react-router/dev- Remove@react-router/dev/vite/cloudflaredev proxy export; use@cloudflare/vite-plugininstead (#15077)- Drops support for
wrangler@3as a peer dependency of@react-router/dev
- Drops support for
@react-router/dev- Require Vite 7+ and make the Vite Environment API build path mandatory (#15077)@react-router/express- Bump dependencies (#15106)- Bumped
expressfrom^4.19.2to^4.22.2 - Bumped the
expresspeer dependency from^4.17.1 || ^5to^4.22.2 || ^5 - Bumped
@types/expressfrom^4.17.9to^4.17.25
- Bumped
@react-router/node- Switch from@mjackson/node-fetch-serverto@remix-run/node-fetch-servernow that we can directly use ESM-only packages (#14930)@react-router/serve- Switch from@mjackson/node-fetch-serverto@remix-run/node-fetch-servernow that we can directly use ESM-only packages (#14930)create-react-router- Switch from@remix-run/web-fetchto nativefetchinternally. (#14929)- This removes the underlying
HTTPS_PROXYsupport thatnode-fetchand subsequently@remix-run/web-fetchsupported
- This removes the underlying
Minor Changes
react-router- Bump dependencies (#15080)- Bumped
cookiefrom^1.0.1to^1.1.1 - Bumped
set-cookie-parserfrom^2.6.0to^3.1.0
- Bumped
@react-router/cloudflare- Bump@cloudflare/workers-typesfromn^4.20260520.1to^4.20260527.1(#15106)@react-router/dev- Bump dependencies (#15080)- Bumped
@babel/corefrom^7.27.7to^7.29.7 - Bumped
@babel/generatorfrom^7.27.5to^7.29.7 - Bumped
@babel/parserfrom^7.27.7to^7.29.7 - Bumped
@babel/plugin-syntax-jsxfrom^7.27.1to^7.29.7 - Bumped
@babel/preset-typescriptfrom^7.27.1to^7.29.7 - Bumped
@babel/traversefrom^7.27.7to^7.29.7 - Bumped
@babel/typesfrom^7.27.7to^7.29.7 - Bumped
babel-dead-code-eliminationfrom^1.0.6to^1.0.12 - Bumped
chokidarfrom^4.0.0to^5.0.0 - Bumped
es-module-lexerfrom^1.3.1to^2.1.0 - Bumped
exit-hookfrom2.2.1to5.1.0 - Bumped
isbotfrom^5.1.11to^5.1.40 - Bumped
p-mapfrom^7.0.3to^7.0.4 - Bumped
pathefrom^1.1.2to^2.0.3 - Bumped
pkg-typesfrom^2.3.0to^2.3.1 - Bumped
react-refreshfrom^0.14.0to^0.18.0 - Bumped
semverfrom^7.8.0to^7.8.1 - Bumped
tinyglobbyfrom^0.2.14to^0.2.16 - Bumped
valibotfrom^1.4.0to^1.4.1
- Bumped
@react-router/dev- Replacecookieandset-cookie-parserwithcookie-es(#15109)@react-router/dev- Removed thevite-nodedependency in favor of Vite's native module runner APIs (#15104)@react-router/serve- Bumpexpressfrom4.21.2to5.2.1(#15101)create-react-router- Bump dependencies (#15080)- Bumped
execafrom5.1.1to9.6.1 - Bumped
log-updatefrom^5.0.1to^8.0.0 - Bumped
semverfrom^7.3.7to^7.8.1 - Bumped
sort-package-jsonfrom^1.55.0to^3.6.1 - Bumped
strip-ansifrom^6.0.1to^7.2.0 - Bumped
tar-fsfrom^2.1.3to^3.1.2
- Bumped
Patch Changes
react-router- Ensure client middleware errors load lazy route error boundaries before bubbling (#15086)react-router- Remove explicitonSubmittype override fromSharedFormPropsto fix deprecation warning with@types/[email protected](#14932) (59ebcf1)react-router- Update package builds to preserve individual module files in published artifacts. Public APIs and documented import paths are unchanged. (#15092)- Updated package TypeScript configs to support modern module syntax used by the build configuration.
react-router- Migrate package builds fromtsuptotsdown. Published package entry points and public APIs are unchanged. (#15092)react-router- Upgrade React Router's TypeScript tooling to TypeScript 6. Runtime behavior and public APIs are unchanged. (#15092)@react-router/architect- Bump dependencies (#15080)- Bumped
@types/aws-lambdafrom^8.10.82to^8.10.161
- Bumped
@react-router/dev- Bump dependencies (#15080)- Bumped
@babel/corefrom^7.29.0to^7.29.7 - Bumped
@babel/generatorfrom^7.29.1to^7.29.7 - Bumped
@babel/parserfrom^7.29.3to^7.29.7 - Bumped
@babel/plugin-syntax-jsxfrom^7.28.6to^7.29.7 - Bumped
@babel/preset-typescriptfrom^7.28.5to^7.29.7 - Bumped
@babel/traversefrom^7.29.0to^7.29.7 - Bumped
@babel/typesfrom^7.29.0to^7.29.7 - Bumped
babel-dead-code-eliminationfrom^1.0.6to^1.0.12 - Bumped
chokidarfrom^4.0.0to^5.0.0 - Bumped
es-module-lexerfrom^1.3.1to^2.1.0 - Bumped
exit-hookfrom2.2.1to5.1.0 - Bumped
isbotfrom^5.1.11to^5.1.40 - Bumped
p-mapfrom^7.0.3to^7.0.4 - Bumped
pathefrom^1.1.2to^2.0.3 - Bumped
pkg-typesfrom^2.3.0to^2.3.1 - Bumped
react-refreshfrom^0.14.0to^0.18.0 - Bumped
semverfrom^7.8.0to^7.8.1 - Bumped
tinyglobbyfrom^0.2.14to^0.2.16 - Bumped
valibotfrom^1.4.0to^1.4.1
- Bumped
@react-router/dev- Fix Windows libuv assertion (!(handle->flags & UV_HANDLE_CLOSING)insrc/win/async.c) during prerendering by usingnode:httpinstead offetchfor internal prerender requests against the Vite preview server (#15077)@react-router/fs-routes- Bump dependencies (#15091)- Bumped
minimatchfrom^9.0.0to^10.2.5
- Bumped
@react-router/node- Bump dependencies (#15106)- Bumped
@remix-run/node-fetch-serverfrom^0.13.0to^0.13.3
- Bumped
@react-router/serve- Bump dependencies (#15091)- Bumped
@remix-run/node-fetch-serverfrom^0.13.0to^0.13.3 - Bumped
get-portfrom5.1.1to7.2.0
- Bumped
Full Changelog:
Original sourcev7.18.0...v8.0.0 - Jun 17, 2026
- Date parsed from source:Jun 17, 2026
- First seen by Releasebot:Jun 18, 2026
- Modified by Releasebot:Sep 1, 2026
v8.0.0
React Router ships v8, a major release that modernizes the platform with a new yearly cadence, ESM-only publishing, and updated baseline support for Node 22.22.0+, React 19.2.7+, and Vite 7+. It also makes future flag behaviors the default and removes several deprecated APIs.
React Router v8 is here!
We introduced a new Open Governance model last year and this marks the first major release on our new planned yearly major release cadence. We chose the June timeframe this year to align with the EOL timeframe for Node 20. Node 22 is scheduled to reach EOL in the May 2027 timeframe so we'll be aiming for a v9 release around the same time next year.
Our API Development Strategy aims to make major releases relatively boring by introducing breaking changes ahead of time behind Future Flags. If you've adopted all active future flags in v7, then from a React Router API surface you're in good shape for v8. All future.v8_* flags have been removed (or lifted to a top-level config) and their behaviors are now the default.
Baseline Support
React Router v8 updates the following minimum supported versions:
- Node 22.22.0+
- Starting with v8, React Router will officially support all Active LTS node versions and only the latest minor branch of Maintenance LTS versions
- This better allows us to bump minimum Maintenance LTS versions to account for newly released security patches
- It also allows us to more quickly and easily adopt new Active LTS features backported to Maintenance LTS lines
- Upgraded minimum Maintenance LTS versions will be done in React Router minor releases
- React 19.2.7+
- Vite 7+
To modernize the library, React Router is now published as an ESM-only module and tsconfig target/lib fields have been updated to ES2022 across the board
Adopted Future Flag Behavior
The following v8 future flags have been removed and their behaviors are now the default:
- future.v8_trailingSlashAwareDataRequests
- future.v8_passThroughRequests
- future.v8_middleware
- future.v8_viteEnvironmentApi
- future.v8_splitRouteModules has been moved to a to a top-level splitRouteModules config option and is enabled by default
Removed react-router-dom
Removed react-router-dom. In v7, we collapsed the DOM APIs into react-router/dom, but to ease the v6->v7 upgrade we continued re-exporting everything through react-router-dom. We have now dropped react-router-dom, so if you didn't get around to swapping your imports in v7, you will need to swap them to react-router and react-router/dom for v8.
Removed deprecated meta data fields
Removed deprecated meta data fields. The data fields passed to route module meta functions were deprecated in v7 and are removed in v8. Use loaderData instead of data on MetaArgs and each item in MetaArgs.matches.
Cloudflare Vite Plugin
The React Router Cloudflare dev proxy (@react-router/dev/vite/cloudflare) has been removed in v8. Cloudflare projects should use @cloudflare/vite-plugin instead.
@react-router/architect useRequestContextDomainName
The @react-router/architect createRequestHandler useRequestContextDomainName option has been removed as that is now the default behavior in v8.
Pre-rendering Flow
In v7 we had a future.unstable_previewServerPrerendering flag that would opt you into a new pre-rendering flow using the Vite preview server (leveraging the Vite environment API). Now that the Vite environment API is always available on our new Vite 7+ baseline, we dropped this flag and the preview server flow has replaced our old pre-rendering implementation. It should be a non-breaking change but if you see issues, please let us know!
Major Changes
- react-router - Update minimum Node version to 22.22.0 (#14928)
- react-router - Update minimum React version to 19.2.7 (#15062)
- react-router - Remove the future.v8_trailingSlashAwareDataRequests flag (#15100)
- Trailing slash-aware data request URLs are now the default behavior.
- react-router - Remove future.v8_passThroughRequests flag - the raw incoming request is now always passed through to loader/action. Use url for the normalized URL without React Router-specific implementation details (#15079)
- react-router - Remove future.v8_middleware flag — middleware is always enabled in v8 (#15078)
- The future.v8_middleware flag has been removed; middleware is now always enabled
- The context parameter passed to loader, action, and middleware functions is always a RouterContextProvider instance
- getLoadContext functions in custom servers must return a RouterContextProvider — returning a plain object is no longer supported
- The MiddlewareEnabled type (previously exported as UNSAFE_MiddlewareEnabled) has been removed since the conditional it gated is now unconditional
- The Future module augmentation pattern (interface Future { v8_middleware: true }) is no longer needed to type context in Data Mode
- react-router - Remove react-router-dom package (#15076)
- In v7 everything DOM-specific was collapsed into react-router/dom
- react-router-dom was kept around as a convenience so existing v6 app imports would still work
- For v8, you will need to swap react-router-dom imports:
- RouterProvider / HydratedRouter should be imported from react-router/dom
- Everything else should be imported from react-router
- @react-router/architect - Bump @architect/functions to v8 (#15106)
- @react-router/architect - Remove the useRequestContextDomainName option from createRequestHandler - this is now the default behavior (#15188)
- @react-router/dev - Remove @react-router/dev/vite/cloudflare dev proxy export; use @cloudflare/vite-plugin instead (#15077)
- Drops support for wrangler@3 as a peer dependency of @react-router/dev
- @react-router/dev - Require Vite 7+ and make the Vite Environment API build path mandatory (#15077)
Full Changelog: v7.18.0...v8.0.0
Original source - Jun 16, 2026
- Date parsed from source:Jun 16, 2026
- First seen by Releasebot:Jun 17, 2026
v7.18.0
React Router ships a release with CSRF check fixes, SSR and hydration improvements, better route matching, and adapter updates for Architect and Express. It also improves CSP nonce handling, URL normalization, and dev build behavior for cleaner deployments.
What's Changed
CSRF Check Logic Fix
We made a bug fix in our underlying CSRF checks in this release that may be a "breaking bug fix" for some users deployed behind a reverse proxy. The CSRF check now checks directly against the
hostin therequesturl provided, instead of looking directly at HTTP headers which is an adapter concern. If your adapter is not setting the expected host in the request URL, you may need to add the new internal host to yourallowedActionOriginsconfig. This is most likely to occur in@react-router/serveapps or@react-router/expressapps without thetrust proxysetting enabled. We recommend testing this against application mutation requests as part of your upgrade.Minor Changes
@react-router/architect- Add auseRequestContextDomainNameoption tocreateRequestHandlerto derive request URL hosts from the API Gateway request context (#15185)- This flag will become the default behavior in v8, so it is recommended to adopt to prepare for and to v8 better align with your deployment architecture and rely less on manual header parsing in the adapter
- See the docs for more information
Patch Changes
react-router- Fix server handler prerender responses when usingssr: falseandfuture.v8_trailingSlashAwareDataRequests: true(#15173)- Avoids false positive "SPA Mode" detection when serving prerendered paths
react-router- Use theServerRouternoncefor nonce-aware SSR components when they don't provide their own value so strict CSP pages can load them (#15170)react-router- Useturbo-streamto serialize and deserialize Framework Mode hydration errors (#15175)react-router- Optimize route matching by extending precomputed route branches to include matchers (#15186)react-router- Use the constructedrequestURLhostinstead of header checks when validating action request origins in the CSRF check (#15185)react-router- Remove the un-documented custom error serialization logic from Data Mode SSR built-in hydration flows (#15175)react-router- Validate protocols in RSC render redirects (#15177)react-router- Consolidate url normalization logic and better handle mixed slashes (#15176)@react-router/dev- Pass Viteserver.watchconfig to child compiler in development mode. (#15178)@react-router/dev- Ignore external Vite server environments in Framework Mode build hooks (#14883)- When
future.v8_viteEnvironmentApiis enabled, React Router previously treated any non-client Vite environment as its own server build - This caused issues with integrations like Nitro, where plugins can register additional environments
- Framework Mode build hooks now ignore external server environments and only process the app's own server build
- When
@react-router/express- Adjust express adapter host computation (#15185)- read port from
x-forwarded-hostbased ontrust proxysetting - handle invalid hostname characters
- read port from
Full Changelog:
Original sourcev7.17.0...v7.18.0 - Jun 16, 2026
- Date parsed from source:Jun 16, 2026
- First seen by Releasebot:Jun 17, 2026
- Modified by Releasebot:Aug 24, 2026
v7.18.0
React Router ships CSRF check fixes and several runtime improvements, including safer action origin validation, prerender and SSR updates, route matching optimizations, CSP nonce handling, URL normalization, and adapter changes for Architect and Express.
What's Changed
CSRF Check Logic Fix
We made a bug fix in our underlying CSRF checks in this release that may be a "breaking bug fix" for some users deployed behind a reverse proxy. The CSRF check now checks directly against the host in the request url provided, instead of looking directly at HTTP headers which is an adapter concern. If your adapter is not setting the expected host in the request URL, you may need to add the new internal host to your allowedActionOrigins config. This is most likely to occur in @react-router/serve apps or @react-router/express apps without the trust proxy setting enabled. We recommend testing this against application mutation requests as part of your upgrade.
Minor Changes
- @react-router/architect - Add a useRequestContextDomainName option to createRequestHandler to derive request URL hosts from the API Gateway request context (#15185)
- This flag will become the default behavior in v8, so it is recommended to adopt to prepare for and to v8 better align with your deployment architecture and rely less on manual header parsing in the adapter
- react-router - Fix server handler prerender responses when using ssr: false and future.v8_trailingSlashAwareDataRequests: true (#15173)
- Avoids false positive "SPA Mode" detection when serving prerendered paths
- react-router - Use the ServerRouter nonce for nonce-aware SSR components when they don't provide their own value so strict CSP pages can load them (#15170)
- react-router - Use turbo-stream to serialize and deserialize Framework Mode hydration errors (#15175)
- react-router - Optimize route matching by extending precomputed route branches to include matchers (#15186)
- react-router - Use the constructed request URL host instead of header checks when validating action request origins in the CSRF check (#15185)
- react-router - Remove the un-documented custom error serialization logic from Data Mode SSR built-in hydration flows (#15175)
- react-router - Validate protocols in RSC render redirects (#15177)
- react-router - Consolidate url normalization logic and better handle mixed slashes (#15176)
- @react-router/dev - Pass Vite server.watch config to child compiler in development mode. (#15178)
- @react-router/dev - Ignore external Vite server environments in Framework Mode build hooks (#14883)
- When future.v8_viteEnvironmentApi is enabled, React Router previously treated any non-client Vite environment as its own server build
- This caused issues with integrations like Nitro, where plugins can register additional environments
- Framework Mode build hooks now ignore external server environments and only process the app's own server build
- @react-router/express - Adjust express adapter host computation (#15185)
- read port from x-forwarded-host based on trust proxy setting
- handle invalid hostname characters
Full Changelog: v7.17.0...v7.18.0
Original source - Jun 4, 2026
- Date parsed from source:Jun 4, 2026
- First seen by Releasebot:Jun 5, 2026
v7.17.0
React Router ships a subset of the official docs inside the package, making Markdown docs available locally for AI coding agents and React Router agent skills. It also fixes future flag warning URLs and reduces repeated warning logs, with an unstable dev update for RSC dependency scanning.
Minor Changes
- react-router - Ship a subset of the official documentation inside the react-router package (#15121)
- Markdown docs are now available in node_modules/react-router/docs, letting AI coding agents and the React Router agent skills read official docs locally
- Excludes auto-generated API docs (api/), community/ content, and tutorials (tutorials/)
Patch Changes
- @react-router/dev - Fix future flag warning URLs and only log each future flag warning one time (#15138)
Unstable Changes
⚠️ Unstable features are not recommended for production use
- @react-router/dev - Prevent RSC route module server exports from being scanned by the client dependency optimizer when future.unstable_optimizeDeps is enabled. (#15005)
Full Changelog: v7.16.0...v7.17.0
Original source
Curated by the Releasebot team
Releasebot is an aggregator of official product update announcements from hundreds of software vendors and thousands of sources.
Our editorial process involves the manual review and audit of release notes procured with the help of automated systems.