Migrating this blog from WordPress to Hugo

So, the blog is live with Hugo and I’m writing the first post in markdown.

The road has been long, but because I geeked in a new way … well we are in 2026, you already guessed it: yes, AI is behind all of that !

It all started with a question to Gemini: port the blog from WordPress to a static site using a generator in Go… then we started to code with a lot of copy-paste: the Hugo conf and templates, a first docker-compose with a dump of the WordPress db to recover the content. The idea was to code a tool in Go that would do the conversion, so that as long as the rendering wasn’t satisfying I could erase everything and relaunch the import of the posts.

After a lot of reluctance I installed opencode but not without locking it in a Docker. Then I discovered greywall, pi.dev and developed AI-Cabin but my dive into AI is another story, back to the blog.

So I was saying, this port was made with the help of more and more performant AI, but still limited because to keep control over my data I didn’t open accounts at the big actors. I used Gemini because I already have a Google account and this blog is already public, then I moved to the models of Scaleway.

The 3 big elements of this port:

  • an importer: code in Go that uses sqlc to read the db and html-to-markdown/v2 to transform the (pseudo) html of WordPress into markdown files.
  • a multilingual Hugo conf
    • and there, the feature I never finished: the thing that was limping with gengo and that I didn’t finish on polylang: the multilingual aggregate view was finally possible ! a virtual language all in the Hugo config and a virtual duplication of the french or english content into this ‘dimension’ as defined since Hugo v0.156.
  • finally, a tool to compare the Hugo rendering against a wget capture of the WordPress (with plenty of tolerance rules for the things I chose to change)

The big features:

  • reproducible and quite faithful import despite a conversion to markdown
    • thanks to a plugin on html-to-md that I have to publish quickly: because the WordPress html has quite a lot of weirdness:
      • you think already about the line jumps that make paragraphs (wpautop)
      • the smileys
      • the typographic conversions (ex the pretty quotes)
  • comments import (in static because well it was disabled since a long time … thanks spammers)
  • URI preservation because « Cool URIs don’t change » — I already talked about it in 2010 — by configuring Hugo to reproduce in part the WordPress structure, the rest with generated redirects.

There it is, it’s live, I’ll be able to remove PHP from the server, a bit less stress regarding the flaws 😅