Why I Switched from WordPress to Hugo

I Just Want to Put Text on the Internet
That’s it. That’s the whole requirement. I write things, I want them on a website. Markdown in, HTML out. After years of WordPress slowly losing its mind, I switched to Hugo, a static site generator that starts with exactly that and lets you bolt on the rest yourself.
WordPress heard “simple” and said hold on, let me spin up a MySQL database, a PHP runtime, an admin panel with a login page, a REST API, a block editor nobody wanted, a cron system, a media library, and, oh you’ll love this, a built-in emoji script. wp-emoji-release.min.js. Ships on every single page. Every. Page.
I write blog posts about Docker containers. I do not need browser-side emoji rendering. WordPress ships it anyway.
I Used to Love WordPress. That’s the Sad Part.
WordPress was my go-to for like a decade. And back then? It ruled. Install it, pick a theme, write posts. The admin panel was clean. The editor was a text box. You typed words into it. Revolutionary concept.
That WordPress is dead.
Somewhere around 2018 someone at Automattic decided WordPress needed to be Squarespace and Shopify and Salesforce all at once. The classic editor got ripped out and replaced by Gutenberg, a block editor that solves a problem nobody had. Want to write a paragraph? Drag a block. Want an image? Different block. Want to just type words into a text box like you’ve been doing for fifteen years? Get absolutely wrecked, here’s blocks.
I tried to like Gutenberg. I really did. I gave it months. It’s awful. It turns “write a blog post” into “assemble a blog post from Lego bricks while the UI fights you.” I don’t want to drag and drop my paragraphs. I want to type.
And the plugins. Oh god, the plugins.
Everything is freemium now. Everything. Install a contact form plugin, immediately get three nag banners about the Pro version. Install Yoast, get a dashboard that looks like the cockpit of a 747 with half the instruments locked behind a paywall. Install a gallery plugin, get upsold on “premium templates” and “priority support” and a newsletter you never signed up for.
I ran a WordPress site for a small project last year. The dashboard had more notifications than my phone. Update this, renew that, your PHP version is outdated, this plugin conflicts with that plugin, would you like to connect to Jetpack, would you like to try the AI writing assistant, would you like to upgrade to Premium Plus Pro Business Enterprise.
No. I would like to write a blog post. That used to be what this thing was for. Remember?
Hugo: A Static Site Generator That Does Basically Nothing
Hugo takes Markdown files and spits out static HTML. No database. No PHP. No server-side anything. Just… files. On a disk. Nginx points at them.
That’s it. That’s the product.
The build for this entire site takes under a second. I run Hugo in a Docker container because I’m that kind of person, and the site is live before I can switch browser tabs.
WordPress sites also load. Eventually. If the cache plugin is cooperating. And the optimization plugin isn’t in a fistfight with the security plugin. And nobody pushed an update that broke WooCommerce even though you don’t have a shop and never had a shop, you just installed it in 2021 “just in case” and now it’s load-bearing somehow.
We’ve all been there. Don’t lie to me.
Hugo Performance: 100/100 Lighthouse and I Barely Tried
This site scores 100 across the board on Google Lighthouse. Performance, accessibility, best practices, SEO. All hundreds.
I need you to understand: this is not because I’m some frontend god. I am not. This is because there is nothing here. No jQuery from 2014. No render-blocking plugin CSS. No admin bar leaking into production because you were logged in and didn’t notice for a week. No wp-emoji-release.min.js. I will keep bringing that up. It haunts me.
Static HTML is fast because there is nothing to be slow. You can’t have a slow page if the page is just text and a couple of images.
You can also get good Lighthouse scores with WordPress. You just need WP Super Cache or W3 Total Cache or LiteSpeed Cache (pick one, pray), plus Autoptimize for the CSS and JS, plus ShortPixel or Imagify for images, plus a lazy-loading plugin unless your theme already does it but probably wrong, plus probably a CDN, and then you spend a Saturday configuring all of that. Two weeks later a WordPress update breaks one plugin and your scores crater and you don’t notice until someone on Twitter tells you your site loads slower than their grandma’s dial-up.
But yeah. Totally the same thing as just having HTML files.
Hugo’s Learning Curve Will Humble You
Okay look. Hugo is not easy. I’m not going to sugarcoat this.
Go templates are cursed. Who looked at {{ range where .Pages "Type" "posts" }} and thought yeah, that’s readable, ship it. The syntax looks like someone took a perfectly normal for-loop, ran it through a blender, and served whatever came out. Half the time you’re just guessing where the curly braces go and hoping the error message is useful. It won’t be.
I wasted an entire evening trying to figure out why my tags page was blank. No content. No errors. No warnings. Just a white page, radiating smugness. Turns out I had the taxonomy config wrong. One line. One stupid line in hugo.toml and the whole thing just silently decided not to work.
And the docs. The Hugo docs are… they exist. They technically contain the information you need. But reading them feels like looking up a word in the dictionary and the definition uses four other words you also need to look up. Technically correct. Completely useless when you’re debugging at midnight.
But after about a week of suffering, it clicks. You stop fighting Go templates and start thinking in partials and base layouts, and suddenly it’s just text files all the way down. No surprises. No “WordPress auto-updated at 3 AM and now your header font is Comic Sans and your contact form emails go to the void.”
That specific thing hasn’t happened to me. But I’ve seen things on Reddit that would make you cry.
Building a Custom Hugo Theme Because Every Other One Sucked
Every Hugo theme on the internet falls into one of two categories:
- So minimal it’s basically a
<pre>tag with pretensions - Has a
params.tomllonger than the complete works of Shakespeare
The popular ones are insane. Thirty config options for the footer alone. A “social” section with slots for your Mastodon, your Bluesky, your LinkedIn, your GitHub, your YouTube, your Twitch, your MySpace. A dark mode toggle that breaks if you also enable “custom colors.” Documentation that says “see example site” and the example site uses every feature at once so you can’t tell what does what.
So I built my own. Took a while. Involved a lot of swearing and one evening where I genuinely considered just writing raw HTML like it’s 2003.
But now every single line of markup on this site is something I put there on purpose. When something breaks (and stuff breaks, it’s software) I know exactly where the problem is because I wrote the problem.
With someone else’s theme you get to play detective in a codebase you’ve never seen. Seven partial files, three of which seem to render the post title, and the bug is always in the one you checked last.
WordPress Security vs a Static Site
WordPress gets hacked. A lot. Not because the core software is garbage, but because it’s the biggest target on the internet, it runs PHP, and every WordPress site on earth has at least four plugins from developers who stopped answering GitHub issues in 2019.
There’s an entire industry built around WordPress security. Wordfence, Sucuri, iThemes Security, All In One WP Security. Plugins to protect you from the vulnerabilities introduced by your other plugins. It’s honestly kind of beautiful. A perfectly self-sustaining ecosystem of problems and solutions to those problems.
You know what the attack surface of my Hugo site is?
Files. On a server. Read-only.
No admin panel to brute-force. No xmlrpc.php hanging out like a neon sign that says “hack me.” No database to inject into. No wp-login.php getting hammered by bots from every corner of the internet every fourteen minutes around the clock forever.
Some bot still tries to hit /wp-admin on this site like three times a day. I check the access logs sometimes just for entertainment. Keep trying, buddy.
What Hugo Can’t Do (That WordPress Can)
Look, I’ll give WordPress this: out of the box, it wins on features. Contact forms, comments, search, newsletters, membership areas. Install a plugin, done. Five minutes. Works. With Hugo you get a folder of HTML files and a pat on the back.
But I’m stubborn and I will die on this hill.
Search was the first thing I tackled. Everyone says “you can’t have search on a static site” like it’s a law of physics. Turns out you can. I added Pagefind to this blog and it cost me an evening, a lot of swearing, and one moment where I questioned why I didn’t just use WordPress. Pagefind crawls your HTML after Hugo builds, creates a chunked index, ships its own UI. No backend. No JSON templates. No shipping your entire blog as a fat JavaScript blob to every visitor. It just works, and it works better than whatever search plugin WordPress would’ve given me after three upsell banners.
Contact forms? I’ll figure something out. Comments? Eventually. RSS? Already there, Hugo does that natively. The point is: everything WordPress hands you on a silver platter, I can duct-tape onto Hugo if I care enough. And apparently I care enough. I’ve been adding features to a four-post blog like it’s my full-time job.
WordPress gives you everything on day one and then slowly buries you in plugin updates and freemium nags. Hugo gives you nothing on day one and then you spend your evenings building it yourself and somehow enjoying it. Pick your poison.
Hugo vs WordPress: Who Should Switch
If you like the terminal, write in a text editor, and don’t need seventeen dashboard widgets telling you how many comments are pending moderation on a blog that gets four visitors a day… Hugo.
If the terminal makes you nervous or you need a blog running in ten minutes or you want to install WooCommerce “just in case”… WordPress. It’s fine. It works. It’s just a lot.
But if you’ve ever opened your WordPress dashboard, stared at the forty-seven menu items, the six update notifications, the banner begging you to upgrade to Business Pro Plus Premium, the popup asking you to rate the plugin five stars, the Jetpack prompt, the “your site is running an outdated version of PHP” warning you’ve been ignoring for eight months…
And thought “I just want to write a blog post.”
Yeah. I know.
TL;DR
Hugo turns Markdown into static HTML. No database, no PHP, no plugin circus. This site hits 100/100 on Lighthouse because there’s barely anything to load. The learning curve is steep and will make you question your career choices for about a week. Every existing theme annoyed me so I built my own. WordPress does more out of the box, but I’m duct-taping features onto Hugo one evening at a time and enjoying every stupid minute of it. WordPress used to be the obvious choice. Then it got Gutenberg and freemium brain rot. I just want to put text on the internet. Hugo lets me do that without asking me to upgrade to Pro.