NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #2171 most downloaded on npm
Modern and scalable routing for React applications
Last release 4 days ago
30 Sep 2026
Ships fairly regularly
a new release about every 1 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
687 releases · first in 2024
One column per month.
Updated dependencies [`bc80866`, `e561fa1`, `cbbfbe3`, `a1c8d1a`, `cbbfbe3`, `a0b2ad9`, `8e164d2`, `1ca361b`]:
Updated dependencies [`d76a332`, `b747fb8`, `6cfb1e8`, `700a714`, `700a714`, `6387d58`, `7e349c3`, `9b2adaf`, `873c830`, `7e349c3`, `634da91`, `e9396c
d76a332, b747fb8, 6cfb1e8, 700a714, 700a714, 6387d58, 7e349c3, 9b2adaf, 873c830, 7e349c3, 634da91, e9396c9, 634da91, f151ab0, bc57fa3, 6387d58, 9872d2a, d76a332, 634da91, 634da91, 7e349c3, 9448caa, e9396c9, 700a714, 634da91, 634da91]:
Updated dependencies [`f9836f1`, `aee42c6`, `49bcd4d`, `9c1871c`, `9aec5a7`, `9871c06`, `0654c0a`]:
Updated dependencies [`edf0e16`, `2f20c00`, `28a5e45`, `08eff50`, `216c0c4`, `2f91503`, `f0b5eda`, `50eafca`, `0497cae`, `0caf6b9`, `ee28348`, `cf166d
Updated dependencies [`fa65287`, `cb281d7`]:
Updated dependencies [`3e016ac`]:
3e016ac]:
Updated dependencies [`5d3785d`, `63d2cc9`, `f75cada`]:
Updated dependencies \[`4c89b15`, `cf6ab17`, `0fdf9ff`, `bdaf73a`]:
Updated dependencies \[`0c25a7b`, `31882c7`]:
Updated dependencies \[`7e93431`, `f500760`, `1aafca9`, `aa10b65`]:
Updated dependencies \[`3e016ac`]:
3e016ac]:
51138a8]:
Updated dependencies \[`3e016ac`]:
3e016ac]:
Updated dependencies \[`5d3785d`, `63d2cc9`]:
ea3a665]:
Updated dependencies \[`4c89b15`, `cf6ab17`, `0fdf9ff`, `bdaf73a`]:
Updated dependencies \[`31882c7`, `3848503`]:
b0817f5]:
b2908c6]:
Updated dependencies \[`7e93431`, `f500760`, `1aafca9`, `aa10b65`]:
45c4ad8]:
Nothing published for this version
Updated dependencies \[`51138a8`]:
51138a8]:
51138a8]:
49f6863 - Preserve React component state during HMR when route components are declared with lowercase function names. The development-only React transforms cover split route component groups and unsplit root route component options, including shell, pending, and error components, without changing production output.Updated dependencies \[`44a8c3e`, `c59788c`, `5253e70`]:
78dd1a6]:
Updated dependencies \[`2fbc99f`, `6bede65`]:
e56a677]:
Updated dependencies \[`ea3a665`]:
ea3a665]:
ea3a665]:
e2dd204]:
Updated dependencies \[`2435885`, `84db4a8`, `9cac62a`, `86bf510`, `6aefb33`]:
9809a06]:
Updated dependencies \[`b2908c6`]:
b2908c6]:
b2908c6]:
776d8ef]:
Updated dependencies \[`45c4ad8`]:
45c4ad8]:
Updated dependencies [`ac10815`]:
ac10815]:
Updated dependencies [`301f6ba`, `2cca73c`, `7a83e67`, `76b3d3b`]:
Updated dependencies [`b4cd5af`]:
b4cd5af]:
Updated dependencies [`2f53749`]:
2f53749]:
Updated dependencies [`d1997b6`]:
d1997b6]:
Updated dependencies [`51a97a1`]:
51a97a1]:
Updated dependencies [`5268ba4`]:
5268ba4]:
Updated dependencies [`7df0d02`]:
7df0d02]:
Updated dependencies [`0300f87`, `0300f87`]:
Add deferred Hydrate boundary support for TanStack Start.
Update chokidar to v5. (#7439)
Add deferred Hydrate boundary support for TanStack Start. (#7362)
Hydrate boundaries can now be code-split by the Start compiler, preload their generated client chunks, preserve server-rendered fallback HTML, and replay interaction-triggered events after hydration. The compiler integration now uses a Start-owned compiler plugin for Hydrate virtual modules across Vite and Rsbuild, with dev invalidation for generated virtual modules.
Shared AST utilities used by the router code-splitter and Hydrate virtual modules were moved into @tanstack/router-utils so both pipelines can retain referenced top-level declarations, unwrap local exports, and let dead-code elimination remove unused route module code.
Updated dependencies [5fa9e55]:
Fix route mismatch warnings, HMR route index refresh, and generated route type preferences for duplicate pathless/index routes.
Fix Vite Fast Refresh detection for root routes created with createRootRouteWithContext type arguments.
createRootRouteWithContext type arguments. (#7420)Updated dependencies [`d9cf933`]:
d9cf933]:
Updated dependencies [`d533f87`]:
d533f87]:
Updated dependencies [`742941e`]:
742941e]:
Invalidation now retires matching active preloads so older speculative loader results cannot become fresh cache data after invalidation.
#7805 45c4ad8 - 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.
headers() now only runs on the server, matching the documented behavior — it is no longer invoked during client-side asset projection.gcTime and preloadGcTime now match the existing runtime default of 5 minutes (300_000).Removed / changed exported internals
RouterState no longer includes loadedAt, isTransitioning, statusCode, or redirect. Use match.updatedAt in place of loadedAt; subscribe to router.state.status / router.state.isLoading in place of isTransitioning; server response status and redirect handling are now internal to the server loader and are no longer exposed on router.state.RouteMatch.fetchCount has been removed, with no replacement — it was purely informational.RouteMatch.status no longer includes 'redirected' (it remains 'pending' | 'success' | 'error' | 'notFound') — redirected matches are dropped from the match list instead of being rendered.RouteMatch.globalNotFound has been renamed and privatized to the internal _notFound field. Use match.status === 'notFound' instead.Match components now accept routeId instead of matchId.RouterStores adapter contract now uses route-keyed presentation stores: matchesId is replaced by ids, matchStores by byRoute, and getRouteMatchStore() by getMatchStore(). The separate loadedAt, isLoading, isTransitioning, statusCode, and redirect stores have been removed, along with the pending/cache stores and their setters. StoreConfig.init has also been removed. Read application-facing state from router.state; preload and cache coordination are now internal.RouterCore members getMatch(), updateMatch(), cancelMatch(), and cancelMatches() — read matches from router.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.RouterCore.hasNotFoundMatch() — use router.state.matches.some((m) => m.status === 'notFound').RouterCore.looseRoutesById — use routesById.RouterCore.isPrerendering(), RouterCore.isViewTransitionTypesSupported, and RouterCore.viewTransitionPromise, with no replacement.RouterCore.getParsedLocationHref() and RouterCore.clearExpiredCache(), with no replacement — expired cache entries are now reconciled automatically as part of match commit.RouterCore.latestLoadPromise and RouterCore.beforeLoad(), with no replacement.RouterCore.commitLocationPromise and RouterCore.pendingBuiltLocation have been replaced by the internal _commitPromise and _pendingLocation fields.GetMatchFn and UpdateMatchFn types, along with the methods they typed.getMatchedRoutes() export from @tanstack/router-core — use the router.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', or false for internal boundary loading.Redirect.redirectHandled, which was internal redirect bookkeeping.MatchRoutesOpts.preload and MatchRoutesOpts.dest have been removed.StartTransitionFn is now (fn, expected) => Promise<boolean> (previously (fn) => void). This only affects custom framework adapters that implement startTransition.Updated dependencies [45c4ad8]:
2387a2e]:
Updated dependencies [`b1c061a`, `038cd12`, `201e150`]:
Updated dependencies \[`3e016ac`]:
3e016ac]:
3e016ac]:
8c43c71]:
c5811aa]:
@tanstack/router-plugin@1.168.34
35e88f0]:
@tanstack/router-plugin@1.168.33
Parse plain TypeScript files without JSX when a filename is available, preventing angle-bracket type assertions from being interpreted as JSX during route and Start import-protection transforms. (#7342)
Updated dependencies [056337e]:
Updated dependencies \[`3e016ac`]:
3e016ac]:
b0817f5]:
Updated dependencies \[`3e016ac`]:
3e016ac]:
4a1e63f]:
Updated dependencies \[`5d3785d`, `63d2cc9`]:
51138a8]:
51138a8]:
51138a8]:
c992495]:
Updated dependencies \[`4c89b15`, `cf6ab17`, `0fdf9ff`, `bdaf73a`]:
31882c7]:
b5c4183]:
Updated dependencies \[`3e016ac`]:
3e016ac]:
7e93431]:
95dec51]:
493148b]:
@tanstack/start-client-core@1.170.22
51138a8]:
ea3a665]:
ea3a665]:
ea3a665]:
a2ad394]:
@tanstack/router-generator@1.167.26
51138a8]:
Updated dependencies \[`31882c7`]:
31882c7]:
c59788c]:
ea3a665]:
b2908c6]:
b2908c6]:
b2908c6]:
react-refresh/runtime, avoiding failures when that optional dependency is not installed. (#7255)Updated dependencies \[`7e93431`]:
7e93431]:
45c4ad8]:
45c4ad8]:
4d864ee]:
Updated dependencies \[`51138a8`]:
51138a8]:
ea3a665]:
b2908c6]:
Updated dependencies \[`44a8c3e`, `5253e70`]:
9cac62a]:
45c4ad8]:
16f6892]:
Updated dependencies \[`ea3a665`]:
ea3a665]:
b2908c6]:
328d7e5]:
Updated dependencies \[`84db4a8`, `9cac62a`, `6aefb33`]:
45c4ad8]:
Your coding agent can read these notes before it upgrades. Set up the MCP server →