May 27, 2026 · Engineering
Loving the Boring Parts
A love letter to static sites, slow pages, and the joy of pre-rendering everything.
There is a quiet sound a website makes when it is loading nothing. No spinner, no skeleton, no third-party analytics phoning home before the first paint. Just HTML. Headers, then bytes, then your page. It is the sound of the boring parts working.
I have been writing software long enough to remember when this was the only sound. I have also been writing software long enough to have forgotten it, several times.
The boring parts
The boring parts are the parts nobody writes a thread about. A <link rel="icon">. A Cache-Control header that is not aggressive in either direction. A sitemap that lists every page exactly once. A 404 that does not weigh half a megabyte. The boring parts are the ones the user never notices, which is the highest compliment a piece of software can earn.
For a long time I avoided them. They were beneath me. I was building dashboards with twelve different state machines and a queryClient that synced with the URL through a custom middleware. I was deeply unwell.
What we lost when we got dynamic
The shift from static sites to dynamic apps was, mostly, a good trade. We got interactivity, real-time updates, personalization. But somewhere along the way the trade became a default, then a tax. Every site became an app. Marketing pages became React applications. Blog posts shipped 300 KB of JavaScript to render a paragraph.
The cost was not just performance — though performance got measurably worse, year over year, across the web. The cost was a kind of cognitive sprawl. Every page had a runtime. Every runtime had a deploy story. Every deploy story had an outage. We forgot that HTML is a finished product.
Why static came back
Static came back because someone finally noticed that most pages do not change between requests. That sounds obvious because it is. The page you are reading right now will be byte-identical the next time anyone loads it. It does not need a server. It does not need a database. It does not need a cold start. It needs a file, on a CDN, ten milliseconds from the reader.
The new wave of static generators — Astro, Eleventy, Hugo, the resurrected Jekyll — figured out something the old wave missed: static does not have to mean dumb. You can have content collections with typed schemas. You can have MDX with components. You can have islands of interactivity exactly where they earn their JavaScript, and HTML everywhere else.
Astro fits my brain
I picked Astro for the rewrite of this site because it matches how I actually think about pages. The default is HTML. The exception is interactivity, and the exception is opt-in. A .astro file is just markup until I write client:load on a component, and then it is exactly as much React as I asked for.
Content collections are typed. The MDX renders at build time. The View Transitions API gives me page-to-page morphs for the price of one line in the layout. Tailwind v4 compiles on demand. The whole thing builds to a dist/ folder and lands on Cloudflare Pages without an adapter, without an edge function, without a single moving part beyond a CDN serving files.
The case for less JavaScript
Every kilobyte of JavaScript I ship is a tax I am charging the reader. It is a tax in download time, in parse time, in battery, in attention. Most of the time the tax buys nothing. The reader wanted to read.
Static-first does not mean static-only. It means the burden of proof shifts. If you want to ship JS to the client, you have to defend the tradeoff. A theme toggle? Sure. A blog filter? Sure. A 50 KB carousel for three images? Defend it.
I would rather have a site that loads instantly and animates lightly than a site that loads slowly and animates beautifully. The former is hospitality. The latter is performance art.
Closing
The boring parts are not boring once you appreciate what they protect. They protect the reader’s time. They protect your bandwidth bill. They protect future-you from the maintenance burden of a stack you outgrew three frameworks ago. They are the structural integrity beneath everything visible.
This post is hosted on a flat file, served from a CDN, generated from a markdown document I wrote in my editor. The page weighs less than one of the avatar PNGs on most landing pages. It will keep working for a decade with no intervention. There is nothing here that needs babysitting. That is the goal.
The boring parts are the love letter. Read them slowly.