I finally have a blog. It runs on Hugo. The build takes 18 milliseconds. The output is a folder of HTML files I could open in Lynx if I felt like punishing myself. There is no node_modules. There is no client-side router. There is no spinner.

You should do this too. Especially if your current blog is WordPress with 500 plugins.

The thing nobody wants to admit

The modern web is unbelievably bloated. Your “lightweight” personal blog probably ships 400 KB of JavaScript before it shows you a single sentence. It has a service worker. It has analytics for the analytics. The first paint waits on a hydration step that exists because someone, somewhere, decided that rendering HTML on a server was a problem that needed solving.

It wasn’t.

We did this to ourselves over the course of about a decade. Each individual decision sounded reasonable in isolation: “let’s add a build step so we can use Sass,” “let’s use a framework so the code is more maintainable,” “let’s pre-render so it’s fast”. And at the end of all of it we have personal blogs that need 200 dependencies to display six paragraphs of text.

I am tired.

A word on WordPress

Some of you might not know this, but WordPress originally started as a tool for personal blogs. Like this one. Then again, PHP started as a templating engine, but I digress.

The point is: people started using it for everything. A website for your restaurant? WordPress. A system to book a room in your B&B? WordPress. A B2B e-commerce platform with a customer portal, warehouse management, bookkeeping and dynamic price lists? You guessed it: WordPress.

I’m not saying you should use Hugo to run your e-commerce system. Needless to say it’s not the right tool for the job. But that’s exactly the point I’m trying to make.

If you are running WordPress for a personal blog, please understand: you are operating a small, badly-secured PHP application 24/7 just to display some text you wrote. You have a database. You have a login screen. You have a plugin called something like Yoast SEO Premium that nags you about every post. You have a different plugin called WP-Optimize whose job is to clean up after the first plugin. You have a third plugin to put a cookie banner on the cookie banner.

There is, allegedly, a “blog” somewhere underneath all this.

Hugo just writes HTML files. There is no admin panel to be brute-forced. There is no database to be SQL-injected. There is no PHP version to upgrade. The “attack surface” of a Hugo site is whoever has commit access to your git repo, which is hopefully you.

What Hugo actually is

Hugo is one binary. You download it. You run it. It reads your Markdown files and a folder of HTML templates, and it writes out a folder of HTML files. That’s the whole product.

There is no package.json. There is no lockfile. There is nothing to npm audit. When you come back to your blog in three years, the binary still works, the templates still render, the Markdown is still Markdown.

Compare this to whatever JavaScript-based blog platform was hot in 2019. Half of them are unmaintained. The other half had a major version bump that broke every plugin you depended on. Your three-year-old “modern” blog is now a haunted house of deprecation warnings, and you cannot upgrade Node without something catching fire.

Things you stop having to think about

Once you switch:

  • Page weight. Without JS, there’s nothing to be heavy. (that is, of course, if you don’t use an npm toolchain in your Hugo site)
  • Hosting. It’s just files. Put them anywhere. A $4 VPS, S3, GitHub Pages, a USB stick mailed to your friend.
  • Build times. Hugo builds my whole site in milliseconds. I don’t have a CI pipeline; I have a git push and a hook that runs the binary.
  • Framework upgrades. There’s no framework to upgrade. Just the Hugo binary.
  • Whether your stack still works in five years. It will.
  • Whether your readers’ phones can render your blog without thermal-throttling. They can.

That’s a lot of attention freed up to do the thing you were ostensibly here for, which is to write.

What you give up

I want to be honest about this part. You do give up some things:

  1. Real-time features. No live comments, no logged-in user state. Use a third-party service if you really need this. You almost certainly don’t.
  2. Fancy interactive demos. You can still write JavaScript and drop it into a page when you actually need it. The point isn’t to ban JS — it’s to stop defaulting to it.
  3. The dopamine hit of running npm install. I mean… is this even a thing?

That’s basically the list. I have been using simple, lightweight tools for years and have not once thought “what I really need is React.”

Markdown as a writing experience

Writing posts as Markdown files in a folder is so much better than every web-based CMS I have ever used that it feels almost embarrassing. I open nvim. I write. I save. The post exists. It is in git. It is backed up. I can grep it. I can :s/old-name/new-name/g it. If I get hit by a bus, my partner can hand the folder to anyone with a text editor and they can read every word.

“But what about—”

I know. You have a list. Let me preempt:

  • Tags, RSS, taxonomies, sitemaps. Hugo has all of these. They’re built in. They take ten lines of config.
  • Themes. You can use one. Or, like I did, you can write 200 lines of templates and have something exactly the way you want it.
  • Image optimization, syntax highlighting, table of contents. All built in. No plugins to install.
  • Drafts and scheduling. Built in.
  • Multi-language sites. Built in. I am genuinely surprised by how much is just there.

The only thing Hugo doesn’t do is the thing your blog never needed in the first place: ship a runtime to the browser to render content that could have been HTML.

The longevity argument

Here’s the part I actually care about. Personal websites are supposed to outlive the framework du jour. You should be able to write something in 2026 and have it readable, indexable, searchable, and functional in 2036.

A folder of HTML files will be readable in 2036. A static site generator that’s a single Go binary will, very probably, still build in 2036. A heavy framework powered by npm and a giant transpiler chain will not. A WordPress install left untouched for ten years is, by 2036, a botnet node.

The choice you make about your personal blog isn’t really about today. It’s about whether you want to keep maintaining the same blog ten years from now, or whether you want to do The Big Rewrite every two years because something in the dependency tree shifted.

I am done doing The Big Rewrite.

Just do it

Switch your blog to Hugo. Or to any of the other small, sharp, boring static site generators. Don’t add a framework. Don’t add a build step you don’t need. Don’t ship JavaScript to do the job that HTML and CSS already do beautifully. Don’t run a database to display six paragraphs of text.

Your readers’ batteries will thank you. Your future self will thank you. The web, marginally, will get a little less terrible.

That’s the whole post. Go.

Want to see what I'm building?

Most of my work lives on GitHub. Drop by, browse the repos, or open an issue.

GitHub