react-router
- 8.4.0 is the latest, published 15 September 2026.
- 20 security advisories, all fixed.
- 8.x: 7 releases since 17 June 2026, 8 in the last 90 days.
Security advisories
Grouped by the version that fixes them, so one upgrade reads as one step.
Fixed in 8.3.0 · 1 advisory
- HIGHReact Router: RSC Mode CSRF Bypass Allows Action Execution Before 400 ResponseGHSA-qwww-vcr4-c8h2
Fixed in 7.18.0 · 4 advisories
- HIGHReact Router: Unauthenticated Denial of Service via Inefficient Route MatchingGHSA-chx6-hx7r-mcp5
- MODERATEReact Router: Arbitrary Constructor Injection via deserializeErrors() in React Router SSR HydrationGHSA-337j-9hxr-rhxg
- MODERATEReact Router: RSCErrorHandler Missing Protocol Validation (XSS)GHSA-h8fp-f39c-q6mh
1 more
- MODERATEReact Router: Open redirect via backslash in <Link> and useNavigate (CVE-2025-68470 bypass)GHSA-wrjc-x8rr-h8h6
Fixed in 7.15.1 · 1 advisory
- LOWReact Router: Potential CSRF via PUT/PATCH/DELETE document requestsGHSA-84g9-w2xq-vcv6
Fixed in 7.15.0 · 1 advisory
- HIGHReact Router vulnerable to DoS via unbounded path expansion in __manifest endpointGHSA-8x6r-g9mw-2r78
9 older fixes
Fixed in 7.14.2 · 1 advisory
Fixed in 7.14.1 · 1 advisory
Fixed in 7.14.0 · 1 advisory
- HIGHReact Router vulnerable to Denial of Service via reflected user input in single-fetchGHSA-rxv8-25v2-qmq8
Fixed in 7.13.2 · 2 advisories
- HIGHReact Router vulnerable to XSS in unstable RSC redirect handling via javascript: redirect targetsGHSA-8646-j5j9-6r62
- MODERATEReact Router has stored XSS via unescaped Location header in prerendered redirect HTMLGHSA-f22v-gfqf-p8f3
Fixed in 7.13.0 · 1 advisory
- MODERATEReact Router: Open redirect leading to XSSGHSA-jjmj-jmhj-qwj2
Fixed in 7.12.0 · 3 advisories
- HIGHReact Router vulnerable to XSS via Open RedirectsGHSA-2w69-qvjg-hvjx
- HIGHReact Router SSR XSS in ScrollRestorationGHSA-8v8x-cx79-35w7
- MODERATEReact Router has CSRF issue in Action/Server Action Request ProcessingGHSA-h5cw-625j-3rxh
Fixed in 7.9.6 · 1 advisory
- MODERATEReact Router has unexpected external redirect via untrusted pathsGHSA-9jcx-v3wj-wh4m
Fixed in 7.9.0 · 1 advisory
- HIGHReact Router has XSS VulnerabilityGHSA-3cgp-3xvw-98x8
Fixed in 7.5.2 · 2 advisories
- HIGHReact Router allows pre-render data spoofing on React-Router framework modeGHSA-cpj6-fhp6-mr6j
- HIGHReact Router allows a DoS via cache poisoning by forcing SPA modeGHSA-f46r-rw29-r322
Releases in the last 90 days
Feed of releases and advisoriesEvery stable release, newest first. Notes are quoted as the maintainers published them.
8.4.0
15 September 2026Deprecate the createStaticRouter({ branches }) option
Section of a shared release note
Minor Changes
- deprecated
Deprecate the
createStaticRouter({ branches })optioncreateStaticRouternow caches route branches internally, ignoresbranches, and logs a deprecation warning when the option is providedThe deprecated
EntryContext.branchesproperty remains available for compatibility but is always an empty array
Patch Changes
Prevent stale route discovery during manifest version-mismatch recovery
Keep concurrent manifest responses pending while a document reload is in progress
Report a discovery error when a previous reload failed to resolve a version mismatch instead of loading a stale route or reloading repeatedly
Fail pending requests if a document reload does not complete within five seconds or the document is restored from the back-forward cache, allowing subsequent requests to recover
Preserve lazy route module import errors during SPA navigations instead of replacing them with a missing
dataStrategyresult errorSwitch to more granular internal router contexts to avoid unnecessary route component re-renders when unrelated data router state changes
⚠️ This contains some breaking changes to exported
UNSAFE_contexts, so please review carefully if you are using those unsafe exports
Correctly escape streamed RSC redirect locations in meta tag attributes
Avoid unintended
document.startViewTransitioncalls during initial hydration androuter.revalidate()callsFix
SingleFetchNoResultErrorthrown when a fetcher revalidates against a splat route during lazy route discoveryTrack discovery per fetcher load so revalidation waits for the current load's discovery, even when the fetcher key is reused, while still restarting interrupted loaders after discovery completes
Preserve the underlying decode failure as the
causeof theUnable to decode turbo-stream responseerror
Unstable Changes
⚠️ Unstable features are not recommended for production use
Add a Data Mode
future.unstable_routePatternMatchingflag for more efficient route matching powered by@remix-run/route-patternAdd an
unstable_validateParamsroute field to reject invalid parameter values and continue matching
Document access control requirements for RSC Server Functions
Treat every Server Function as a public endpoint that must perform all of its own access control checks
Recommend route actions when access control should be provided by route middleware
- deprecated
7.18.4
15 September 20268.3.1
28 August 2026Fix Expected fetcher: error thrown on navigation when a fetcher is aborted during its post-action revalidation
Section of a shared release note
Patch Changes
Fix
Expected fetcher: <key>error thrown on navigation when a fetcher is aborted during its post-action revalidationFix 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
Improve route matching performance for long paths
Improve validation of action request origins
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 renderedProperly respect the
relativeoption inuseSubmit/fetcher.submitwhen resolivng theactionpathAdd additional URL validation on client side navigations/redirects
7.18.3
28 August 20266.30.6
18 August 20266.30.5
18 August 20267.18.2
28 July 20268.3.0
22 July 2026Encode path params in href/generatePath per RFC 3986 path-segment rules instead of encodeURIComponent
Section of a shared release note
Patch Changes
Encode path params in
href/generatePathper RFC 3986 path-segment rules instead ofencodeURIComponentCharacters 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%2B1Structural/unsafe characters (
/ ? # %, whitespace, non-ASCII) are still escaped exactly as before
Use
crypto.randomUUID()forcreateMemorySessionStoragesession idscreateMemorySessionStorageis only intended for local development and testing - sessions are lost when the server restarts
Fix
NavLinknot applying itspendingstate whentohas a trailing slashPreserve RSC route component metadata so routes with a
clientLoadercan skip unnecessary server requests once their components have rendered while still fetching missing server-rendered elementsHarden RSC CSRF code paths
Fix server crash (
TypeError: Invalid state: Unable to enqueue) when a request is aborted while the RSC HTML stream has a pending flushHandle cancellation of the
injectRSCPayloadreadable side, clear the pending flush, and cancel the underlying RSC payload stream
Unstable Changes
⚠️ Unstable features are not recommended for production use
Detect stale RSC clients during lazy route discovery and reload the destination document
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, });- breaking
Add CSP nonce support to RSC document rendering
Add
nonceoptions tounstable_routeRSCServerRequestandunstable_RSCStaticRouterForward 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(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}'`, );
Major versions
- 8.xsince 17 June 2026 · latest 8.4.0 · 7 releases
- 7.xsince 22 November 2024 · latest 7.18.4 · 52 releases
- 6.xsince 3 November 2021 · latest 6.30.6 · 70 releases
- 5.xsince 18 March 2019 · latest 5.3.4 · 11 releases
- 4.xsince 11 March 2017 · latest 4.4.0 · 8 releases
- 3.xsince 25 October 2016 · latest 3.2.6 · 14 releases
- 2.xsince 10 February 2016 · latest 2.8.1 · 19 releases
- 1.xsince 9 November 2015 · latest 1.0.3 · 4 releases
- 0.xsince 2 February 2014 · latest 0.13.6 · 42 releases
Quality and security signals
What npm and deps.dev say about the latest release. Signals, not a verdict.
Reading npm and deps.dev…
Registry facts last checked 15 October 2026. Releases and advisories last read 15 October 2026.
Know when your own dependencies move
Inlinr tracks your coding time automatically. Switch dependency tracking on for a project and it reads that repository's manifest to show what is behind and what has been deprecated — off by default, one project at a time.