React Router 8.5.0 Deprecates Its View Transition APIs in Favor of React's ViewTransition Component and Adds an Unstable API-only Mode
React Router 8.5.0, dated October 19, 2026, deprecates its view transition APIs for React's ViewTransition and adds unstable API-only Mode, custom fetch and route discovery.
Overview
React Router 8.5.0 was published on October 19, 2026, according to the project’s release tag on GitHub, whose notes point to the changelog. The changelog entry for v8.5.0 is dated 2026-10-19 and leads with a deprecation of the library’s view transition APIs, followed by three features marked unstable: an API-only mode for Framework Mode, a custom fetch hook and application-controlled route discovery.
View Transition APIs Deprecated
The changelog says React Router’s view transition APIs “are now marked deprecated in favor of React’s <ViewTransition> component, available in React 19.3+.” The deprecated surface listed in the release is the viewTransition props and options, useViewTransitionState, and NavLink’s isTransitioning render prop and transitioning class. The changelog states that the existing APIs “will continue to work for the duration of React Router v8 and will be removed in v9,” and that the release preserves existing behavior, including support for older React versions.
For migration, the changelog says to wrap <ViewTransition> around an <Outlet> in a persistent layout, remove the viewTransition props and options, and replace the deprecated hook, render prop and class with React’s View Transition classes. It adds that using <ViewTransition> requires React transitions to be enabled, so useTransitions={false} should not be set on the router component.
The component itself was stabilized in React 19.3, which The Machine Herald previously reported. React’s reference page describes it this way: “<ViewTransition> lets you animate a component tree with Transitions and Suspense.”
Unstable Additions in Framework Mode
The changelog places three features under “Unstable Changes” and says unstable features “are not recommended for production use.”
- API-only Mode. The changelog says “Framework Mode can now serve static HTML while retaining a runtime server for loaders, actions, revalidation, and lazy route discovery.” It describes the use case as deploying static HTML files to a CDN on one origin while the pages call server loaders and actions on a runtime server, potentially on another origin. The mode is enabled with
ssr: "unstable_api-only"inreact-router.config.ts, optionally alongside aprerenderlist for paths that should be served as complete HTML. For a separate API origin, the changelog says to setunstable_apiServerOriginand to configure CORS andallowedActionOriginsappropriately. - Custom fetch. Passing
unstable_fetchto<HydratedRouter>customizes the JavaScript-issued server data and route discovery requests. The callback receives a constructedRequestand a context identifying initialization, navigation, fetcher, revalidation or manifest requests. Navigation-initiated data requests also carry anavigationTypeof"PUSH","REPLACE"or"POP". The changelog lists custom fetch options, custom headers, safe request retries and response header inspection as uses, and says response bodies should be returned unchanged so React Router can decode its manifest and Turbo Stream data protocols. It also notes that browser-managed prefetches from<Link prefetch>use native<link rel="prefetch">elements and do not call the custom implementation. - Application-controlled route discovery. Enabling
future.unstable_customRouteDiscoveryadds anunstable_useRouteDiscoveryhook that exposesdiscoverRoutes(paths),loadAllRoutes()and a sharedstateof"partial","loading"or"complete". The changelog says discovery “loads route metadata without navigating, running loaders/actions, or prefetching route modules,” and that enabling the flag preserves automatic route discovery and built-in manifest-mismatch recovery unless a customonManifestMismatchhandler is provided.
Fixes
The patch-level changes in the same changelog entry include declaring @types/react and @types/react-dom as optional peer dependencies so type definitions resolve under strict, non-hoisted node_modules layouts. They also include fixing matchPath so a static segment containing characters outside [\w-] is treated as optional, and stopping a fetcher from revalidating after fetcher.reset(). In @react-router/node, file session data is now written to a temporary file and renamed into place so concurrent commits of the same session can no longer corrupt its file. In @react-router/express, the request URL no longer loses its port when the Host or X-Forwarded-Host header is an IPv6 address.
What We Don’t Know
The changelog does not give a timeline for stabilizing API-only Mode, custom fetch or custom route discovery, and it does not report performance figures for them. It also does not say when React Router v9 is expected, only that the deprecated view transition APIs will be removed there.