A lot of the sites I build are in WordPress. It pays the bills, and it’s not going anywhere anytime soon. Everyone knows that. There’s a lot of use cases for it, honestly so I’m not here to dunk on it. But when it came time to rebuild my own site, well I reached for WP instinctually at first. Sadly I ended up wasting 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.