The one idea
TanStack Router is SPA-only by itself. With TanStack Start it server-renders each route for MPA-grade SEO & first paint BUT keeps SPA-grade transitions — you get both.
A classic MPA reloads the whole document on every
navigation (great SEO/first paint, disruptive). A classic SPA
loads one shell then routes on the client (app-like, poor SEO by default). TanStack spans the axis:
flip on spa: { enabled: true } for a no-server SPA, or run the default and the server
renders each route — then the client takes over for instant, reload-free navigation.
Pure SPA when you have no server; Start when you want the server-render benefits.
The three navigation models — click navigate
Hit navigate in each browser and watch what happens to the document. The MPA reloads the whole page every time. The SPA never reloads — it swaps the view on the client. TanStack Start server-rendered the first document, then the client takes over — subsequent navigation is reload-free, app-like.
Decision helper — SPA mode, Start SSR, or Astro?
Deterministic: the same three answers always return the same pick. Try the
app + needs SEO + has a server path → it returns
TanStack Start (SSR); flip has a server to
no → it returns SPA mode. Both are asserted by the gold-check.
Three-way comparison — model × dimensions
The TanStack column is dual on purpose: it spans the axis. SSR
= the default server-rendered mode; SPA-mode
= spa: { enabled: true }, static shell, no server.