Packages/@tanstack/react-router
Releases of @tanstack/react-router
947 stable releases, newest first. Release notes are kept for the last 90 days; older ones link to where they were published.
1.170.44
12 October 2026Patch Changes
Updated dependencies:
@tanstack/router-core@1.171.37
1.170.43
12 October 2026Patch Changes
Updated dependencies:
@tanstack/router-core@1.171.36
1.170.42
10 October 2026Patch Changes
reduce component nesting per route match
Links of a route that the pending navigation leaves skip deriving the destination location, and clicks and preloads follow the href a Link displays.
buildLocationnow buildsmaskandrouteMaskslocations from the same_fromLocationas the destination.Fixed Link destinations that resolve to a route mask are now reused across navigations instead of being rebuilt every time. A mounted Link now follows changes to its
hrefandreloadDocumentprops, and React Links no longer each subscribe to a hydration flag.
1.170.41
30 September 2026Patch Changes
Compose only enabled route boundaries instead of rendering inactive wrapper components.
Update TanStack Store to 0.11.2 to prevent unrelated atom reads inside subscription observers from triggering extra notifications.
Consolidate the root match context provider while preserving match context in the root shell.
1.170.40
27 September 2026Patch Changes
Skip unused Link preload cleanup when preloading is disabled and ignore queued viewport notifications after their effect has been cleaned up.
Updated dependencies:
@tanstack/router-core@1.171.33
1.170.39
23 September 2026Patch Changes
Avoid hydration-triggered rerenders for links that do not compare URL hashes while preserving hash-sensitive active state and ClientOnly behavior.
1.170.38
16 September 2026Patch Changes
Updated dependencies:
@tanstack/router-core@1.171.32
1.170.37
16 September 2026Patch Changes
deepEqualnow takes its flags as positional arguments —deepEqual(a, b, partial?, explicitUndefined?)— instead of an options object. The router's hot callers (Link option stabilization and active-state checks,matchRoute) no longer allocate an options object per comparison, and the comparator reads two booleans instead of a polymorphic object.explicitUndefinedreplacesignoreUndefined: false.deepEqualis an internal helper; it stays exported for compatibility of two-argument calls.resolvePath(internal helper) now takes positional arguments —resolvePath(base, to, trailingSlash?, cache?)— sobuildLocationandmatchRouteno longer allocate an options object per path resolution.Stream large deferred SSR hydration payloads through a backpressure-aware router transport, fail known setup errors before response creation, and close cancelled or expired transforms safely.
Start now cancels discarded middleware and HEAD response bodies, including plain streams and derived branches.
Server-function raw streams share one ordered response. Arbitrary or sequential consumption can require potentially unbounded buffering of unread data on the client. Cancelling one raw stream discards it locally, while aborting the whole call cancels the response and server work. Consume streams concurrently, cancel unused streams promptly, or use separate calls when independent backpressure is required. A raw stream that exceeds its unread-byte limit now fails alone; sibling streams and the JSON result keep flowing.
The JSON wire shape of a
RawStreamserver-function argument changed. Clients and servers must run matching versions for requests that pass aRawStream.The frame-protocol constants (
FRAME_TYPE_*,MAX_FRAME_PAYLOAD_SIZE,MAX_FRAMED_STREAMS) moved from the@tanstack/start-client-coreroot to the@tanstack/start-client-core/client-rpcsubpath.Router requests whose
Acceptheader allows neithertext/htmlnor*/*now receive406 Not Acceptableinstead of500.Framework adapters share the body
<Scripts>composition (getSsrBodyScriptParts,composeSsrBodyScripts) and the eager HTML response wrapper (renderSsrHtmlResponse) from@tanstack/router-core.Solid SSR now emits one document type and renders late lazy errors through route boundaries. A Solid
<Await>without afallbackno longer holds the streamed shell; it renders inside the nearest<Suspense>boundary like React and Vue, and now renders falsy resolved values.Static server functions decode cached
RawStreamvalues with the client deserializer plugins.SSR Query integrations now keep request cleanup and stream ownership aligned with the router lifecycle.
1.170.36
13 September 2026Patch Changes
Keep the Link location cache out of server bundles:
buildLocationonly creates, reads and writes it whenisServeris false. Render React Links on the server without the extra prop copies and the forwarded-ref hook. Link SSR rendering is 20-40% faster in the Link benchmarks and the React Start SSR request loop about 7% faster.React
activePropsandinactivePropsnow follow one precedence rule on every link, including links whose destination is blocked for using a disallowed scheme: state props override element props,refand event handlers, whilehref,disabledandtargetstay controlled by the router. Previously a blocked link ignored arefor handler from its inactive props.React
LinkanduseLinkPropssplit router options from element props with one key set on the client and the server. Element props pass through as given: external links forward them verbatim, falsy values included, anduseLinkPropsnow returnschildrenfor router-controlled links as it already did for external ones.Reuse hydration snapshot getters to avoid unnecessary store-instance effect updates when Links and other hydration-aware components rerender.
Allow active and inactive Link props to override base element props in React and Solid while preserving class/style merging. Keep React's
href,target, anddisabledvalues controlled by routing options. Preserve Vue object and nested-array class bindings, including reactive updates and server rendering, without mutating cached bindings during VNode normalization.
1.170.35
10 September 2026Patch Changes
Upgrade TanStack Store to 0.11 and migrate router subscriptions to useSelector, preserving selector comparisons and Vue subscription cleanup.
1.170.34
9 September 2026Patch Changes
Avoid allocating event-handler arrays and wrapper functions for links without user-supplied event handlers.
Validate navigation and redirect destinations, keep ambiguous relative URLs on the current origin, and constrain prerender requests and output paths. Prevent redirect headers from appearing in serialized server function response bodies.
Preserve native form HTTP redirects, route error handling and masks for document redirects, and per-navigation destinations for shared loader redirects. Avoid redundant origin parsing and reduce link styling and server-rendering work. Configured origins must already be normalized.
Keep blocked-link inactive props consistent during React hydration, honor explicit redirect Location headers before checking route options, and refresh Vue link state when destinations become internal. Reuse the protocol-relative URL check while parsing redirect schemes once.
Reduce React link bundle size by sharing pathname comparisons, state-prop selection, and element creation.
Share normalized pathname comparisons in Solid and Vue links to reduce bundle size.
React Links resolve state props without temporary class-name arrays or unnecessary style copies.
1.170.33
6 September 2026Patch Changes
Exclude structural descendants below error and not-found boundaries from route lifecycle callbacks. Preserve lifecycle membership through invalidation, hydration, background reloads, and superseded navigation publication.
Preserve falsy thrown values in React and Vue error boundaries. Type React and Vue boundary error components and
onCatchcallbacks asunknown. Solid boundary errors remain typed asError; SSR now wraps non-Errorloader errors to match Solid’s native boundary behavior, preserving the original value incause. Router state and loaderonErrorvalues are unchanged.When upgrading React or Vue, narrow boundary errors (for example, with
error instanceof Error) before readingmessageorstack.ErrorComponentProps<TError>remains available for values narrowed to a specific error type. RouteonErrortypes are unchanged.Retain successful not-found matches as terminal shared boundaries during client navigation, preserving route context while the destination loads.
1.170.32
22 August 2026Patch Changes
preserve context during reloads
Updated dependencies:
@tanstack/router-core@1.171.27
1.170.31
19 August 2026Patch Changes
Updated dependencies:
@tanstack/router-core@1.171.26
1.170.30
18 August 2026Patch Changes
preserve pending UI across retained routes
direct export of CatchBoundary class component, remove function wrapper
Updated dependencies:
@tanstack/router-core@1.171.25
1.170.29
14 August 2026Patch Changes
inline isCtrlKey inside Link component for byte shaving
Updated dependencies:
@tanstack/router-core@1.171.24
1.170.28
14 August 2026Patch Changes
Avoid wrapping root components that may render the HTML document in a Suspense boundary during SSR and hydration.
Reuse resolved lazy route components when revisiting code-split routes, preventing unnecessary pending UI.
Updated dependencies:
@tanstack/router-core@1.171.23
1.170.27
12 August 2026Patch Changes
useMatchRoute w/ React Compiler
1.170.26
12 August 2026Patch Changes
Warn when an Outlet is rendered inside a pending, error, or not-found component.
remove the undocumented Link
isTransitioningstate anddata-transitioningattributeApply
preloadDelayto viewport link preloading and cancel pending preloads when links leave the viewport.
1.170.25
9 August 2026Patch Changes
Updated dependencies:
@tanstack/router-core@1.171.21
1.170.24
9 August 2026Patch Changes
Updated dependencies:
@tanstack/router-core@1.171.20
1.170.23
7 August 2026Patch Changes
bail out of
Linkre-renders when the resolved href and active state are unchanged
1.170.22
7 August 2026Patch Changes
retain mounted UI during revalidation
Updated dependencies:
@tanstack/router-core@1.171.19
1.170.21
6 August 2026Patch Changes
Prevent a blank frame before zero-delay initial pending UI by using a component-scoped React transition for match publication. Pending timing, boundary selection, and rendered matches continue to come from the router core.
createFileRoute does not rely on FileRoute class
clean intersection observer options in link component
1.170.20
5 August 2026Patch Changes
Updated dependencies:
@tanstack/router-core@1.171.17
1.170.19
4 August 2026Patch Changes
Rewrite match loading around a lane-based scheduler that tracks each navigation, preload, and background reload as an ordered unit of work. This fixes pending/redirect/retry state leaking between overlapping navigations, restores correct SSR status codes for redirects, errors, and not-found responses, and closes hydration gaps where the client re-ran work the server had already completed.
Invalidation now retires matching active preloads so older speculative loader results cannot become fresh cache data after invalidation.
Route
headers()now only runs on the server, matching the documented behavior — it is no longer invoked during client-side asset projection.The documented default
gcTimeandpreloadGcTimenow match the existing runtime default of 5 minutes (300_000).
Removed / changed exported internals
RouterStateno longer includesloadedAt,isTransitioning,statusCode, orredirect. Usematch.updatedAtin place ofloadedAt; subscribe torouter.state.status/router.state.isLoadingin place ofisTransitioning; server response status and redirect handling are now internal to the server loader and are no longer exposed onrouter.state.RouteMatch.fetchCounthas been removed, with no replacement — it was purely informational.RouteMatch.statusno longer includes'redirected'(it remains'pending' | 'success' | 'error' | 'notFound') — redirected matches are dropped from the match list instead of being rendered.RouteMatch.globalNotFoundhas been renamed and privatized to the internal_notFoundfield. Usematch.status === 'notFound'instead.The exported React, Solid, and Vue
Matchcomponents now acceptrouteIdinstead ofmatchId.The exported
RouterStoresadapter contract now uses route-keyed presentation stores:matchesIdis replaced byids,matchStoresbybyRoute, andgetRouteMatchStore()bygetMatchStore(). The separateloadedAt,isLoading,isTransitioning,statusCode, andredirectstores have been removed, along with the pending/cache stores and their setters.StoreConfig.inithas also been removed. Read application-facing state fromrouter.state; preload and cache coordination are now internal.Removed
RouterCoremembersgetMatch(),updateMatch(),cancelMatch(), andcancelMatches()— read matches fromrouter.state.matches(e.g.router.state.matches.find((m) => m.id === id)); there is no replacement for mutating or cancelling an individual in-flight match from outside the router.Removed
RouterCore.hasNotFoundMatch()— userouter.state.matches.some((m) => m.status === 'notFound').Removed
RouterCore.looseRoutesById— useroutesById.Removed
RouterCore.isPrerendering(),RouterCore.isViewTransitionTypesSupported, andRouterCore.viewTransitionPromise, with no replacement.Removed
RouterCore.getParsedLocationHref()andRouterCore.clearExpiredCache(), with no replacement — expired cache entries are now reconciled automatically as part of match commit.Removed
RouterCore.latestLoadPromiseandRouterCore.beforeLoad(), with no replacement.RouterCore.commitLocationPromiseandRouterCore.pendingBuiltLocationhave been replaced by the internal_commitPromiseand_pendingLocationfields.Removed the exported
GetMatchFnandUpdateMatchFntypes, along with the methods they typed.Removed the standalone
getMatchedRoutes()export from@tanstack/router-core— use therouter.getMatchedRoutes()instance method instead.RouterCore.loadRouteChunk()no longer accepts an array of component types as its second argument. One-argument usage is unchanged; the optional second argument is now'errorComponent','notFoundComponent', orfalsefor internal boundary loading.Removed
Redirect.redirectHandled, which was internal redirect bookkeeping.MatchRoutesOpts.preloadandMatchRoutesOpts.desthave been removed.StartTransitionFnis now(fn, expected) => Promise<boolean>(previously(fn) => void). This only affects custom framework adapters that implementstartTransition.
Updated dependencies:
@tanstack/router-core@1.171.16
1.170.18
13 July 20261.170.17
1 July 20261.170.16
16 June 20261.170.15
6 June 20261.170.14
6 June 20261.170.13
5 June 20261.170.12
5 June 20261.170.11
2 June 20261.170.10
30 May 20261.170.9
29 May 20261.170.8
24 May 20261.170.7
21 May 20261.170.6
20 May 20261.170.5
20 May 20261.170.4
17 May 20261.170.3
16 May 20261.170.2
16 May 20261.170.1
15 May 20261.170.0
15 May 20261.169.8
11 May 20261.169.5
11 May 20261.169.2
5 May 20261.169.1
1 May 20261.169.0
30 April 2026