Dana Iti
UX.Front-end.Systems.
Dana Iti
How I WorkCase StudiesWritingContact
Reading mode
HomeWritingSwitched to SSR When “Good Enough” Started Causing Real Problems

Switched to SSR When “Good Enough” Started Causing Real Problems - Pt 4

16 September 2025•3 min read
•By Dana Iti•Engineering & Architecture
Next.jsSSRRenderingFrontend ArchitectureSystem Design
Reading mode

Series: Part 4 of Rendering with Intent

Breaking down how I learned to choose rendering strategies intentionally rather than relying on defaults.

Previous: I Wanted Static Speed Without Serving Yesterday’s Data. ISR Was the AnswerNext: When Static Pages Weren’t Enough, Client Components Took OverView all posts in this series

Static rendering worked for content that rarely changed. ISR handled fresh-but-not-immediate pages. But some parts of WonderBook couldn’t be cached or prebuilt at all, they had to be evaluated per user, per request, every time.

That’s when I turned to SSR (Server-Side Rendering).

How SSR works

SSR generates HTML at request time using live data, not a cached copy. Each visitor gets a page rendered specifically for them, with fresh database queries and user context baked into the HTML before it’s sent.

This guarantees that the user sees up-to-date data, but at the cost of caching efficiency.

When SSR makes sense

✅ Use SSR when❌ Avoid SSR when
Data depends on the userContent is static
Page requires authenticationData changes rarely
Security or privacy mattersSpeed is the top priority
Real-time accuracy is criticalSEO is the main goal without dynamic data

SSR trades cached speed for correctness and security. It’s about trust: ensuring what’s displayed is exactly true in that moment for that user.

Why SSR can feel slower. TTFB and rendering cost

SSR doesn’t just render on demand, it waits until a user asks. That extra computation time shows up as TTFB (Time To First Byte), which is how long it takes for the browser to start receiving the first byte of HTML from the server.

Here’s how different rendering strategies typically impact TTFB:

Rendering StrategyTTFB ImpactWhy
Static (SSG/ISR prebuilt)Very lowAlready rendered and served instantly from a CDN
ISR (after regen)LowActs like static once cached
SSRHighServer fetches data and renders fresh HTML per request
Client-side renderingLow TTFB but slower to become usefulHTML arrives quickly, but content isn’t interactive until JS runs
StreamingMedium TTFB but feels fasterServer sends partial HTML progressively so users see something sooner

SSR isn't bad because it's slower. It’s slower because it’s doing real work in real time, and that work only makes sense when correctness outweighs latency.

SSR in WonderBook - Dashboard

The user dashboard shows generated stories, word counts, and AI credit balances. It’s personalised, authenticated, and constantly changing. Caching it would risk showing the wrong data to the wrong user.

export const dynamic = "force-dynamic"; export default async function DashboardPage() { const user = await getUser(); const stories = await getUserStories(user.id); return <Dashboard stories={stories} />; }

The Rendering with Intent Series

  • Part 1: Rendering Blindly Cost Me Speed, Money, and Sanity. Here’s How I Fixed It
  • Part 2: Static Rendering. Doing the Work Before Anyone Asks For It
  • Part 3: I Wanted Static Speed Without Serving Yesterday’s Data. ISR Was the Answer
  • Part 4: Switched to SSR When “Good Enough” Started Causing Real Problems [You are here]
  • Part 5: When Static Pages Weren’t Enough, Client Components Took Over
  • Part 6: I Made Data Feel Faster Without Actually Speeding It Up

Previous

I Wanted Static Speed Without Serving Yesterday’s Data. ISR Was the Answer

Next

When Static Pages Weren’t Enough, Client Components Took Over

Related Posts

View all posts

© 2026 Dana Iti

·
AboutWhat's newContact

Related Posts

Engineering & Architecture

Next.js 16. Caching Finally Makes Sense

Next.js 16 flipped caching from implicit magic to explicit choice. Everything is dynamic by default now. You opt into caching instead of fighting mysterious behaviour.

22 Oct 2025•6 min
Next.jsCaching+2 More
Design & UX

Revamping My Website

My old site looked nice but felt wrong. This time I treated it like a system, not a portfolio. Every element had to justify why it existed or it got cut.

15 Oct 2025•7 min
DesignFrontend+3 More
AI

I Don’t Want AI to Replace Thinking. I Want It to Help People Think Better

Most AI tools throw answers at you. People don't need more answers. They need help thinking through the mess.

28 Sept 2025•2 min
FounderbaseAI+3 More