Decision. For a client-rendered React 19 admin console where the URL carries filters/sorting/pagination, TanStack Router ⭐ 15k is the sharpest fit — full type safety and typed search params in pure SPA mode, no server required [2][1]. React Router ⭐ 56k is the safest default: biggest ecosystem, least drama, but its type-safety/data edge lives mostly in framework mode (a server), so a pure SPA gets less of it [1][8]. Wouter ⭐ 7.9k only if the console stays simple. Next.js App Router is the wrong grain for a deliberately client-rendered SPA [7].
The candidates
React Router (v7/v8) merged Remix and is now the default answer; TanStack Router is the TypeScript-first challenger; Wouter is the minimalist; Next.js App Router is the foil that asks whether a standalone router is needed at all.
Note on versions: React Router v8 shipped 17 June 2026 — the first release under the project’s open-governance model and a new yearly major cadence (v9 targeted ~May 2027, aligned to Node 22 EOL) [4][5]. The v7 line (which absorbed Remix) and v8 share the same three-mode architecture, so the head-to-head below applies to both.
Comparison table
| Axis | React Router | TanStack Router | Wouter | Next.js App Router |
|---|---|---|---|---|
| ⭐ Stars | ⭐ 56k [10] | ⭐ 15k [11] | ⭐ 7.9k [3] | ⭐ 141k [12] |
| Maturity | Very high; 12-yr lineage, powers billions of loads [4] | High; stable v1 since Dec 2023, fastest-growing router [9] | Solid, niche; stable, actively maintained [3] | Very high; Vercel-backed [12] |
| Momentum | Huge, steady default [1] | ~12.7M weekly dl for @tanstack/react-router, rising fast [6] |
Steady, small niche [3] | Dominant framework [12] |
| Cadence | Yearly majors, open governance [5] | Frequent minor releases [11] | Occasional, stable API [3] | Frequent, fast-moving [12] |
| Routing model | JSX routes / route objects / file-based (framework mode) [8] | Code-based route tree or file-based; type-safe [2] | JSX <Route>/hooks, ~2.2KB [3] |
File-based only [2] |
| Type-safe params | 🟡 partial [2] | ✓ full: path + search params [2] | ✗ minimal | ✗ limited [2] |
| Works as pure client SPA | ✓ (declarative/data mode) [8] | ✓ (its home turf) [1] | ✓ | ⚠ fights the grain [7] |
| Needs a server for best features | ⚠ yes (framework mode) [1] | ✗ no | ✗ no | ✓ server-first by design [7] |
Head-to-head, for a client-rendered admin console
TanStack Router ⭐ 15k (Jul 2026) — state-first routing (URL → state → data → UI). Purpose-built for client-heavy SPAs, dashboards and internal tools where the URL carries rich state: multiple filters, sorting, pagination, view modes — all validated at the type boundary rather than at runtime [1]. Crucially, its 100% type-safe params and loaders work in plain SPA mode with no server [2]. Weaknesses: smaller ecosystem, steeper learning curve, and a May 2026 npm supply-chain compromise (84 malicious versions across 42 @tanstack/* packages live ~20 min) that dented trust though the packages recovered [6].
React Router ⭐ 56k (Jul 2026) — UI-first routing (URL → component), the default React answer with the biggest ecosystem, easiest onboarding and least migration friction from existing code [1]. Three additive modes — declarative, data, framework — trade architectural control for features as you climb [8]. ⚠ The catch for a pure SPA: most of the enhanced type safety and modern data features only fully materialise in framework mode, which is a full-stack server framework à la Next.js [1][8]. As a client-only library it works well but gives up TanStack’s typed-search-param edge.
Wouter ⭐ 7.9k (Jul 2026) — ~2.2KB, hooks-based, mimics React Router’s Route/Link/Switch with an optional top-level router [3]. Excellent when routing should be near-invisible. But it deliberately omits built-in data loading and type-safe search params, so a filter-heavy admin console would reimplement exactly what TanStack gives for free — underpowered for this use case.
Next.js App Router ⭐ 141k (Jul 2026) — the “do you even need a standalone router” foil. Next.js can be coerced into a static-export SPA and offers instant client transitions [7], but it is server-first by design (RSC, server assumptions) and file-based only, with no code-based or programmatic routes [2]. For a team that has deliberately chosen a client-rendered React 19 SPA, adopting Next.js means fighting the framework’s grain — the wrong trade. It belongs on the list only to confirm that a lightweight standalone router remains the right call here.
Bottom line
Pick TanStack Router if you want the URL to be part of your type architecture and the console is filter/state-heavy. Pick React Router if you want the conservative, best-supported default and can accept slightly weaker SPA-mode typing. Keep Wouter for genuinely simple apps. Skip Next.js unless you’re willing to give up the client-rendered SPA premise. (Data-loading, type-safety depth and migration are covered by the sibling angles.)