# React Router Releases
This page lists all releases/release notes for React Router back to `v7.0.0`.
- For v6.x releases, please refer to the [v6](https://github.com/remix-run/react-router/blob/v6/CHANGELOG.md) branch
- For releases prior to v6, please refer to the [Github Releases Page](https://github.com/remix-run/react-router/releases)
We manage release notes in this file instead of the paginated Github Releases Page for 2 reasons:
- Pagination in the Github UI means that you cannot easily search release notes for a large span of releases at once
- The paginated Github interface also cuts off longer releases notes without indication in list view, and you need to click into the detail view to see the full set of release notes
Table of Contents
- [React Router Releases](#react-router-releases)
- [v8.0.0](#v800)
- [Baseline Support](#baseline-support)
- [Adopted Future Flag Behavior](#adopted-future-flag-behavior)
- [Removed `react-router-dom`](#removed-react-router-dom)
- [Removed deprecated `meta` `data` fields](#removed-deprecated-meta-data-fields)
- [Cloudflare Vite Plugin](#cloudflare-vite-plugin)
- [`@react-router/architect` `useRequestContextDomainName`](#react-routerarchitect-userequestcontextdomainname)
- [v7.18.0](#v7180)
- [CSRF Check Logic Fix](#csrf-check-logic-fix)
- [v7.17.0](#v7170)
- [v7.16.0](#v7160)
- [v7.15.1](#v7151)
- [v7.15.0](#v7150)
- [Stabilizations](#stabilizations)
- [Route matching optimizations](#route-matching-optimizations)
- [v7.14.2](#v7142)
- [v7.14.1](#v7141)
- [v7.14.0](#v7140)
- [v7.13.2](#v7132)
- [Pass-through Requests (unstable)](#pass-through-requests-unstable)
- [Route handlers/middleware `unstable_url` parameter](#route-handlersmiddleware-unstable_url-parameter)
- [v7.13.1](#v7131)
- [URL Masking (unstable)](#url-masking-unstable)
- [v7.13.0](#v7130)
- [v7.12.0](#v7120)
- [v7.11.0](#v7110)
- [`vite preview` Support](#vite-preview-support)
- [Stabilized Client-side `onError`](#stabilized-client-side-onerror)
- [Call-site Revalidation Opt-out (unstable)](#call-site-revalidation-opt-out-unstable)
- [v7.10.1](#v7101)
- [v7.10.0](#v7100)
- [Stabilized `future.v8_splitRouteModules`](#stabilized-futurev8_splitroutemodules)
- [Stabilized `future.v8_viteEnvironmentApi`](#stabilized-futurev8_viteenvironmentapi)
- [Stabilized `fetcher.reset()`](#stabilized-fetcherreset)
- [Stabilized `DataStrategyMatch.shouldCallHandler()`](#stabilized-datastrategymatchshouldcallhandler)
- [v7.9.6](#v796)
- [v7.9.5](#v795)
- [Instrumentation (unstable)](#instrumentation-unstable)
- [v7.9.4](#v794)
- [`useRoute()` (unstable)](#useroute-unstable)
- [v7.9.3](#v793)
- [v7.9.2](#v792)
- [RSC Framework Mode (unstable)](#rsc-framework-mode-unstable)
- [Fetcher Reset (unstable)](#fetcher-reset-unstable)
- [v7.9.1](#v791)
- [v7.9.0](#v790)
- [Stable Middleware and Context APIs](#stable-middleware-and-context-apis)
- [v7.8.2](#v782)
- [v7.8.1](#v781)
- [v7.8.0](#v780)
- [Consistently named `loaderData` values](#consistently-named-loaderdata-values)
- [Improvements/fixes to the middleware APIs (unstable)](#improvementsfixes-to-the-middleware-apis-unstable)
- [v7.7.1](#v771)
- [v7.7.0](#v770)
- [Unstable RSC APIs](#unstable-rsc-apis)
- [v7.6.3](#v763)
- [v7.6.2](#v762)
- [v7.6.1](#v761)
- [v7.6.0](#v760)
- [`routeDiscovery` Config Option](#routediscovery-config-option)
- [Automatic Types for Future Flags](#automatic-types-for-future-flags)
- [v7.5.3](#v753)
- [v7.5.2](#v752)
- [v7.5.1](#v751)
- [v7.5.0](#v750)
- [`route.lazy` Object API](#routelazy-object-api)
- [v7.4.1](#v741)
- [v7.4.0](#v740)
- [v7.3.0](#v730)
- [v7.2.0](#v720)
- [Type-safe `href` utility](#type-safe-href-utility)
- [Prerendering with a SPA Fallback](#prerendering-with-a-spa-fallback)
- [Allow a root `loader` in SPA Mode](#allow-a-root-loader-in-spa-mode)
- [v7.1.5](#v715)
- [v7.1.4](#v714)
- [v7.1.3](#v713)
- [v7.1.2](#v712)
- [v7.1.1](#v711)
- [v7.1.0](#v710)
- [v7.0.2](#v702)
- [v7.0.1](#v701)
- [v7.0.0](#v700)
## v8.0.0
Date: 2026-06-17
### What's Changed
React Router v8 is here!
We introduced a new [Open Governance](https://remix.run/blog/rr-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](https://nodejs.org/en/about/previous-releases) 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](https://reactrouter.com/community/api-development-strategy) aims to make major releases relatively boring by introducing breaking changes ahead of time behind [Future flags](https://reactrouter.com/v7/upgrading/future). 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`](https://developers.cloudflare.com/workers/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.
### Major Changes
- `react-router` - Remove the `future.v8_trailingSlashAwareDataRequests` flag ([#15100](https://github.com/remix-run/react-router/pull/15100))
- Trailing slash-aware data request URLs are now the default behavior.
- `react-router` - Update `tsconfig.json` `target`/`lib` from `ES2020 -> ES2022` ([591853e](https://github.com/remix-run/react-router/commit/591853e))
- `react-router` - Switch the published packages in `packages/` to ESM-only. ([#14895](https://github.com/remix-run/react-router/pull/14895)) ([59ebcf1](https://github.com/remix-run/react-router/commit/59ebcf1))
- `react-router` - Remove deprecated `data` parameter in favor of `loaderData` for `meta` APIs (to align with `Route.ComponentProps`) ([#14931](https://github.com/remix-run/react-router/pull/14931))
- `Route.MetaArgs`, `Route.MetaMatch`, `MetaArgs`, `MetaMatch`, `Route.ComponentProps.matches`, `UIMatch`
- `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](https://github.com/remix-run/react-router/pull/15079))
- `react-router` - Remove internal `hasErrorBoundary` field added to `router.routes` when using a data router ([#15074](https://github.com/remix-run/react-router/pull/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.
- The `MapRoutePropertiesFunction` signature no longer requires returning `hasErrorBoundary`; the router infers it directly.
- `react-router` - Remove `react-router-dom` package ([#15076](https://github.com/remix-run/react-router/pull/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` - Remove `future.v8_middleware` flag — middleware is always enabled in v8 ([#15078](https://github.com/remix-run/react-router/pull/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` - Update minimum Node version to 22.22.0 ([#14928](https://github.com/remix-run/react-router/pull/14928))
- `react-router` - Update minimum React version to 19.2.7 ([#15062](https://github.com/remix-run/react-router/pull/15062))
- `@react-router/architect` - Bump `@architect/functions` to v8 ([#15106](https://github.com/remix-run/react-router/pull/15106))
- `@react-router/architect` - Remove the `useRequestContextDomainName` option from `createRequestHandler` - this is now the default behavior ([#15188](https://github.com/remix-run/react-router/pull/15188))
- `@react-router/architect` - Update minimum Node version to 22.22.0 ([#15143](https://github.com/remix-run/react-router/pull/15143))
- `@react-router/cloudflare` - Update minimum Node version to 22.22.0 ([#15143](https://github.com/remix-run/react-router/pull/15143))
- `@react-router/dev` - Remove `@react-router/dev/vite/cloudflare` dev proxy export; use `@cloudflare/vite-plugin` instead ([#15077](https://github.com/remix-run/react-router/pull/15077))
- Drops support for `wrangler@3` as a peer dependency of `@react-router/dev`
- `@react-router/dev` - Remove the `future.v8_trailingSlashAwareDataRequests` flag ([#15100](https://github.com/remix-run/react-router/pull/15100))
- Trailing slash-aware data request URLs are now the default behavior.
- `@react-router/dev` - Remove `future.v8_passThroughRequests` flag - the raw incoming `request` is now always passed through to `loader`/`action`. ([#15079](https://github.com/remix-run/react-router/pull/15079))
- `@react-router/dev` - Move `future.v8_splitRouteModules` to a top-level `splitRouteModules` config option and change the default behavior to `true` ([#15086](https://github.com/remix-run/react-router/pull/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` - Update minimum Node version to 22.22.0 ([#14928](https://github.com/remix-run/react-router/pull/14928))
- `@react-router/dev` - Require Vite 7+ and make the Vite Environment API build path mandatory ([#15077](https://github.com/remix-run/react-router/pull/15077))
- `@react-router/dev` - Removed the `future.v8_viteEnvironmentApi` flag because the Vite Environment API is always enabled ([#15077](https://github.com/remix-run/react-router/pull/15077))
- `@react-router/dev` - Removed the `future.unstable_previewServerPrerendering` flag and make prerendering with the Vite Environment API the default. ([#15077](https://github.com/remix-run/react-router/pull/15077))
- `@react-router/express` - Bump dependencies ([#15106](https://github.com/remix-run/react-router/pull/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/express` - Update minimum Node version to 22.22.0 ([#14928](https://github.com/remix-run/react-router/pull/14928))
- `@react-router/fs-routes` - Update minimum Node version to 22.22.0 ([#15143](https://github.com/remix-run/react-router/pull/15143))
- `@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](https://github.com/remix-run/react-router/pull/14930))
- `@react-router/node` - Update minimum Node version to 22.22.0 ([#14928](https://github.com/remix-run/react-router/pull/14928))
- `@react-router/remix-routes-option-adapter` - Update minimum Node version to 22.22.0 ([#15143](https://github.com/remix-run/react-router/pull/15143))
- `@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](https://github.com/remix-run/react-router/pull/14930))
- `@react-router/serve` - Update minimum Node version to 22.22.0 ([#14928](https://github.com/remix-run/react-router/pull/14928))
- `create-react-router` - Switch from `@remix-run/web-fetch` to native `fetch` internally. ([#14929](https://github.com/remix-run/react-router/pull/14929))
- This removes the underlying `HTTPS_PROXY` support that `node-fetch` and subsequently `@remix-run/web-fetch` supported
- `create-react-router` - Update minimum Node version to 22.22.0 ([#15143](https://github.com/remix-run/react-router/pull/15143))
### Minor Changes
- `react-router` - Bump dependencies ([#15080](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/15106))
- `@react-router/dev` - Bump dependencies ([#15080](https://github.com/remix-run/react-router/pull/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 `dedent` from `^1.5.3` to `^1.7.2`
- Bumped `jsesc` from `3.0.2` to `3.1.0`
- Bumped `lodash` from `^4.17.21` to `^4.18.1`
- Bumped `prettier` from `^3.6.2` to `^3.8.3`
- Bumped `@remix-run/node-fetch-server` from `^0.13.0` to `^0.13.3`
- Bumped `react-refresh` from `^0.14.0` to `^0.18.0`
- Bumped `semver` from `^7.3.7` to `^7.8.1`
- Bumped `tinyglobby` from `^0.2.14` to `^0.2.16`
- Bumped `valibot` from `^1.2.0` to `^1.4.1`
- `@react-router/dev` - Replace `cookie` and `set-cookie-parser` with `cookie-es` ([#15109](https://github.com/remix-run/react-router/pull/15109))
- `@react-router/dev` - Removed the `vite-node` dependency in favor of Vite's native module runner APIs ([#15104](https://github.com/remix-run/react-router/pull/15104))
- `create-react-router` - Bump dependencies ([#15080](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/15086))
- `react-router` - Remove explicit `onSubmit` type override from `SharedFormProps` to fix deprecation warning with `@types/react@19.x` ([#14932](https://github.com/remix-run/react-router/pull/14932)) ([59ebcf1](https://github.com/remix-run/react-router/commit/59ebcf1))
- `react-router` - Update package builds to preserve individual module files in published artifacts. Public APIs and documented import paths are unchanged. ([#15092](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/15092))
- `react-router` - Upgrade React Router's TypeScript tooling to TypeScript 6. Runtime behavior and public APIs are unchanged. ([#15092](https://github.com/remix-run/react-router/pull/15092))
- `@react-router/architect` - Bump dependencies ([#15080](https://github.com/remix-run/react-router/pull/15080))
- Bumped `@types/aws-lambda` from `^8.10.82` to `^8.10.161`
- `@react-router/dev` - Bump dependencies ([#15080](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/15077))
- `@react-router/fs-routes` - Bump dependencies ([#15091](https://github.com/remix-run/react-router/pull/15091))
- Bumped `minimatch` from `^9.0.0` to `^10.2.5`
- `@react-router/node` - Bump dependencies ([#15106](https://github.com/remix-run/react-router/pull/15106))
- Bumped `@remix-run/node-fetch-server` from `^0.13.0` to `^0.13.3`
- `@react-router/serve` - Bump dependencies ([#15091](https://github.com/remix-run/react-router/pull/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**: [`v8.0.0-pre.1...v8.0.0`](https://github.com/remix-run/react-router/compare/react-router@8.0.0-pre.1...react-router@8.0.0)
## v7.18.0
Date: 2026-06-16
### 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](https://github.com/remix-run/react-router/pull/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](https://reactrouter.com/api/other-api/adapter#react-routerarchitect) for more information
### Patch Changes
- `react-router` - Fix server handler prerender responses when using `ssr: false` and `future.v8_trailingSlashAwareDataRequests: true` ([#15173](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/15170))
- `react-router` - Use `turbo-stream` to serialize and deserialize Framework Mode hydration errors ([#15175](https://github.com/remix-run/react-router/pull/15175))
- `react-router` - Optimize route matching by extending precomputed route branches to include matchers ([#15186](https://github.com/remix-run/react-router/pull/15186))
- `react-router` - Use the constructed `request` URL `host` instead of header checks when validating action request origins in the CSRF check ([#15185](https://github.com/remix-run/react-router/pull/15185))
- `react-router` - Remove the un-documented custom error serialization logic from Data Mode SSR built-in hydration flows ([#15175](https://github.com/remix-run/react-router/pull/15175))
- `react-router` - Validate protocols in RSC render redirects ([#15177](https://github.com/remix-run/react-router/pull/15177))
- `react-router` - Consolidate url normalization logic and better handle mixed slashes ([#15176](https://github.com/remix-run/react-router/pull/15176))
- `@react-router/dev` - Pass Vite `server.watch` config to child compiler in development mode. ([#15178](https://github.com/remix-run/react-router/pull/15178))
- `@react-router/dev` - Ignore external Vite server environments in Framework Mode build hooks ([#14883](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/15185))
- read port from `x-forwarded-host` based on `trust proxy` setting
- handle invalid hostname characters
**Full Changelog**: [`v7.17.0...v7.18.0`](https://github.com/remix-run/react-router/compare/react-router@7.17.0...react-router@7.18.0)
## v7.17.0
Date: 2026-06-04
### Minor Changes
- `react-router` - Ship a subset of the official documentation inside the `react-router` package ([#15121](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/15138))
### Unstable Changes
⚠️ _[Unstable features](https://reactrouter.com/community/api-development-strategy#unstable-flags) 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](https://github.com/remix-run/react-router/pull/15005))
**Full Changelog**: [`v7.16.0...v7.17.0`](https://github.com/remix-run/react-router/compare/react-router@7.16.0...react-router@7.17.0)
## v7.16.0
Date: 2026-05-28
### Minor Changes
- `react-router` - Stabilize `future.unstable_trailingSlashAwareDataRequests` as `future.v8_trailingSlashAwareDataRequests` ([#15098](https://github.com/remix-run/react-router/pull/15098))
- `@react-router/dev` - Stabilize `future.unstable_trailingSlashAwareDataRequests` as `future.v8_trailingSlashAwareDataRequests` ([#15098](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/15068))
- `react-router` - Fix browser URL creation to use the configured history window instead of the global window. ([#15066](https://github.com/remix-run/react-router/pull/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](https://github.com/remix-run/react-router/pull/15095))
- `react-router` - Widen `MetaDescriptor` `script:ld+json` type from `LdJsonObject` to `LdJsonObject | LdJsonObject[]` to permit multiple JSON-LD schemas in a single `