I started my Software Engineering journey 14 years ago, writing code for the web. It started with some WordPress dabbling and eventually JavaScript. During the past 5 years, I’ve slowly shifted away from web development. These days, I mostly use Swift, Objective-C, and Java.

With my focus elsewhere, it’s hard to keep up with the latest WordPress changes.

For the past 8 years, I was hosting this blog on Pressable. They are a part of Automattic, the company behind WordPress.

However, I wanted to avoid dealing with maintenance, mainly WordPress and plugin updates. Pressable’s price, while reasonable, was a bit too much for a personal blog. Additionally, I didn’t need 99% of the features WordPress provides.

To save time and hosting costs, I decided to move to a static site. I finished migration to Hugo earlier this week, and it was a fun learning experience.

Why Hugo

Once I had decided on a static site, I narrowed my options to:

  1. Jekyll
  2. Pelican
  3. Hugo

I wanted to avoid using Jekyll because I barely know Ruby. Based on language familiarity, my first pick was Pelican.

But Pelican had fewer theme options. Out of the themes I found, I wasn’t a big fan of any single one. So, I checked out Hugo themes and found PaperMod, which I really liked.

The second factor was active development. Hugo had more recent releases compared to Jekyll and Pelican. This may be a result of Hugo being less mature and feature rich, but it had all the features I needed.

Finally, I’ve been hearing many good things about Go and while I don’t plan to use it a lot anytime soon, I’d pick it over Ruby for learning.

So, I settled on Hugo.

Importing Content

With framework selected, the next task was importing content. I tried the Jekyll Exporter WordPress plugin, but it timed out when trying to export the posts. At this point, I could try to fix the plugin or just write a basic importer myself.

I opted to write an importer in Python. The script reads the WordPress XML export file and spits out a series of markdown files. There are still several features missing, but it works well enough for my small blog.

Writing an importer this fast was possible only because of the amazing Python ecosystem. These two libraries that made it effortless:

  1. Untangle to parse XML.
  2. Markdownify to convert HTML to Markdown.

There’s some crude parsing logic to convert the shortcodes and embeds as well that’s basically duct tape. But hey, it works for me.

If this script is something that you’ll find useful, feel free to use or modify it: WordPress Hugo Converter


For hosting, I was split between AWS and Netlify. I started with AWS and ran into DNS issues due to some confusing instructions. I had to search a bit because they require a $29/month payment plan for technical support.

In an ideal world, I would have gone with Netlify but since:

  1. I want to learn AWS
  2. I work at Amazon (not AWS)

I decided to stick with AWS. Moving to Route 53 resolved the DNS hiccups. After that, deploying the site with AWS Amplify was a breeze.

The Theme

I’m using PaperMod, a modified version of Paper. The no frills design and dark mode sold me on the theme. I’ve made a few customizations of my own to fix Safari scrollbars, and I’ve a few more that I’ll make slowly.

Overall, using and learning Hugo has been fun, and I am finally happy to use something besides S3.

If you have any questions and are stuck with a migration yourself, feel free to reach out on Twitter.