← Default view
Atlas / react-router-2026 / decision console 5 angles · resolved

Client-rendered React 19 admin SPA · 2026

Which React router do we ship?

Five angles, one console. The recommendation up top, the five sub-investigations as tiles below — each one drillable into its full page.

▚ Verdict

For a console where the URL carries filters, sorting and pagination, adopt TanStack Router ★ 15k — full type safety and schema-validated search params in pure SPA mode, no server required. React Router ★ 56k (now v8) is the defensible default if you value the largest ecosystem over typed search state. [3]

// invariant · keep data-fetching in a query library, skip the meta-framework, don't couple to route loaders — that keeps the router a thin, swappable dependency.
admin.acme.app/orders?status=open&sort=-created&page=2&pageSize=50
status : 'open' | 'closed' | 'all' sort : SortKey page : number pageSize : number

The admin console's real state — filters, sort, pagination — lives in the query string. TanStack validates it at the route boundary (validateSearch ✓), so deep links can't drift and reads come back typed and parsed.[6]

sharpest fit

★ 15k · stable v1 since Dec 2023 · type-safe, state-first

12.7M
weekly npm
100%
typed search, SPA

URL → state → data → UI. Typed path + search params with zero config, identical whether you SSR or not. The one router that natively validates search-param state.[5]

safe default

★ 56k · v8, June 2026 · biggest ecosystem

3
additive modes
v8
"most boring" major

URL → component. The incumbent, least migration friction, yearly cadence. But its typed params and typed href only fully materialise in framework mode.[4]

— evaluated for a deliberately client-rendered, auth-gated console —

The fact underneath all five angles: which mode?

React Router's headline features — typed path params, typed href, loader/action data — fully materialise only in framework mode: a server. Run it as a pure client SPA and you drop back to useLoaderData() as Post and untyped URLSearchParams. TanStack's typing is identical SSR or not — so for a client-rendered console the two are not evenly matched.[7]

The five angles

Open costs on the recommended pick

cost · dx

Advanced, complex types

TanStack leans on very advanced TypeScript inference with cryptic errors and a real learning curve — steepest if the team isn't TS-first.[14]

cost · supply chain

May 2026 npm compromise

A supply-chain attack put malicious versions across 42 @tanstack/* packages live on npm for ~20 minutes before recovery.[1]

escape hatch

Not TypeScript-first?

React Router (data mode) is the lower-ceremony choice — a gentler slope that trades typed search params for the largest ecosystem.[2]

Leaving is cheap if you avoid the coupling

A small SPA migrates React Router → TanStack in ~2–4 hours, and the two can coexist during the switch.[12] Staying put is near-drop-in: the v6→v7 codemod automated 85–90% of changes across 461 files with zero false positives, and v8's breaking changes were pre-adoptable behind future.* flags.[13][15]

Sources ledger