The web rewrote itself five times in three decades. Each rewrite was a response to the same problem: how do we get the right pixels in front of the user, fast, at planetary scale?
If you started building for the web after 2018, the modern stack feels permanent: a framework, a CDN, an edge runtime, a managed database. It is not. The shape of the web changes every few years, and each shape solves a problem the previous shape could not.
From CGI to PHP: making the page personal
The first dynamic web ran on CGI scripts spawning a process per request. PHP and Perl arrived as the embedded alternative — interpret the page in-process, render a per-user view, save the operating system the cost of forking. This was the era when Wikipedia, WordPress, and most of e-commerce was born. Performance was acceptable because expectations were low.
The MVC era and the return of the framework
Rails 1.0 in 2005 changed how teams thought about web applications. Convention-over-configuration, ORM-backed models, and template-driven views became the default. Django, Laravel, and Spring MVC followed the same blueprint with different opinions. Most enterprises still run on this architecture.
The single-page app and the rise of JavaScript
Gmail and Google Maps proved JavaScript could do more than animate a dropdown. By the time React shipped in 2013 the SPA was the default for any product that wanted to feel like an application instead of a document. The trade-off was painful: huge JavaScript bundles, slow first paints, and SEO that fought you.
The pendulum swings: SSR returns
Server-side rendering came back through Next.js, Nuxt, and Remix. The new generation kept the SPA developer experience while sending pre-rendered HTML on first request. By 2024 Core Web Vitals were the default metric framework teams optimized for, and shipping less JavaScript had become a competitive advantage.
Edge: the current frontier
Today the question is no longer where the page renders — it is where the page renders per request. Cloudflare Workers, Vercel Edge, and Deno Deploy run server logic in 200+ regions. A user in Singapore hits a node in Singapore. The database may still be in us-east-1, but the rendering layer is wherever the user is.
What is next
The next shift is already visible: server components that hydrate selectively, partial prerendering, and the return of streaming. The architecture changes, but the goal has not moved since 1995 — fast pixels in front of the user.