Packages

react-router

8.4.0MIT
  • 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.

9 older fixes

Releases in the last 90 days

Feed of releases and advisories

Every stable release, newest first. Notes are quoted as the maintainers published them.

  1. 8.4.0

    15 September 2026
    Deprecate the createStaticRouter({ branches }) option

    Section of a shared release note

    Minor Changes

    • deprecated

      Deprecate the createStaticRouter({ branches }) option

      • createStaticRouter now caches route branches internally, ignores branches, and logs a deprecation warning when the option is provided

      • The deprecated EntryContext.branches property 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 dataStrategy result error

    • Switch 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.startViewTransition calls during initial hydration and router.revalidate() calls

    • Fix SingleFetchNoResultError thrown when a fetcher revalidates against a splat route during lazy route discovery

      • Track 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 cause of the Unable to decode turbo-stream response error

    Unstable Changes

    ⚠️ Unstable features are not recommended for production use

    • Add a Data Mode future.unstable_routePatternMatching flag for more efficient route matching powered by @remix-run/route-pattern

      • Add an unstable_validateParams route 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

  2. 7.18.4

    15 September 2026
  3. 8.3.1

    28 August 2026
    Fix 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 revalidation

    • 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

    • Improve route matching performance for long paths

    • Improve validation of action request origins

    • Fix <ScrollRestoration> 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

    • Properly respect the relative option in useSubmit/fetcher.submit when resolivng the action path

    • Add additional URL validation on client side navigations/redirects

  4. 7.18.3

    28 August 2026
  5. 6.30.6

    18 August 2026
  6. 6.30.5

    18 August 2026
  7. 7.18.2

    28 July 2026
  8. 8.3.0

    22 July 2026
    Encode 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/generatePath per RFC 3986 path-segment rules instead of encodeURIComponent

      • 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

    • Use crypto.randomUUID() for createMemorySessionStorage session ids

      • createMemorySessionStorage is only intended for local development and testing - sessions are lost when the server restarts

    • Fix NavLink not applying its pending state when to has a trailing slash

    • 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

    • Harden 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 flush

      • Handle cancellation of the injectRSCPayload readable 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.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,
    });
    • breaking

      Add CSP nonce support to RSC document rendering

      • 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}'`,
      );
All 227 releases

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.