React Router Updates & Release Notes

Follow

84 updates curated from 2 sources by the Releasebot Team. Last updated: Jul 10, 2026

Get this feed:
  • Jul 8, 2026
    • Date parsed from source:
      Jul 8, 2026
    • First seen by Releasebot:
      Jul 10, 2026
    Remix logo

    React Router by Remix

    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.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

    Full Changelog: v8.1.0...v8.2.0

    Original source
  • Jul 8, 2026
    • Date parsed from source:
      Jul 8, 2026
    • First seen by Releasebot:
      Jul 9, 2026
    Remix logo

    React Router by Remix

    v8.2.0

    React Router ships Web Streams defaults for non-Node Framework mode apps, adds an opt-in flag for Node apps, and improves route matching, navigation blockers, and param handling. It also adds package manager detection updates and several developer experience fixes.

    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

    Full Changelog: v8.1.0...v8.2.0

    Original source
  • All of your release notes in one feed

    Join Releasebot and get updates from Remix and hundreds of other software products.

    Create account
  • Jun 29, 2026
    • Date parsed from source:
      Jun 29, 2026
    • First seen by Releasebot:
      Jun 30, 2026
    Remix logo

    React Router by Remix

    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-router

    create-react-router can 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 --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) {
          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-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

    Patch Changes

    • @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.0.1...v8.1.0

    Original source
  • Jun 29, 2026
    • Date parsed from source:
      Jun 29, 2026
    • First seen by Releasebot:
      Jun 30, 2026
    • Modified by Releasebot:
      Jul 7, 2026
    Remix logo

    React Router by Remix

    v8.1.0

    React Router adds agent skills setup in create-react-router, with new projects including the official React Router agent skill by default and an opt-out flag. It also improves instrumentation metadata for routes and server handlers, plus several dev and serve fixes.

    What's Changed

    Agent Skills Installation via create-react-router

    create-react-router can 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 --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) {
          instrument(handler)
        }
      }
    ];
    

    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-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

    Patch Changes

    • @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.0.1...v8.1.0

    Original source
  • Jun 18, 2026
    • Date parsed from source:
      Jun 18, 2026
    • First seen by Releasebot:
      Jun 19, 2026
    Remix logo

    React Router by Remix

    v8.0.1

    React Router removes the obsolete AppLoadContext export in a patch update.

    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
  • Similar to React Router with recent updates:

  • Jun 18, 2026
    • Date parsed from source:
      Jun 18, 2026
    • First seen by Releasebot:
      Jun 18, 2026
    Remix logo

    React Router by Remix

    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
    Remix logo

    React Router by Remix

    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/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

    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

    The data fields passed to route module meta functions were deprecated in v7 and are remove din 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 (.data suffixes, index/_routes search params). (#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 future.v8_passThroughRequests flag - the raw incoming request is now always passed through to loader/action. (#15079)
    • react-router - Move future.v8_splitRouteModules to a top-level splitRouteModules config option and change the default behavior to true (#15086)
      • Set splitRouteModules: false to keep route modules in a single chunk
      • Set splitRouteModules: "enforce" to require all routes to be splittable
    • @react-router/dev - Removed the future.v8_viteEnvironmentApi flag because the Vite Environment API is always enabled (#15077)
    • @react-router/dev - Removed the future.unstable_previewServerPrerendering flag and make prerendering with the Vite Environment API the default. (#15077)
    • react-router - Update tsconfig.json target/lib from ES2020 -> ES2022 (591853e)
    • react-router - Switch the published packages in packages/ to ESM-only. (#14895) (59ebcf1)
    • react-router - Remove deprecated data parameter in favor of loaderData for meta APIs (to align with Route.ComponentProps) (#14931)
      • Route.MetaArgs, Route.MetaMatch, MetaArgs, MetaMatch, Route.ComponentProps.matches, UIMatch
    • react-router - Remove internal hasErrorBoundary field added to router.routes when 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 ErrorBoundary or errorElement on your route
      • hasErrorBoundary is no longer accepted on RouteObject (IndexRouteObject/NonIndexRouteObject), DataRouteObject, <Route> JSX props, or as a key in lazy route definitions.
      • The MapRoutePropertiesFunction signature no longer requires returning hasErrorBoundary; the router infers it directly.
    • 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)
    • @react-router/express - Bump dependencies (#15106)
      • Bumped express from ^4.19.2 to ^4.22.2
      • Bumped the express peer dependency from ^4.17.1 || ^5 to ^4.22.2 || ^5
      • Bumped @types/express from ^4.17.9 to ^4.17.25
    • @react-router/node - Switch from @mjackson/node-fetch-server to @remix-run/node-fetch-server now that we can directly use ESM-only packages (#14930)
    • @react-router/serve - Switch from @mjackson/node-fetch-server to @remix-run/node-fetch-server now that we can directly use ESM-only packages (#14930)
    • create-react-router - Switch from @remix-run/web-fetch to native fetch internally. (#14929)
      • This removes the underlying HTTPS_PROXY support that node-fetch and subsequently @remix-run/web-fetch supported

    Minor Changes

    • react-router - Bump dependencies (#15080)
      • Bumped cookie from ^1.0.1 to ^1.1.1
      • Bumped set-cookie-parser from ^2.6.0 to ^3.1.0
    • @react-router/cloudflare - Bump @cloudflare/workers-types fromn ^4.20260520.1 to ^4.20260527.1 (#15106)
    • @react-router/dev - Bump dependencies (#15080)
      • Bumped @babel/core from ^7.27.7 to ^7.29.7
      • Bumped @babel/generator from ^7.27.5 to ^7.29.7
      • Bumped @babel/parser from ^7.27.7 to ^7.29.7
      • Bumped @babel/plugin-syntax-jsx from ^7.27.1 to ^7.29.7
      • Bumped @babel/preset-typescript from ^7.27.1 to ^7.29.7
      • Bumped @babel/traverse from ^7.27.7 to ^7.29.7
      • Bumped @babel/types from ^7.27.7 to ^7.29.7
      • Bumped babel-dead-code-elimination from ^1.0.6 to ^1.0.12
      • Bumped chokidar from ^4.0.0 to ^5.0.0
      • Bumped es-module-lexer from ^1.3.1 to ^2.1.0
      • Bumped exit-hook from 2.2.1 to 5.1.0
      • Bumped isbot from ^5.1.11 to ^5.1.40
      • Bumped p-map from ^7.0.3 to ^7.0.4
      • Bumped pathe from ^1.1.2 to ^2.0.3
      • Bumped pkg-types from ^2.3.0 to ^2.3.1
      • Bumped react-refresh from ^0.14.0 to ^0.18.0
      • Bumped semver from ^7.8.0 to ^7.8.1
      • Bumped tinyglobby from ^0.2.14 to ^0.2.16
      • Bumped valibot from ^1.4.0 to ^1.4.1
    • @react-router/dev - Replace cookie and set-cookie-parser with cookie-es (#15109)
    • @react-router/dev - Removed the vite-node dependency in favor of Vite's native module runner APIs (#15104)
    • @react-router/serve - Bump express from 4.21.2 to 5.2.1 (#15101)
    • create-react-router - Bump dependencies (#15080)
      • Bumped execa from 5.1.1 to 9.6.1
      • Bumped log-update from ^5.0.1 to ^8.0.0
      • Bumped semver from ^7.3.7 to ^7.8.1
      • Bumped sort-package-json from ^1.55.0 to ^3.6.1
      • Bumped strip-ansi from ^6.0.1 to ^7.2.0
      • Bumped tar-fs from ^2.1.3 to ^3.1.2

    Patch Changes

    • react-router - Ensure client middleware errors load lazy route error boundaries before bubbling (#15086)
    • react-router - Remove explicit onSubmit type override from SharedFormProps to 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 from tsup to tsdown. 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-lambda from ^8.10.82 to ^8.10.161
    • @react-router/dev - Bump dependencies (#15080)
      • Bumped @babel/core from ^7.29.0 to ^7.29.7
      • Bumped @babel/generator from ^7.29.1 to ^7.29.7
      • Bumped @babel/parser from ^7.29.3 to ^7.29.7
      • Bumped @babel/plugin-syntax-jsx from ^7.28.6 to ^7.29.7
      • Bumped @babel/preset-typescript from ^7.28.5 to ^7.29.7
      • Bumped @babel/traverse from ^7.29.0 to ^7.29.7
      • Bumped @babel/types from ^7.29.0 to ^7.29.7
      • Bumped babel-dead-code-elimination from ^1.0.6 to ^1.0.12
      • Bumped chokidar from ^4.0.0 to ^5.0.0
      • Bumped es-module-lexer from ^1.3.1 to ^2.1.0
      • Bumped exit-hook from 2.2.1 to 5.1.0
      • Bumped isbot from ^5.1.11 to ^5.1.40
      • Bumped p-map from ^7.0.3 to ^7.0.4
      • Bumped pathe from ^1.1.2 to ^2.0.3
      • Bumped pkg-types from ^2.3.0 to ^2.3.1
      • Bumped react-refresh from ^0.14.0 to ^0.18.0
      • Bumped semver from ^7.8.0 to ^7.8.1
      • Bumped tinyglobby from ^0.2.14 to ^0.2.16
      • Bumped valibot from ^1.4.0 to ^1.4.1
    • @react-router/dev - Fix Windows libuv assertion (!(handle->flags & UV_HANDLE_CLOSING) in src/win/async.c) during prerendering by using node:http instead of fetch for internal prerender requests against the Vite preview server (#15077)
    • @react-router/fs-routes - Bump dependencies (#15091)
      • Bumped minimatch from ^9.0.0 to ^10.2.5
    • @react-router/node - Bump dependencies (#15106)
      • Bumped @remix-run/node-fetch-server from ^0.13.0 to ^0.13.3
    • @react-router/serve - Bump dependencies (#15091)
      • Bumped @remix-run/node-fetch-server from ^0.13.0 to ^0.13.3
      • Bumped get-port from 5.1.1 to 7.2.0

    Full Changelog: v7.18.0...v8.0.0

    Original source
  • Jun 17, 2026
    • Date parsed from source:
      Jun 17, 2026
    • First seen by Releasebot:
      Jun 18, 2026
    • Modified by Releasebot:
      Jul 7, 2026
    Remix logo

    React Router by Remix

    v8.0.0

    React Router ships v8 with a major platform refresh, making middleware and trailing slash handling the default, switching to ESM-only, raising Node, React, and Vite baselines, and removing deprecated flags and react-router-dom for a cleaner yearly release.

    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, 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

    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 (.data suffixes, index/_routes search params). (#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 future.v8_passThroughRequests flag - the raw incoming request is now always passed through to loader/action. (#15079)
    • react-router - Move future.v8_splitRouteModules to a top-level splitRouteModules config option and change the default behavior to true (#15086)
      • Set splitRouteModules: false to keep route modules in a single chunk
      • Set splitRouteModules: "enforce" to require all routes to be splittable
    • @react-router/dev - Removed the future.v8_viteEnvironmentApi flag because the Vite Environment API is always enabled (#15077)
    • @react-router/dev - Removed the future.unstable_previewServerPrerendering flag and make prerendering with the Vite Environment API the default. (#15077)
    • react-router - Update tsconfig.json target/lib from ES2020 -> ES2022 (#591853e)
    • react-router - Switch the published packages in packages/ to ESM-only. (#14895)
    • react-router - Remove deprecated data parameter in favor of loaderData for meta APIs (to align with Route.ComponentProps) (#14931)
    • react-router - Remove internal hasErrorBoundary field added to router.routes when 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 ErrorBoundary or errorElement on your route
      • hasErrorBoundary is no longer accepted on RouteObject (IndexRouteObject/NonIndexRouteObject), DataRouteObject, JSX props, or as a key in lazy route definitions.
    • react-router - Remove react-router-dom package (#15076)
      • In v7 everything DOM-specific was collapsed 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.

    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
    Remix logo

    React Router by Remix

    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 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
      • See the docs for more information

    Patch Changes

    • 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 16, 2026
    • Date parsed from source:
      Jun 16, 2026
    • First seen by Releasebot:
      Jun 17, 2026
    • Modified by Releasebot:
      Jun 23, 2026
    Remix logo

    React Router by Remix

    v7.18.0

    React Router ships a bug-fix release with stronger CSRF handling, better SSR and hydration behavior, faster route matching, and adapter updates for Express and Architect. It also improves URL normalization, CSP nonce support, and Framework Mode build handling.

    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
      • See the docs for more information

    Patch Changes

    • 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
    Remix logo

    React Router by Remix

    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
  • Jun 4, 2026
    • Date parsed from source:
      Jun 4, 2026
    • First seen by Releasebot:
      Jun 5, 2026
    Remix logo

    React Router by Remix

    v7.17.0

    React Router ships a subset of its official documentation inside the react-router package, making local docs available in node_modules/react-router/docs for AI coding agents and React Router agent skills, while also fixing future flag warning behavior and an unstable dependency scan issue.

    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
  • May 28, 2026
    • Date parsed from source:
      May 28, 2026
    • First seen by Releasebot:
      May 29, 2026
    Remix logo

    React Router by Remix

    v7.16.0

    React Router stabilizes trailing-slash-aware data requests and adds pre-v8 future flag warnings, helping teams prepare for the next major release with mostly zero-code-change adoption. This update also includes several router, Node, Express, and serve fixes.

    What's Changed

    Stabilized future.v8_trailingSlashAwareDataRequests

    We've stabilized this flag in preparation for the upcoming v8 release. Unless you are doing specific path-inspection on .data requests or have specific CDN/caching/pre-rendering logic around .data requests, this should largely be a zero-code-change adoptions. Please see the docs for more info.

    Pre-v8 Future Flag Warnings

    In preparation for the upcoming v8 release, 7.16.0 begins logging console warnings during builds for future flags that you have not enabled yet. If you have all future flags enabled, the v8 upgrade should be mostly non-breaking (short of some underlying dependency minimum versions bumps - React 19, Node 22.12, Vite 7). You can suppress these warnings until you are ready top adopt flags by setting an explicit false in your react-router.config.ts.

    Minor Changes

    • react-router - Stabilize future.unstable_trailingSlashAwareDataRequests as future.v8_trailingSlashAwareDataRequests (#15098)
    • @react-router/dev - Log future flag warnings for upcoming React Router v8 flags (#15029)
      • v8_middleware, v8_splitRouteModules, v8_viteEnvironmentApi, v8_passThroughRequests, v8_trailingSlashAwareDataRequests

    Patch Changes

    • react-router - Disable manifest path when lazy route discovery is disabled (#15068)
    • react-router - Fix browser URL creation to use the configured history window instead of the global window (#15066)
      • Pass the history/router window through to createBrowserURLImpl so custom window contexts keep the correct URL origin.
    • react-router - Fix useNavigation() return type to preserve discriminated union across navigation states (#15095)
    • react-router - Widen MetaDescriptor script:ld+json type from LdJsonObject to LdJsonObject | LdJsonObject[] to permit multiple JSON-LD schemas in a single <script type="application/ld+json"> tag emitted by <Meta /> (#15082)
    • react-router-dom - Remove stale/invalid unpkg field from package.json (#15075)
      • This was removed from other packages with the release of v7 but missed in the react-router-dom re-export package
    • @react-router/express - Ignore writes after Express responses close (#15107)
      • Avoid surfacing client disconnects as adapter errors when the response stream has already been destroyed or ended
    • @react-router/node - Honor Node writable backpressure in writeReadableStreamToWritable and writeAsyncIterableToWritable (#15071)
      • Await 'drain' when writable.write() returns false instead of letting chunks accumulate in the writable's internal buffer
      • Reject (rather than hang) if the writable errors or closes mid-stream
    • @react-router/serve - Normalize assetsBuildDirectory path separators in react-router-serve so Windows-built server artifacts can serve /assets/* correctly when run on Linux (#14982)

    Full Changelog: v7.15.1...v7.16.0

    Original source
  • May 28, 2026
    • Date parsed from source:
      May 28, 2026
    • First seen by Releasebot:
      May 28, 2026
    • Modified by Releasebot:
      Jun 23, 2026
    Remix logo

    React Router by Remix

    v7.16.0

    React Router releases v7.16.0 with stability updates for future v8 trailing slash data requests, new warnings for upcoming v8 flags, and a series of fixes across routing, metadata, Express, Node, and serve behavior.

    Minor Changes

    • react-router - Stabilize future.unstable_trailingSlashAwareDataRequests as future.v8_trailingSlashAwareDataRequests (#15098)
    • @react-router/dev - Stabilize future.unstable_trailingSlashAwareDataRequests as future.v8_trailingSlashAwareDataRequests (#15098)
      • The unstable flag is no longer supported and will error during config resolution
    • @react-router/dev - Log future flag warnings for upcoming React Router v8 flags (#15029)
      • v8_middleware, v8_splitRouteModules, v8_viteEnvironmentApi, v8_passThroughRequests, v8_trailingSlashAwareDataRequests

    Patch Changes

    • react-router - Disable manifest path when lazy route dicovery is disabled (#15068)
    • react-router - Fix browser URL creation to use the configured history window instead of the global window. (#15066)
      • Pass the history/router window through to createBrowserURLImpl so custom window contexts keep the correct URL origin.
    • react-router - Fix useNavigation() return type to preserve discriminated union across navigation states (#15095)
    • react-router - Widen MetaDescriptor script:ld+json type from LdJsonObject to LdJsonObject | LdJsonObject[] to permit multiple JSON-LD schemas in a single
    Original source
  • May 14, 2026
    • Date parsed from source:
      May 14, 2026
    • First seen by Releasebot:
      May 16, 2026
    Remix logo

    React Router by Remix

    v7.15.1

    React Router adds an unstable `useRouterState` hook that unifies access to active and pending router state, while also improving fetcher stability and fixing several router, SSR, SPA, and Vite basename issues.

    What's New

    useRouterState (unstable)

    Following our Less is More design goal, this release includes a new unstable_useRouterState() hook (Framework + Data Mode) that consolidates access to active and pending router states (RFC, Roadmap Issue).

    This should allow you to consolidate usages of a bunch of different hooks which will likely be marked deprecated later on in v8 and potentially removed in an eventual v9:

    let { active, pending } = unstable_useRouterState();
    
    // Active is always populated with the current location
    active.location; // replaces `useLocation()`
    active.searchParams; // replaces `useSearchParams()[0]`
    active.params; // replaces `useParams()`
    active.matches; // replaces `useMatches()`
    active.type; // replaces `useNavigationType()`
    
    // Pending is only populated during a navigation
    pending.location; // replaces `useNavigation().location`
    pending.searchParams; // equivalent to `new URLSearchParams(useNavigation().search)`
    pending.params; // Not directly accessible today
    pending.matches; // Not directly accessible today
    pending.type; // Not directly accessible today
    pending.state; // replaces `useNavigation().state`
    pending.formMethod; // replaces useNavigation().formMethod
    pending.formAction; // replaces useNavigation().formAction
    pending.formEncType; // replaces useNavigation().formEncType
    pending.formData; // replaces useNavigation().formData
    pending.json; // replaces useNavigation().json
    pending.text; // replaces useNavigation().text
    

    Patch Changes

    • react-router - Memoize useFetchers to return a stable identity and only change if fetchers changed (#15028)
    • react-router - Update router to operate on fetcher Maps in an immutable manner to avoid delayed React renders from potentially reading an updated but not yet committed Map. This could result in brief flickers in some fetcher-driven optimistic UI scenarios (#15028)
    • react-router - Fix serverLoader() returning stale SSR data when a client navigation aborts pending hydration before the hydration clientLoader resolves (#15022)
    • react-router - Fix RouterProvider onError callback not being called for synchronous initial loader errors in SPA mode (#15039) (#14942)
    • react-router - Internal refactor to consolidate mutation request detection through shared utility (#15033)
    • @react-router/dev - Fix basename conflicting with app directory name when Vite base is set (#15027)
      • When the Vite base config and React Router basename both match the app directory name (e.g. base: "/app/", basename: "/app/"), Vite would strip the base prefix from server-build virtual module import paths, causing "Failed to load url /root.tsx" errors
      • The fix uses /@fs/ absolute paths for those imports to bypass Vite's base-stripping logic

    Unstable Changes

    ⚠️ Unstable features are not recommended for production use

    • react-router - Add a new unstable_useRouterState() hook that consolidates access to active and pending router states (RFC: #12358) (#15017)
      • Data/Framework/RSC only — throws when used without a data router

    Full Changelog: v7.15.0...v7.15.1

    Original source
Releasebot

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.