Remix Release Notes
69 release notes curated from 2 sources by the Releasebot Team. Last updated: May 16, 2026
Remix Products
- May 14, 2026
- Date parsed from source:May 14, 2026
- First seen by Releasebot:May 16, 2026
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().textPatch Changes
react-router- MemoizeuseFetchersto 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- FixserverLoader()returning stale SSR data when a client navigation aborts pending hydration before the hydrationclientLoaderresolves (#15022)react-router- FixRouterProvideronErrorcallback 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- Fixbasenameconflicting withappdirectory name when Vitebaseis set (#15027)- When the Vite
baseconfig and React Routerbasenameboth 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
- When the Vite
Unstable Changes
⚠️ Unstable features are not recommended for production use
react-router- Add a newunstable_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:
Original sourcev7.15.0...v7.15.1 - May 14, 2026
- Date parsed from source:May 14, 2026
- First seen by Releasebot:May 15, 2026
- Modified by Releasebot:May 16, 2026
v7.15.1
React Router adds unstable_useRouterState, a new hook that consolidates access to active and pending router state in Data and Framework mode. The release also improves fetcher handling and fixes several SSR, loader, and Vite basename issues.
What's New
useRouterState (unstable)
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().textPatch 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 All of your release notes in one feed
Join Releasebot and get updates from Remix and hundreds of other software products.
- May 5, 2026
- Date parsed from source:May 5, 2026
- First seen by Releasebot:May 16, 2026
v7.15.0
React Router ships API stabilizations ahead of v8, renaming several unstable flags and props, and improves route matching performance in Framework and Data mode for faster server-side requests and client navigations.
What's Changed
Stabilizations
We've stabilized a bunch of APIs in this release in preparation for a React Router v8 release hopefully in the next month or two. These flag/prop renames are breaking changes if you've already opted into the unstable APIs so please make sure you make the appropriate changes if so.
future.unstable_passThroughRequests→future.v8_passThroughRequestsfuture.unstable_subResourceIntegrity→ top-levelconfig.subResourceIntegrityprerender.unstable_concurrency→prerender.concurrencyunstable_url→url(loader, action, middleware, instrumentation args)unstable_instrumentations→instrumentations- Plus associated types (
ServerInstrumentation,ClientInstrumentation, etc.)
- Plus associated types (
unstable_pattern→pattern(loader, action, middleware, instrumentation args)unstable_defaultShouldRevalidate→defaultShouldRevalidateunstable_useTransitions→useTransitionsunstable_mask→mask(on<Link>,useLinkClickHandler,useNavigate, andLocation)
Route matching optimizations
We've added a handful of route matching optimizations in this release for Framework and Data mode. The changes are mostly related to caching the internal flattened/ranked route branches and reducing additional calls to
matchRoutesalong the critical path. This should result in improved performance during both server-side request handling and client-side navigations.Minor Changes
react-router- Stabilizeunstable_defaultShouldRevalidateasdefaultShouldRevalidateon<Link>,<Form>,useLinkClickHandler,useSubmit,fetcher.submit, andsetSearchParams(14999)- ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
react-router- Stabilize the instrumentation APIs (14999)unstable_instrumentationsis nowinstrumentationsunstable_patternis nowpattern- The
unstable_ServerInstrumentation,unstable_ClientInstrumentation,unstable_InstrumentRequestHandlerFunction,unstable_InstrumentRouterFunction,unstable_InstrumentRouteFunction, andunstable_InstrumentationHandlerResulttypes have had theirunstable_prefixes removed - ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
react-router- Stabilizeunstable_maskasmaskon<Link>,useLinkClickHandler, anduseNavigate, and rename the correspondingLocation.unstable_maskfield toLocation.mask(14999)- ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
react-router- Stabilize theunstable_normalizePathoption onstaticHandler.queryandstaticHandler.queryRouteasnormalizePath(14999)- ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
react-router- Stabilizefuture.unstable_passThroughRequestsasfuture.v8_passThroughRequests(14999)- ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
react-router- Removeunstable_subResourceIntegrityfrom the runtimeFutureConfigtype; the flag is now controlled by the top-levelsubResourceIntegrityoption inreact-router.config.ts(14999)- ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
react-router- Stabilizeunstable_urlasurlonloader,action, andmiddlewarefunction args (14999)- ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
react-router- Stabilizeunstable_useTransitionsasuseTransitionson<BrowserRouter>,<HashRouter>,<HistoryRouter>,<MemoryRouter>,<Router>,<RouterProvider>,<HydratedRouter>, anduseLinkClickHandler(14999)- ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
@react-router/dev- Stabilizefuture.unstable_passThroughRequestsasfuture.v8_passThroughRequests(14999)- ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
@react-router/dev- Stabilizeprerender.unstable_concurrencyasprerender.concurrency(14999)- ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
@react-router/dev- Stabilizefuture.unstable_subResourceIntegrityas a top-levelsubResourceIntegrityconfig option inreact-router.config.ts(14999)- ⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly
Patch Changes
react-router- Addnonceto<Scripts><link rel="modulepreload">elements (if provided) (af5d49b)react-router- Fix a bug withunstable_defaultShouldRevalidate={false}where parent routes that did not export ashouldRevalidatefunction could be incorrectly included in the single fetch call for new child route data (#15012)react-router- Markmaskas an optional field inLocationfor easier mocking in unit tests (#14999)react-router- Improve server-side route matching performance by pre-computing flattened/cached route branches (#14967)- Performance benchmarks showed roughly a 10-15% improvement in server-side request handling performance
react-router- Cache flattened/ranked route branches to optimize server-side route matching (#14967)react-router- Improve route matching performance in Framework/Data Mode (#14971)- Avoiding unnecessary calls to
matchRoutesin data router scenarios- This includes adding back the optimization that was removed in
7.6.0(#13562) - The issues that prompted the revert have been addressed by using the available router
matchesbut always updatingmatch.routeto the latest route in themanifest
- This includes adding back the optimization that was removed in
- Leverage pre-computed pre-computing flattened/cached route branches during client side route matching
- Performance benchmarks showed roughly a 15-30% improvement in server-side request handling performance
- Avoiding unnecessary calls to
Full Changelog:
Original sourcev7.14.2...v7.15.0 - May 5, 2026
- Date parsed from source:May 5, 2026
- First seen by Releasebot:May 6, 2026
- Modified by Releasebot:May 22, 2026
v7.15.0
React Router releases v7.15.0 with stabilized APIs ahead of v8, route matching performance improvements, and several bug fixes. It also adds a new unstable_useRouterState hook and support for redirects from client-side middleware.
What's Changed
Stabilizations
We've stabilized a bunch of APIs in this release in preparation for a React Router v8 release hopefully in the next month or two. These flag/prop renames are breaking changes if you've already opted into the unstable APIs so please make sure you make the appropriate changes if so.
- future.unstable_passThroughRequests → future.v8_passThroughRequests
- future.unstable_subResourceIntegrity → top-level config.subResourceIntegrity
- prerender.unstable_concurrency → prerender.concurrency
- unstable_url → url (loader, action, middleware, instrumentation args)
- unstable_instrumentations → instrumentations
Plus associated types (ServerInstrumentation, ClientInstrumentation, etc.) - unstable_pattern → pattern (loader, action, middleware, instrumentation args)
- unstable_defaultShouldRevalidate → defaultShouldRevalidate
- unstable_useTransitions → useTransitions
- unstable_mask → mask (on , useLinkClickHandler, useNavigate), and rename the corresponding Location.unstable_mask field to Location.mask (#14999)
Route matching optimizations
We've added a handful of route matching optimizations in this release for Framework and Data mode. The changes are mostly related to caching the internal flattened/ranked route branches and reducing additional calls to matchRoutes along the critical path. This should result in improved performance during both server-side request handling and client-side navigations.
Minor Changes
- react-router - Stabilize unstable_defaultShouldRevalidate as defaultShouldRevalidate on , , useLinkClickHandler, useSubmit, fetcher.submit, and setSearchParams (#14999)
⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - react-router - Stabilize the instrumentation APIs (#14999)
unstable_instrumentations is now instrumentations
⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - react-router - Stabilize unstable_mask as mask on , useLinkClickHandler, useNavigate, and rename the corresponding Location.unstable_mask field to Location.mask (#14999)
⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - react-router - Stabilize the unstable_normalizePath option on staticHandler.query and staticHandler.queryRoute as normalizePath (#14999)
⚠️ This is a breaking change if you have already opted into the unstable version - you will need to update your code accordingly - react-router - Stabilize unstable_useTransitions as useTransitions on component to permit omission for backwards compatibility (#14646)
- react-router - Add patch to improve server-side route matching performance by pre-computing flattened/cached route branches (#14967)
- react-router - Cache flattened/ranked route branches to optimize server-side route matching (#14967)
- react-router - Improve route matching performance in Framework/Data Mode (#14971)
Avoiding unnecessary calls to matchRoutes in data router scenarios
Leverage pre-computed pre-computing flattened/cached route branches during client side route matching
Performance benchmarks showed roughly a 15-30% improvement in server-side request handling performance
Patch Changes
- react-router - Add nonce to elements (if provided) (af5d49b)
- react-router - Fix a bug with unstable_defaultShouldRevalidate={false} where parent routes that did not export a shouldRevalidate function could be incorrectly included in the single fetch call for new child route data (#15012)
- react-router - Mark mask as an optional field in Location for easier mocking in unit tests (#14999)
- react-router - Improve server-side route matching performance by pre-computing flattened/cached route branches (#14967)
- react-router - Cache flattened/ranked route branches to optimize server-side route matching (#14967)
- react-router - Improve route matching performance in Framework/Data Mode (#14971)
- react-router - Stabilize unstable_useTransitions prop on component to permit omission for backwards compatibility (#14646)
- react-router - Allow redirects to be returned from client side middleware (#14598)
- react-router - Handle dataStrategy implementations that return insufficient result sets by adding errors for routes without any available result (#14627)
- @react-router/serve - Update compression and morgan dependencies to address on-headers CVE (GHSA-76c9-3jph-rj3q)
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.14.2...v7.15.0
Original source - Apr 21, 2026
- Date parsed from source:Apr 21, 2026
- First seen by Releasebot:Apr 21, 2026
- Modified by Releasebot:May 22, 2026
v7.14.2
React Router ships a patch update with better redirect handling, improved generatePath type safety, cleaner RouterProvider typings, and a fix for dev typegen on layouts without pages. It also tightens RSC Vite plugin requirements for unstable consumers.
Patch Changes
react-router - Remove the un-documented custom error serialization logic from the internal turbo-stream implementation. React Router only automatically handles serialization of Error and it's standard subtypes (SyntaxError, TypeError, etc.). (#14992)
react-router - Properly handle parent middleware redirects during fetcher.load (#14974)
react-router - Remove redundant Omit<RouterProviderProps, "flushSync"> from react-router/dom RouterProvider (#14874)
react-router - Improved types for generatePath's param arg (#14984)
Type errors when required params are omitted:
// Before
// Passes type checks, but throws at runtime 💥
generatePath(":required", { required: null })// After
generatePath(":required", { required: null })// ^^^^^^^^ Type 'null' is not assignable to type 'string'.ts(2322)
Allow omission of optional params:
// Before
generatePath(":optional?", {})// ^^ Property 'optional' is missing in type '{}' but required in type '{ optional: string | null | undefined; }'.ts(2741)
// After
generatePath(":optional?", {})Allows extra keys:
// Before
generatePath(":a", { a: "1", b: "2" })// ^ Object literal may only specify known properties, and 'b' does not exist in type '{ a: string; }'.ts(2353)
// After
generatePath(":a", { a: "1", b: "2" })@react-router/dev - Fix typegen for layouts without pages (#14875)
Previously, typegen could produce pages: ; in .react-router/types/+routes.ts when a route corresponded to 0 pages
Now, pages: never; is correctly generated for those cases
Unstable Changes
⚠️ Unstable features are not recommended for production use
@react-router/dev - For unstable_reactRouterRSC Vite plugin consumers, require @vitejs/plugin-react in user Vite config, and more reliably split route modules (#14965)
⚠️ This is a breaking change if you have begun using the unstable_reactRouterRSC Vite plugin - please install @vitejs/plugin-react and add the react plugin to your Vite plugins array.
Full Changelog: v7.14.1...v7.14.2
Original source - Apr 13, 2026
- Date parsed from source:Apr 13, 2026
- First seen by Releasebot:Apr 20, 2026
v7.14.1
React Router fixes hydration race conditions, normalizes redirect paths, and adds TypeScript 6 support.
Patch Changes
- react-router - Fix a potential race condition that can occur when rendering a HydrateFallback and initial loaders land before the router.subscribe call happens in the RouterProvider layout effect (#14497)
- react-router - Normalize double-slashes in redirect paths (#14962)
- @react-router/dev - Add TypeScript 6 support to peer dependency ranges (#14935)
Full Changelog: v7.14.0...v7.14.1
Original source - Apr 2, 2026
- Date parsed from source:Apr 2, 2026
- First seen by Releasebot:Apr 3, 2026
- Modified by Releasebot:May 22, 2026
v7.14.0
React Router adds Vite 8 support, fixes Turbo Stream handling and a memory leak, and expands @react-router/dev with prerendering for multiple server bundles. It also grows unstable RSC Framework Mode with new route exports, prefetch support, and updated entry file support.
Minor Changes
Add support for Vite 8 (#14876)
Patch Changes
- react-router - Remove recursion from vendored turbo-stream v2 implementation allowing for encoding/decoding of large payloads (#14838)
- react-router - Fix encodeViaTurboStream memory leak via unremoved AbortSignal listener (#14900)
- @react-router/dev - Support for prerendering multiple server bundles with v8_viteEnvironmentApi (#14921)
Unstable Changes
⚠️ Unstable features are not recommended for production use
@react-router/dev - Pre-rendering and SPA Mode support for RSC Framework Mode (#14907)
@react-router/dev - Update react-router reveal to support RSC Framework Mode for entry.client, entry.rsc, entry.ssr (#14904)
react-router - Support in RSC Framework Mode (#14902)
react-router - Add support for new route module exports in unstable RSC Framework Mode (#14901)
⚠️ This is a breaking change if you have already adopted RSC Framework Mode in it's unstable state - you will need to update your route modules to export the new annotations
The following route module components have their own mutually exclusive server component counterparts:
Client Component export Server Component export default ServerComponent ErrorBoundary ServerErrorBoundary Layout ServerLayout HydrateFallback ServerHydrateFallbackIf you were previously exporting a ServerComponent, your ErrorBoundary, Layout, and HydrateFallback were also implicitly server components
If you want to keep those as server components - rename them and prefix them with Server
If you were previously importing the implementations of those components from a client module, you can inline them
Full Changelog: v7.13.2...v7.14.0
Original source - Mar 23, 2026
- Date parsed from source:Mar 23, 2026
- First seen by Releasebot:Mar 23, 2026
- Modified by Releasebot:May 22, 2026
v7.13.2
React Router adds pass-through request handling for loaders and actions, plus a new unstable_url parameter to preserve normalized routing logic. It also ships bug fixes for hydration, path navigation, and dev crashes, and introduces an unstable_useRouterState hook.
What's Changed
Pass-through Requests (unstable)
By default, React Router normalizes the request.url passed to your loader, action, and middleware functions by removing React Router's internal implementation details (.data suffixes, index + _routes query params). This release introduces a new future.unstable_passThroughRequests flag to disable this normalization and pass the raw HTTP request instance to your handlers.
In addition to reducing server-side overhead by eliminating multiple new Request() calls on the critical path, this also provides additional visibility to your route handlers/instrumentations allowing you to differentiate document from data requests.
If you were previously relying on the normalization of request.url, you can switch to use the new sibling unstable_url parameter which contains a URL instance representing the normalized location:
// ❌ Before: you could assume there was no `.data` suffix in `request.url` export async function loader({ request }: Route.LoaderArgs) { let url = new URL(request.url); if (url.pathname === "/path") { // This check will fail with the flag enabled because the `.data` suffix will exist on data requests } } // ✅ After: use `unstable_url` for normalized routing logic and `request.url` for raw routing logic export async function loader({ request, unstable_url }: Route.LoaderArgs) { if (unstable_url.pathname === "/path") { // This will always have the `.data` suffix stripped } // And now you can distinguish between document versus data requests let isDataRequest = new URL(request.url).pathname.endsWith(".data"); }Route handlers/middleware unstable_url parameter
We have added a new unstable_url: URL parameter to route handler methods (loader, action, middleware, etc.) that contains the normalized URL the application is navigating to or fetching with React Router implementation details removed (.data suffix, index / _routes query params).
This parameter is primarily needed when adopting the new future.unstable_passthroughRequests future flag as a way to continue accessing the normalized URL. If you don't have the flag enabled, then unstable_url will match request.url.
Patch Changes
- react-router - Fix clientLoader.hydrate when an ancestor route is also hydrating a clientLoader (#14835)
- react-router - Fix type error when passing Framework Mode route components using Route.ComponentProps to createRoutesStub (#14892)
- react-router - Fix percent encoding in relative path navigation (#14786)
- react-router - Internal refactor to consolidate framework-agnostic/React-specific route type layers - no public API changes (#14765)
- @react-router/dev - Fix react-router dev crash when Unix socket files exist in the project root (#14854)
- @react-router/dev - Escape redirect locations in pre-rendered redirect HTML (#14880)
- create-react-router - replace chalk with picocolors (#14837)
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)
Full Changelog: v7.13.1...v7.13.2
Original source - Feb 23, 2026
- Date parsed from source:Feb 23, 2026
- First seen by Releasebot:Feb 24, 2026
- Modified by Releasebot:May 22, 2026
v7.13.1
React Router ships unstable URL masking support for Framework/Data Mode, adding a new Link unstable_mask API and converting the example to Data Mode. This release also improves routing, error handling, lazy route rendering, and preserves URL details on reloads.
What's Changed
URL Masking (unstable)
This release includes a new
<Link unstable_mask>API which brings first-class support for URL masking to Framework/Data Mode (RFC). This allows the same type of UI you could achieve in Declarative Mode via manual backgroundLocation management. That example has been converted to Data Mode using the new API here.Patch Changes
- react-router - Clear timeout when turbo-stream encoding completes (#14810)
- react-router - Improve error message when Origin header is invalid (#14743)
- react-router - Fix matchPath optional params matching without a "/" separator. (#14689)
matchPath("/users/:id?", "/usersblah") now returns null
matchPath("/test_route/:part?", "/test_route_more") now returns null. - react-router - Fix HydrateFallback rendering during initial lazy route discovery with matching splat route (#14740)
- react-router - Preserve query parameters and hash on manifest version mismatch reload (#14813)
Unstable Changes
⚠️ Unstable features are not recommended for production use
- react-router - Sync protocol validation to RSC flows (#14882)
- react-router - Add future.unstable_passThroughRequests flag (#14775)
- react-router - Add a new unstable_url: URL parameter to route handler methods (loader, action, middleware, etc.) representing the normalized URL the application is navigating to or fetching, with React Router implementation details removed (.data suffix, index / _routes query params) (#14775)
Full Changelog: v7.13.0...v7.13.1
Original source - Jan 23, 2026
- Date parsed from source:Jan 23, 2026
- First seen by Releasebot:May 6, 2026
- Modified by Releasebot:May 22, 2026
v7.13.0
React Router releases patch fixes and new navigation features, including a crossOrigin prop for Links, better path normalization, improved origin check handling, and fs-routes path fixes. It also adds unstable RSC APIs and Link masking support for Framework/Data Mode.
Minor Changes
- react-router - Add crossOrigin prop to Links component (#14687)
Patch Changes
- react-router - Fix double slash normalization for useNavigate paths with a colon (#14718)
- react-router - Fix missing nonce on inline criticalCss (#14691)
- react-router - Update failed origin checks to return a 400 status instead of a 500 (#14737)
- @react-router/dev - Bump @remix-run/node-fetch-server dep (#14704)
- @react-router/fs-routes - Fix route file paths when routes directory is outside of the app directory (#13937)
Unstable Changes
⚠️ Unstable features are not recommended for production use
- react-router - RSC: fix null reference exception in bad codepath leading to invalid route tree comparisons (#14780)
- react-router - RSC: add unstable_getRequest API (#14758)
- react-router - RSC: Update failed origin checks to return a 400 status and appropriate UI instead of a generic 500 (#14755)
- react-router - Add support for in Framework/Data Mode which allows users to navigate to a URL in the router but "mask" the URL displayed in the browser (#14716)
This is useful for contextual routing usages such as displaying an image in a modal on top of a gallery, but displaying a browser URL directly to the image that can be shared and loaded without the contextual gallery in the background
The masked location, if present, will be available on useLocation().unstable_mask so you can detect whether you are currently masked or not
Masked URLs only work for SPA use cases, and will be removed from history.state during SSR
This provides a first-class API to mask URLs in Framework/Data Mode to achieve the same behavior you could do in Declarative Mode via manual backgroundLocation management.
Full Changelog: v7.12.0...v7.13.0
Original source - Jan 23, 2026
- Date parsed from source:Jan 23, 2026
- First seen by Releasebot:Jan 24, 2026
- Modified by Releasebot:May 22, 2026
v7.13.0
React Router ships v7.13.0 with crossOrigin links, navigation fixes, critical CSS nonce handling, and TypeScript 6 support.
Minor Changes
- react-router - Add crossOrigin prop to Links component (#14687)
Patch Changes
- react-router - Fix double slash normalization for useNavigate paths with a colon (#14718)
- react-router - Fix missing nonce on inline criticalCss (#14691)
- react-router - Update failed origin checks to return a 400 status instead of a 500 (#14737)
- @react-router/dev - Add TypeScript 6 support to peer dependency ranges (#14935)
Full Changelog: v7.12.0...v7.13.0
Original source - Jan 7, 2026
- Date parsed from source:Jan 7, 2026
- First seen by Releasebot:Jan 9, 2026
v6.30.3
Patch Changes
- Validate redirect locations (#14707)
Full Changelog: v6.30.2...v6.30.3
Original source - Jan 7, 2026
- Date parsed from source:Jan 7, 2026
- First seen by Releasebot:Jan 8, 2026
- Modified by Releasebot:May 22, 2026
v7.12.0
React Router releases a security-focused update that fixes CSRF and XSS issues, adds extra CSRF protection for UI route submissions, and introduces allowedActionOrigins for approved external origins. It also includes path, redirect, scroll restoration, and dev tooling fixes.
Security Notice
This release addresses 3 security vulnerabilities:
- CSRF in React Router Action/Server Action Request Processing
- XSS via Open Redirects
- React Router SSR XSS in ScrollRestoration
Minor Changes
- react-router - Add additional layer of CSRF protection by rejecting submissions to UI routes from external origins (#14708)
If you need to permit access to specific external origins, there is a new allowedActionOrigins config field in react-router.config.ts where you can specify external origins
Patch Changes
- react-router - Fix generatePath when used with suffixed params (i.e., /books/:id.json) (#14269)
- react-router - Escape HTML in scroll restoration keys (#14705)
- react-router - Validate redirect locations (#14706)
- @react-router/dev - Fix Maximum call stack size exceeded errors when HMR is triggered against code with cyclic imports (#14522)
- @react-router/dev - Skip SSR middleware in vite preview server for SPA mode (#14673)
Full Changelog: v7.11.0...v7.12.0
Original source - Dec 17, 2025
- Date parsed from source:Dec 17, 2025
- First seen by Releasebot:Dec 18, 2025
- Modified by Releasebot:May 22, 2026
v7.11.0
React Router adds vite preview support, stabilizes client-side onError handling, and introduces early call-site revalidation opt-out controls. It also includes several fixes for routing behavior and server dependencies.
What's Changed
We've added vite preview support and stabilized the client-side onError API - please make the appropriate changes if you've adopted the unstable_onError API already in a prior release.
vite preview Support
We've added support for vite preview when using Framework mode to make it easy to preview your production build.
Stabilized Client-side onError
The existing / APIs have been stabilized as / . Please see the Error Reporting docs for more information.
Call-site Revalidation Opt-out (unstable)
We've added initial unstable support for call-site revalidation opt-out via a new unstable_defaultShouldRevalidate flag (RFC). This flag is available on all navigation/fetcher submission APIs to alter standard revalidation behavior. If any routes include a shouldRevalidate function, then the flag value will be passed to that function so the route has the final say on revalidation behavior.
This flag is also available on non-submission navigational use cases - for example, you may want to opt-out of revalidation when adding a search param that doesn't impact the UI:
<Link to="?analytics-param=1" unstable_defaultShouldRevalidate={false} />; navigate("?analytics-param=1", { unstable_defaultShouldRevalidate: false }); setSearchParams(params, { unstable_defaultShouldRevalidate: false });Minor Changes
- react-router - Stabilize / (#14546)
- @react-router/dev - Add vite preview support (#14507)
Patch Changes
- react-router - Fix unstable_useTransitions prop on component to permit omission for backwards compatibility (#14646)
- react-router - Allow redirects to be returned from client side middleware (#14598)
- react-router - Handle dataStrategy implementations that return insufficient result sets by adding errors for routes without any available result (#14627)
- @react-router/serve - Update compression and morgan dependencies to address on-headers CVE (GHSA-76c9-3jph-rj3q) (#14652)
Full Changelog: v7.10.1...v7.11.0
Original source - Dec 4, 2025
- Date parsed from source:Dec 4, 2025
- First seen by Releasebot:Dec 9, 2025
- Modified by Releasebot:May 22, 2026
v7.10.1
React Router fixes React 18 useOptimistic and Node 20.18 issues in a patch update.
Patch Changes
- react-router - Update the useOptimistic stub we provide for React 18 users to use a stable setter function to avoid potential useEffect loops - specifically when using (#14628)
- @react-router/dev - Import ESM package pkg-types with a dynamic import() to fix issues on Node 20.18 and below (#14624)
Full Changelog: v7.10.0...v7.10.1
Original source
Curated by the Releasebot team
Releasebot is an aggregator of official release notes 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.
Similar to Remix with recent updates:
- Supabase release notes69 release notes · Latest May 18, 2026
- Cursor release notes84 release notes · Latest May 20, 2026
- Stripe release notes151 release notes · Latest Apr 29, 2026
- Vercel release notes1415 release notes · Latest May 23, 2026
- Shopify release notes429 release notes · Latest May 21, 2026
- Browserstack release notes75 release notes · Latest Apr 15, 2026