
The web didn’t evolve because developers got bored. It evolved because latency, state, and economics kept forcing us to move responsibility between server, client, and edge. This post gives you the mental model and the checklist to choose the right rendering architecture in 2021+
Axel Domingues
This blog started as “learn Machine Learning, Deep Learning and Reinforcement Learning.”
It ended as “build a system that can survive.”
In 2021, I’m taking that lesson back to the web—because the web is the most successful distributed system most engineers will ever ship to millions of users.
And it has one recurring pattern:
The web keeps “compressing” complexity by moving work to a different place.
Server → browser → server again (SSR) → edge.
Not as a trend.
As a response to constraints.
When I say “compression algorithm”, I mean this:
We take product requirements (SEO, interactivity, personalization, performance, reliability, cost) and compress them into a delivery shape by deciding where computation and state live.
Every era of the web is a different answer to one question:
Where does the work happen?
Each move wins something and costs something.
If you remember nothing else from this post, remember this:
The core question
Where does truth live, and where do you pay the latency bill?
If you want to predict the next “web era”, don’t watch framework hype.
Watch these forces:
Latency
Users feel round-trips. Architectures evolve to hide or remove them.
State
Once you have real state (auth, carts, drafts, permissions), you need contracts and boundaries.
Economics
Bandwidth, compute, and developer time are always constrained—even when budgets are “big”.
Tooling maturity
Browser APIs, JS engines, CDNs, and frameworks enable new tradeoffs (and new failure modes).
These forces explain why the web swings like a pendulum:
I’m not going to do a history lecture. I’m going to do a tradeoff timeline.
How it worked
What it optimized
What broke
How it worked
What it optimized
What broke
How it worked
What it optimized
What broke
How it worked
What it optimized
What broke
How it works
What it optimizes
What breaks
The key lesson is not “SSR good” or “SPA bad.”
The lesson is:
Every web system has to answer these questions, whether you admit it or not:
If you treat these as “implementation details,” your system will eventually punish you.
Most teams don’t ship “an architecture.”
They ship one of these four archetypes (or a hybrid).
Static + CDN
Pre-render pages (SSG) and push to a CDN.
Best for content and “mostly-read” experiences.
SPA + API
JS app in the browser calling backend APIs.
Best for highly interactive, authenticated apps.
SSR + API
Server renders initial HTML, then client hydrates.
Best for SEO + performance-sensitive pages with real interactivity.
Hybrid / Edge-rendered
Mix SSG, SSR, and edge personalization.
Best for global products that need speed and dynamic behavior.
The mistake is trying to decide between them as ideologies.
You decide by constraints.
Use this in design reviews. It’s intentionally blunt.
If you’re mixed, you’re headed toward hybrid anyway.
List state that cannot lie:
If correctness dominates, you’ll keep more logic server-side (or you’ll build a lot of compensations).
Pick a target for:
If you don’t define the budget, the bundle will define it for you.
The best architecture is one you can evolve:
Let’s be honest about the bills.
You pay in content pipelines and invalidation strategy.
If “content is code,” you need:
It’s cheap to run, but you still need process discipline.
You pay in performance budgets and client/server consistency.
You need:
SPAs are powerful—but they are easy to operate badly.
You pay in complexity: two runtimes, two failure modes.
You need:
SSR is a great tool. It’s also a great way to invent subtle bugs.
You pay in debuggability and distributed operations.
You need:
Hybrid systems win speed—but require operational maturity.
Here’s the simplest mental model I know that stays useful for years:
And every bug you’ve seen in web systems is usually a violation of that map.
Here’s the framing I like in architecture discussions:

The key is per-route strategy:
If I’m advising a team from scratch, I usually recommend:
Default to hybrid by routes
Don’t pick “one rendering mode.” Pick per route, based on constraints.
Push correctness server-side
Auth, permissions, money, and privacy stay authoritative on the server.
Make performance a budget
Budgets force tradeoffs early. Without them, you ship accidental slowness.
Treat caching as a feature
Caching has owners, rules, invalidation strategy, and tests.
And I try to keep one rule visible on a wall:
One rule that prevents most pain
If you can’t explain “where state lives” and “how it becomes UI,” you don’t have an architecture yet.
SSR can be faster for first paint, but it can also be slower overall if:
The fastest SSR page is usually the one that behaves like static content with smart revalidation.
SPAs can be fine when:
The real question is “which routes matter for discovery?” not “is SPA allowed?”
Edge reduces network latency, but it can increase complexity:
Edge is a tool. Use it where it buys measurable latency wins.
In web systems, “later” means:
Performance needs budgets, guardrails, and CI checks—early.
Reinforcement learning trained me to think in feedback loops:
The web is the same.
Your rendering strategy is not a framework choice.
It’s an economic and operational decision about:
Next month we go one layer deeper and treat HTTP as a distributed systems API—without the buzzwords.
Because once you understand HTTP semantics (caching, idempotency, retries, proxies), you stop designing “APIs” and start designing systems that survive the real internet
HTTP as a Distributed Systems API (Without the Buzzwords)
HTTP isn’t just “how browsers talk to servers.” It’s a mature distributed-systems contract with semantics for caching, retries, concurrency, intermediaries, and evolution. If you design APIs without those semantics, production will teach you them anyway.
From Research Rig to System: 2020 Postmortem and the Real Amazing Result
2020 is when I stopped training agents and started building a trading system: environments, evaluation discipline, safety, and a live loop that survives outages. This is the postmortem — and the first result that actually held up in reality.