WordPress powers most of the sites I build. I was NOT a fan at first, as a matter of fact I despised it. But if you’re lucky enough to have a mentor like mine, they would push you to keep learning it and say “It pays the bills, and it’s not going anywhere”. I didn’t like to hear that, but a fact is a fact.

There’s probably 7 gagillion different ways to use WP which was the main source of my agony. But practice makes perf— no. It makes you better. And I got better! I kept building, eventually the pain subsided and soon it came time to rebuild my portfolio site (previously a React app / coding bootcamp project). I reached for WP instinctually at first. Sadly it felt like I wasted a lot of time because of course I had to build my own custom theme, right?! I am a WP dev after all. So it took forever. I was fussing with functions.php, enqueuing stylesheets, building out template parts, wrestling theme.json which is fine when I’m getting paid and making something cool for a client. But no one is paying me for my portfolio site haha. The moment I thought “why do I need SCF for a portfolio site?” was the moment I remembered my old friend Hugo.

What Hugo is

Hugo is a static site generator. You write your content in markdown (which I LOVE), you write some templates, and Hugo mashes them together into plain HTML, CSS, and images if you want. That’s it. There is NO database. No PHP running every time someone loads a page. It builds the entire site ahead of time, which is why it’s so fast. Cue opening scene in Cars

A whole post is just a text file that looks like this:

---
title: "My First Post"
date: 2026-08-02
tags: ["hugo"]
---

# Hey there

Just plain **markdown**. No page builder, no drag-and-drop, no `<div>` soup.

So yeah coming from a WordPress background, that was a whole mindset shift. WordPress assembles the page on every single request. Hugo bakes the page once and then it’s just… done. Ka-chow.

WP Plugins are built in features

One of the coolest things about it is that a lot of Hugo’s features are basically the built-in version of the plugins you’d reach for in WordPress.

In WordPress you’d install…In Hugo it’s just…
Smush / ShortPixel for imagesbuilt in
Yoast for SEO and sitemapsbuilt in
A “related posts” pluginbuilt in
A caching pluginnot even needed

But in WordPress those are third-party plugins running PHP on every visit: extra database queries, more attack surface, an endless update treadmill, and the occasional plugin that fights another plugin. In Hugo, these features are baked into the core and they run one time, at build time. The visitor just gets the finished result.

Other cool features

  • Reading time. See that little “x min read” at the top of this post? I didn’t write a single line of code for it. And no, I didn’t time myself to see how long it took me to read this post either, lol. Hugo did it. It counted all the words in this very post and divided by about 213 words per minute (I guess that’s how fast people read), then rounded up. Edit the post, the number updates itself. How neat is that?! The whole feature is basically one line in the template:

    {{ .ReadingTime }} min read
    
  • Tags that build their own pages. I drop a tags line into the front matter (that little settings block at the very top of each post, between the --- lines):

    tags: ["linux", "hugo", "self-hosting"]
    

    …and Hugo automatically spins up /tags/linux/, /tags/hugo/, and /tags/self-hosting/, each one a real page listing every post with that tag. Zero extra work.

  • Image processing. You hand it one big photo and it spits out resized, optimized versions in modern formats like WebP and AVIF, with responsive srcset so phones grab a small file and big screens grab a sharp one. For a portfolio, getting fast-loading images without manually resizing and exporting a dozen versions by hand? Chef’s kiss.

  • Cache-proof assets. Hugo can put a content hash right in the CSS filename, so when I change my styles the URL changes too and browsers can’t serve a stale version. This site literally uses it:

    {{ $css := resources.Get "css/main.css" | fingerprint }}
    <link rel="stylesheet" href="{{ $css.RelPermalink }}">
    

    That spits out a filename like main.b4b264….css, so the second my CSS changes, so does the URL. Ask me how I learned to love this feature. It ate.

And that’s before you even get to the free RSS feed, the auto-generated sitemap, shortcodes, and a table of contents built from your own headings.

And yeah, WordPress can technically do most of this too, mostly through plugins or core. The difference is that here it’s just… there. Nothing to install, nothing running on a server to make it happen.

Security and speed

No plugins means no plugin vulnerabilities. There’s no wp-login to brute force and no PHP to exploit, because there isn’t any running. The site is already static, so it’s fast by default and there’s basically nothing to cache. If you’re someone who wants to host your own sites on your own server (hi, it’s me), this combo eats.

Tradeoffs.. There’s always a tradeoff

Static can’t do dynamic on its own. Forms, comments, logins, shopping carts, anything that’s different per user or updates live, all of that needs a server actually running code. For Hugo it’s a feature, not a bug.

The verdict

Big fan. I’ve built 2.5 sites with this so far and I love it. Did I mention I love Markdown? You should, too. If you live in WordPress and you’re even a little curious, try rebuilding something small in it. If you love .md files as much as I do, you’ll be hooked. The speed alone hits different, and once you feel how little there is to break, it’s hard to go back.