← Back to blog

From WordPress to a Markdown Blog

TL;DR – I finally brought the old blog back from the dead. It is now a Markdown-first site running in my homelab, with drafts, previews, and a workflow that makes writing fun again.

The old WordPress install had been sitting there unpatched and unloved for way too long. I missed the archive, but I did not miss babysitting a full CMS just to ship a post or two a year.

So I rebuilt it.

This time it lives in a git repo and it is all Markdown. No database. No admin panel. Fast, simple, and easy to extend. I also leaned on Codex to do the grunt work: import, cleanup, and making sure nothing fell through the cracks.

What I cared about

  • Keep the old URLs so links do not break.
  • Preserve as many images/files as possible.
  • Make writing and reviewing drafts easy.
  • Keep it all local and under my control.

Migration notes

I exported the WordPress WXR, converted everything into Markdown, and kept the original permalinks intact. Dates, slugs, and front matter were preserved so old links still resolve.

On assets, I pulled legacy uploads into a data volume and ran a recovery pass for missing files. We brought most of the archive back, but a small set is still missing. I am still hunting those (Wayback and old backups are next on the list).

The stack is now Eleventy + Nginx behind Traefik. Public traffic is still protected while I iterate, and the lab host is where all drafts and previews live.

Drafts, previews, approvals

Drafts are real posts with draft: true and they never ship to production. I can write in the browser, edit metadata, and preview everything without a rebuild. That makes it easy to work with an agent: let it draft, I review, tweak, and only publish once it feels right.

Here is the draft editor and the preview side-by-side:

Codex (aka the boring work)

Codex handled the messy bits: parsing the WordPress export, converting posts into Markdown, rebuilding front matter, and keeping permalinks intact. It also walked the legacy backup tree, matched uploads back to posts, and produced a missing-asset list so we could target recovery instead of guessing.

On the setup side it wired the Eleventy build, Nginx runtime, Traefik routing (lab + public), and the draft editor flow. I still approve everything, but the migration moved way faster with an agent grinding through the repetitive stuff.

What is next

  • Keep hunting the last missing assets.
  • Tighten categories and tags as I re-read older posts.
  • Ship new posts and get back into a rhythm.

If you are reading this later, the migration worked. The blog is alive again (sort of).

-AM

Categories
Tags
migration wordpress eleventy traefik codex