← Default view
Head-to-Head · Survey

The Routing Scoreboard

Four React routers, one fixture: a deliberately client-rendered React 19 admin console where the URL carries filters, sorting and pagination.

TanStack Routervs React Routervs Woutervs Next.js App Router
The Result

TanStack Router takes it on the URL-as-state axis — full type safety and schema-validated search params in pure SPA mode, no server required [2][1]. React Router is the safe runner-up: biggest ecosystem, least drama — but its type-safety edge lives in framework mode, a server, so a pure SPA gets less of it [8]. Wouter only for simple consoles; Next.js App Router is the wrong grain for a client-rendered SPA [7].

Final Standings
1 🥇
TanStack RouterTanStack Router  ⭐ 15k
Sharpest Fit
2 🥈
React RouterReact Router  ⭐ 56k
Safest Default
3 🥉
WouterWouter  ⭐ 7.9k
Simple Apps Only
4
Wrong Grain
The Board · scored for a client-rendered admin SPA
Criterion
TanStack Router
⭐ 15k
GitHub stars
~12.7M weekly dl · stable since Dec 2023
React Router
⭐ 56k
GitHub stars
v8 · merged Remix · yearly majors
Wouter
⭐ 7.9k
GitHub stars
~2.2KB · hooks-based · stable API
Next.js
⭐ 141k
GitHub stars
Vercel-backed · file-based only
Typed search-param state
Filters · sort · pagination validated at the type boundary
Full, schema-validated — end to end [2]
Partial — the edge needs framework mode [1]
Minimal — reimplement it yourself
Limited [2]
Runs as a pure client SPA
No server assumed, no build-time coercion
Its home turf [1]
Declarative / data mode [8]
Yes, natively
Fights the grain [7]
No server for best features
Full capability without a full-stack runtime
Same typing, SSR or not
Best bits need framework mode [8]
No server needed
Server-first by design [7]
Ecosystem & safety of default
Community mass, onboarding, stability of the bet
Smaller; steep curve; May-26 npm scare [6]
Biggest ecosystem, least drama [1]
Solid but niche [3]
Huge, Vercel-backed [12]
Routing model for a filter-heavy console
Code-based, programmatic, expressive enough
Code-based route tree, type-safe [2]
JSX / route objects / file-based [8]
Tiny but underpowered here
File-based only, no code routes [2]
Final tally
1st
4 ✓ · 1 ⚠
2nd
3 ✓ · 2 ⚠
3rd
2 ✓ · 2 ⚠ · 1 ✗
4th
1 ✓ · 1 ⚠ · 3 ✗
Wins it for this use case Works, with a catch Loses it here

Cells are scored for a client-rendered React 19 admin SPA — not in the abstract. Next.js's 141k stars and server-first design are strengths in general; here, "server-first" is exactly what this deliberately client-only app doesn't want.

Contender Cards

TanStack Router ⭐ 15k

🥇 Sharpest Fit

State-first routing (URL → state → data → UI). Purpose-built for client-heavy SPAs, dashboards and internal tools where the URL carries rich state, all validated at the type boundary.

+100% type-safe params & loaders in plain SPA mode, no server [2]
Smaller ecosystem, steeper curve, and a May 2026 npm supply-chain compromise (84 bad versions, ~20 min) that dented trust [6]

React Router ⭐ 56k

🥈 Safest Default

UI-first routing (URL → component). The default React answer with the biggest ecosystem and least migration friction. Three additive modes — declarative, data, framework.

+Easiest onboarding; v8 (June 2026) brought open governance and a yearly major cadence [4][5]
Most enhanced typing only materialises in framework mode — a server — so a pure SPA gives up the typed-search edge [8]

Wouter ⭐ 7.9k

🥉 Simple Apps Only

~2.2KB, hooks-based, mimics React Router's Route/Link/Switch with an optional top-level router. Excellent when routing should be near-invisible.

+Featherweight and stable — ideal for a genuinely simple console [3]
Deliberately omits data loading and type-safe search params — a filter-heavy admin would reimplement what TanStack gives free

Next.js App Router ⭐ 141k

Wrong Grain

The "do you even need a standalone router" foil. It can be coerced into a static-export SPA with instant client transitions, but it is server-first by design and file-based only.

+Dominant framework, instant SPA-like transitions once configured [7]
No code-based or programmatic routes; adopting it for a client-rendered SPA means fighting the framework's grain [2]
The Rest of the Tournament
Match Officials · 12 sources
A view of the canonical survey · scored for a client-rendered React 19 admin SPA · glyphs read "wins/works-with-a-catch/loses" for this fixture, not in the abstract.