Why I Still Write a Static Blog in 2026

Zero dependencies, 9KB of HTML, an 80ms build, and a ten-year test I actually run.

Every so often someone declares the static blog obsolete: no comments, no recommendations, no growth. I rewrite mine every few years, and each time it gets smaller.

The reason is not nostalgia. It is the maintenance bill.

Dependencies charge interest

A typical modern blog needs a framework, a builder, plugins, a theme, a comment service, an analytics service, and an image CDN. Each one is an upgrade, a security advisory, and a build that breaks at the worst time.

My current build has zero dependencies. A single build.mjs reads Markdown, renders HTML, and writes site/ in about 80ms. No lockfile, no node_modules, no "install fails three years later" — the failure mode that has killed more personal blogs than any hosting outage.

The numbers, because they are checkable

AssetSize
index.html9.1KB
base.css6.2KB
home.css1.9KB
particles.js4.8KB
Total, first paint~22KB

No hydration, no client-side routing, no blocking script. On 4G, first contentful paint is around 300ms on a cold cache. That is not the result of optimization; it is the result of having nothing that can be slow.

Owning the content has a benefit nobody mentions

Keeping posts on my own disk means I can rearrange them whenever I want: recluster by topic, export to EPUB, run a local full-text search, or swap the renderer in ten years without asking a platform for an API.

An export button guarantees you can get your content out. It does not guarantee that what comes out is still usable.

I have migrated this blog across three hosting providers and two domains. Each migration took under an hour, because the artifact is just files.

The ten-year test

Once a year I do a boring exercise: clone the repository into an empty directory, run node build.mjs, open site/index.html with the network disabled, and read one post.

That test has caught two real problems: a font loaded only from a CDN (now with a system fallback), and a JavaScript dependency on localStorage that threw in private mode (now wrapped). Neither would have shown up in a build log.

If your blog cannot be read with the network off and no server, the content is less owned than you think.

What it costs

Honest costs:

  1. Comments need a third party. I skip them; email works.
  2. Search needs an index. I use a client-side filename match, which is enough for 20 posts.
  3. Writing involves a command line. One npm run build, or npm run dev for a watcher.

Each of those is a deliberate trade. I would rather spend the maintenance budget on writing than on keeping a CMS patched.


The best thing about a static blog is not speed or purity. It is that the whole system fits in my head, so I can spend the attention on the sentences.