If you are reading this, the site has made it from WordPress to Hugo. Boom! In this post I talk about why I migrated, and how I used Cursor’s AI capabilities to help.

Why move away from WordPress?

I first used WordPress in 2010, and this blog has lived there since 2015. WordPress is powerful, but overkill for my needs. I run a simple blog and a couple of single-page sites, and I already write everything as Markdown in Obsidian. Hugo takes those files and generates static HTML. At £300 per year, the hosting had got expensive too.

Why now?

Earlier this year I wrote about using Cursor and MCP as a product manager, which was shortly followed by an organisation-wide switch to Claude. With the subscription running out at the end of the month, I decided not to let all those credits go to waste.

A couple of years ago I looked into moving this blog off WordPress, and I gave up after a few hours. This time I started and finished within a single Sunday. AI has significantly reduced the cost of change. Here is how it helped.

How Cursor helped

1. Cursor for learning

I opened my site’s folder in Cursor, so I could edit it directly and ask for help in the same place. Cursor opens in agent mode by default, encouraging me to ask natural language questions of the code. I have always been someone who prefers asking dumb questions rather than reading the documentation! This capability helped me learn everything I needed to know, from adding/editing blog posts to what to exclude in a .gitignore file.

2. Cursor for planning

When I use AI for big tasks, I always start by asking it to make a plan and to give me options. This gives me understanding and control over the process, and gets the best out of AI by forcing it to think through its work. Once I’ve agreed the plan, we then work through it step-by-step.

Example planning questions I used in this project include:

  • How can I migrate my WordPress site to Hugo? Walk me through it step by step.
  • What steps must I take for this site to continue working once I switch the DNS from old site to new?
  • What could go wrong with this implementation? How can I reduce the risk?

3. Cursor for doing

I found myself asking Cursor to do most tasks for me - at least for the first time. My GitHub tracks all changes Cursor makes so I was able to keep track of what it was changing and where so I could learn how to do it myself. It got me to a v1 site quickly, and then I was able to iterate from there with many small changes. With each small change I built confidence in how to make changes to Hugo directly myself.

It was great to be able to hand off repetitive jobs. On multiple occasions, I had to make the same change across 60+ historical blog posts all in one go. One example included removing WordPress specific metadata from the top of every post. Another involved converting my WordPress category data into tags and updating the content in every post.

I also handed off ambiguous problems for Cursor to investigate and solve. During setup I realised that my Hugo folder had grown to more than 1GB. Cursor made a plan to reduce this and came back with options and recommendations. This helped me cut the folder size by a third, and simplified my codebase.

4. Cursor for testing

Cursor is able to open a browser to complete tasks on the web itself and report back. This makes it an extremely powerful tester. I would never have had time to check every blog post for errors. Examples of testing jobs Cursor did for me include:

  • Check every Hugo post against the WordPress equivalent. It found about 10 posts with issues and was able to fix all of them on the next prompt.
  • Check the site for post launch issues. This is where it discovered errors with redirects and sitemap files that would otherwise have surfaced weeks later in the form of a drop off in analytics.

5. Cursor to the rescue

One issue Cursor found after I had migrated was that I had forgotten my meta descriptions. These were set up in a separate WordPress plugin so were not found in my initial bulk export from WordPress. Fortunately, Cursor was able to go back through copies of old WordPress pages it found on the Internet Archive, grab all my meta descriptions, and load them into my posts. It also spotted a couple of typos in my previous content, and helped me generate descriptions for posts where I had never written one, which I then reviewed and edited. Neat!

Things to watch out for

Generative AI models have a tendency to overcomplicate things. On more than one occasion I would ask for what seemed like a simple change, and then Cursor would solve it in an overly complex way. For example, when I asked it to add PostHog analytics tracking, it made changes in 4 separate files. On this occasion, I asked Cursor to explore other simpler options, and it came back with a 3 line change to 1 file.

Left unchecked, this type of issue would lead to a complex and difficult to maintain implementation. The key for me was to monitor what it was doing, and call out any questionable decisions.

A pretty good Sunday

I know how stressful a migration can be. I have been involved in more than my fair share. This one was faster, easier, and higher quality than it would have been if I had done it myself. The quality improvements were particularly impressive. Cursor checked for and found issues that I would not have found. And I have saved £300 per year, as unless I get a serious spike in users I will qualify for Cloudflare’s generous free hosting tier.

For what it is worth, I do not think any of this is particular to Cursor. The same way of working should be fine in Claude Code or Codex. Ask for a plan. Agree it before anything gets edited. Let it do the repetitive changes. Look at the diff. Push back when the answer looks too complicated. Commit regularly. Ask it to test and look for issues. And then to fix them when found.

Resources

If you want to try the migration itself, these are the pages I used:

  1. Hugo’s setup instructions.

  2. Cloudflare’s Hugo setup instructions.

  3. PaperMod. The theme I used.

  4. wordpress-to-hugo-exporter. Does what it says on the tin!