I started this blog six years ago, and except for a few short months where I migrated to Medium (all the cool kids were using it), WordPress has been my CMS of choice. Back in 2013, I was still in university, and had no idea how to start a blog. I just knew I wanted to start a blog, and I wanted to own the content. After a few Google searches, I found WordPress, and the rest is history.

Over the last six years, I’ve gotten to know the WordPress ecosystem very well. I’ve tried pretty much every managed WordPress host – Kinsta (my current employer), WP Engine, Pagely, Flywheel, Servebolt, Cloudways, etc. I’ve burned way too much money on premium themes – Genesis (worth it), Thesis (disappointing), Uncode, etc. I’ve spent a lot of time optimizing database queries, hacking around in PHP, and keeping WordPress up to date.

Goodbye, WordPress

Maintaining a sense of minimalism on my blog has always been important to me. I like clean and functional layouts, beautiful typography, and a streamlined post editor – everything else is unnecessary. Creating this kind of minimalist experience for both the reader and the writer in WordPress was ironically complicated – plugins galore. This philosophical disagreement between frontend minimalism and backend clutter was what drove me to seek out a better blogging tool for my needs.

  • Medium was the first stop, and I really liked it for a while. The frontend looked nice, and the backend editor didn’t have any unnecessary functions. For me, Medium’s biggest feature was its lack of features and customizability. However, all good things come to an end. I got spooked and left Medium after they suddenly dropped custom domain support.
  • After Medium, I briefly tried Ghost. At that point in time, Ghost was still very much in its infancy, and it was unclear if the project would be sustainable in the long term. I definitely prefer Ghost’s general user experience over WordPress. The streamlined editor is right up my alley and the administration backend is super fast. In the end, I missed a few key features like custom fields and filesystem-esque interface for managing images.
Yo! Want to start a new blog in 2021? I'll be giving away 6 months of Kinsta WordPress hosting (a $180 value) on Christmas Day! To enter, subscribe to Brian On WP, leave a review, and enable notifications! Before Christmas, I'll share a special URL during two episodes. The first two people to successfully follow the instructions at each URL will win 6 months of free Kinsta hosting!

Back to WordPress

After trying out Medium and Ghost for a while, I eventually found myself back in WordPress land. I rebuilt my website’s theme from scratch – multiple post types, custom fields, and optimized for speed. I managed to get my home page down to one HTTP request, which was pretty awesome.

I stayed with this WordPress setup for a while, but then I started working for Kinsta – a leading managed WordPress host. I love my job, but I soon realized “too much WordPress” is a real thing. Writing in the WordPress editor, debugging plugins, and optimizing a constantly evolving database after spending my day at work doing those exact same things made me view writing on this site seem like a chore. I yearned for something on the opposite side of the spectrum – something static.

Goodbye WordPress, (Again)

This time around, I wanted to find a self-hosted blogging tool with minimal functional overhead – server-side dependencies, consistent database maintenance, etc. These requirements excluded pretty much every CMS – WordPress, Ghost, Medium, Statamic, CraftCMS, etc. The remaining candidates were pure static site generators like Gatsby, Jekyll, and Hugo. After some extensive research, I found myself gravitating towards Hugo for a few reasons.

  1. Hugo is fast. I’m currently using it for two sites. On this site, my builds take 4 seconds to finish because I have a ton of images files. On my other site, the builds finish in, wait for it, 80 milliseconds – that’s insanely fast. When it comes to pure speed, Hugo is in a league of its own.
  2. Hugo is easy to install. On macOS, I was able to install Hugo with one command. No additional dependencies. Super easy.
  3. Hugo’s templating system uses Go, which was really easy to pick up. With no prior experience with Go, I was able to convert my WordPress theme to Hugo in just a few days – something I’ve never been able to do with JS.

Is Hugo the perfect static site generator for everyone? Nope, but it was the best choice for me because I just wanted to build a basic blog with fast build times.

Migrating from WordPress to Hugo

The migration process from WordPress to Hugo was a little messy. On Hugo’s migrations page, there are a few options for migrating from WordPress.

  • wordpress-to-hugo-exporter - A one-click WordPress plugin that converts all posts, pages, taxonomies, metadata, and settings to Markdown and YAML which can be dropped into Hugo. (Note: If you have trouble using this plugin, you can export your site for Jekyll and use Hugo’s built in Jekyll converter listed above.)
  • exitwp-for-hugo - A python script which works with the xml export from Wordpress and converts Wordpress pages and posts to Markdown and YAML for hugo.
  • blog2md - Works with exported xml file of your free YOUR-TLD.wordpress.com website. It also saves approved comments to YOUR-POST-NAME-comments.md file along with posts.

I tried all three of these tools, but they didn’t work for me. The wordpress-to-hugo-exporter plugin didn’t seem to be compatible with the latest version of WordPress. The exitwp-for-hugo Python script didn’t convert my posts correctly. The blog2md tool seems to be built for sites hosted on WordPress.com, so it was irrelevant for my needs. I ended up writing my own Python script to convert my WordPress content to Markdown files for Hugo. All in all, it took about a week of work to perfect the conversion process.

For hosting, I tried out Google Cloud Storage, Cloudflare Workers Sites, and Netlify. I ended up stick with Netlify with Cloudflare CDN because the automated continuous deployment from GitHub is incredibly convenient.

My current workflow goes something like this.

  1. Write a new post in my local repo with Ulysses or Sublime Text.
  2. Preview the site locally with Hugo.
  3. Push to my GitHub repo.
  4. Netlify rebuilds my site, invalidates its own cache, and sends a POST request to Cloudflare to purge their cache as well.

All of this is completely automated, and takes around 3 minutes to complete.

Moving Forward with Hugo

At the moment, I am very happy with Hugo, and I don’t foresee myself switching to another static site generator or CMS anytime soon. I enjoy the process of writing in my favorite text editor, and then being able to push to live without any additional work. The hosting side of things is great as well. For my use case, Netlify and GitHub are completely free to use. I do pay $20/month for Cloudflare Pro because I like the WEBP conversion feature, but that’s not a strict requirement to keep my site online. In 2020, my goal is to learn more Go, so I can refactor my theme with better code and more best practices.