Comparisons

Pairs that get conflated in real conversations, and in real pull requests. Neither column wins — what decides is the requirement. Each record leads with the confusion, because the confusion is the reason the record exists.

Client-side rendering vs Server-side rendering

What people get wrong about this pair

SSR is described as "faster", which is not a claim you can make without saying faster at what. SSR usually improves the time until meaningful content is visible, because bytes arrive already shaped as content. It does not improve — and can worsen — the time until the page is interactive, because that still waits on the bundle downloading, parsing, executing and hydrating, and now there is a server render on the critical path as well. The result is a page that looks ready and is not, which is a specific kind of bad: users click, nothing happens, and they click again. The second confusion is that this is one global switch. It is per route. A marketing page, a product listing and an internal dashboard in the same application have three different right answers, and modern frameworks exist largely to let you mix them.

CSR — the server sends a shell and JavaScript builds the page
Use it when

Application surfaces behind a login, where the first paint is a shell nobody indexes, navigation continuity matters more than first load, and the server has no advantage in producing the markup.

SSR — the server renders HTML per request and the client hydrates it
Use it when

Content the first paint must actually contain — for search engines, link previews, users on slow connections, or anything where a shell is a worse experience than waiting slightly longer for real content.

DimensionCSR — the server sends a shell and JavaScript builds the pageSSR — the server renders HTML per request and the client hydrates it
First HTML containsA shellRendered content
Time to meaningful contentAfter bundle downloads, parses, runs and fetchesOn first paint of the response
Time to interactiveWhen the bundle has runWhen the bundle has run and hydration completes
Server costStatic file servingA render per request, plus data fetching on the server
Failure modeBlank screen if the bundle failsVisible but dead UI until hydration; mismatches if the environments differ
Data fetchingFrom the browser, after JS runsOn the server, before the response — often nearer the data
CachingThe shell caches triviallyPer-request HTML is harder to cache and often personalised
Best measured byWhen content appears and when input is answeredThe same two — and the gap between them, which is the SSR-specific risk