This site ships zero JavaScript
There is a game I play when I visit new websites: open devtools, check how much JavaScript downloaded before I could read a paragraph. The scores are rarely pretty. So when I built this blog, I set myself one rule — the reader’s browser executes nothing. No analytics, no framework runtime, not even a theme toggle.
What you lose
Honestly, very little. The two features people assume need JavaScript turn out not to.
Dark mode. The operating system already knows whether you prefer light or dark; asking again with a toggle widget is a UX smell. CSS answers for free:
@media (prefers-color-scheme: dark) {
:root {
--bg: #171511;
--ink: #e7e2d6;
}
}
Interactivity. A blog’s interactions are: click a link, scroll, select text. HTML did all three in 1994.
What you gain
- Pages render the moment HTML arrives — no hydration pause, no layout shift
- The site works with JavaScript disabled, which includes more readers than you’d think (hardened browsers, screen readers, ancient phones)
- Nothing to update, patch, or audit on the client — the attack surface is a stylesheet
The numbers
Each page is one HTML document plus one cached stylesheet. A typical post lands around 15 KB uncompressed — smaller than the average favicon, with no second round-trip waiting on a bundle.
None of this is clever. That’s the point: the boring solution was also the fastest one, so I shipped it and went back to writing.