Migrating away from WordPress

Occasionally I get the urge to write blog articles. But I was unhappy with my website, originally made in WordPress. It needed security updates more frequently than I posted, and that crushed my motivation.
I wanted a better alternative. Or perhaps ... maybe ... I could write a new CMS to host the blog? Or write a new programming language to write the CMS? Or write my own operating system to host it? Rewrite the BIOS? Build my own computer from grains of sand?!? Yes, that seems like a good idea. This is the curse all techies: writing code instead of doing what needs to be done.
And so many years passed out of memory.
But I've finally done it! I've replaced WordPress; rehomed the website; added new features like commenting, search, and syndication; and learned more about CORS than I ever wanted to know.
And I guess now I have no more excuses not to write an article. What should I write about? How about the journey to deploy this blog? It's certainly top-of-mind.
What I want in a blog
Headless CMS
Some content-management software (CMS), like WordPress, requires using the same presentation layer that the CMS uses. I want to use vanilla JavaScript so I don't have to debug page-load times, content rendering issues, and bundling flags. It's a blog; it's supposed to be simple!
I don't want a different hosted solution like Wix or Squarespace or Substack. Those follow one of two models: failure or enshittification. I want to run it myself, so it needs to be simple enough for my tiny brain to understand and extend -- and to replace without much effort if necessary.
I like writing posts in Markdown because I'd rather focus on content than formatting. I need syntax highlighting because this is a blog about coding.
I'd like the CMS to be optional so I can edit files and save them in git.
I chose Sveltia CMS.
Good developer experience
Can I tell you how much I hate most JavaScript tools? Slow, noisy, fragile, and complex. Do I really need to become an expert in some custom configuration language? I like the way Ruby on Rails does things with convention over configuration, and the principle of omakase, where the chef chooses what you get.
I chose Zola for my site generator. It's fast: it builds the site in 516 ms. It creates a sitemap, converts images to the right format, generates multiple sizes, checks links, doesn't require extensive configuration, and just works. That's the kind of tech I like.
Custom features
I coded the site to have a single feed for all types of posts (the homepage), with separate listings for blog articles ("Longwords") and shorts posts ("Bits"). I added brag pages for the projects ("Projects") and reference materials ("Library"). Very programmer-ish names, right? Perfect.
I want the site to be searchable, without having a server to perform the search. Easy pie: just build an index and have the client download thanks to ElasticLunr.
It's a coding site, so it's gotta have dark mode. And heck, why not allow the user to select the color-palette too. Done.
Post Once, Syndicate Everywhere
I read an article by Molly White about POSSE ("Post Once, Syndicate Everywhere"):
Rather than publishing a post onto someone else’s servers on Twitter or Mastodon or Bluesky or Threads or whichever microblogging service will inevitably come along next, the posts are published locally to a service you control ... and syndicating the posts through them either by copying the post there directly, or publishing a snippet with a link back to the original source.
As someone who deleted all my Twitter posts due to the insanity of its owner, the idea of POSSE resonates.
I want my blog to be the canonical location for all posts, and syndicate them everywhere else. And I don't want to have to do it myself, no sir. I'm a programmer. It should happen automatically. So I rolled my own syndication code.
Comments
I used to use Discus for comments. They handled all the operational aspects for free. Their business model was adding "chum boxes" of awful advertisements, but that was optional so I left it off. I guess their business model didn't work since there's no free plan these days.
I found a replacement in Remark42, and self-host that on a Hetzner server in a docker container. And fortunately, they've made it easy to import comments from WordPress.
I implemented "scroll to comment" so comment permalinks show the comment.
All the rest
I want all that webby stuff: reactive, pagination, sitemap, CDN, security headers, 100% pagespeed score for mobile & desktop. Check!
No analytics. I used to care. Now it's enough that people sometimes say nice things.
Free to host, thank you Cloudflare.
You can see why it took me a while to switch blogging platforms: I have so many requirements!
About the site
Software & Services
I receive no compensation or benefits for mentioning these services; I'm including them because I think they're great:
- Content management: Sveltia CMS
- Webpage hosting: Cloudflare Pages
- Server hosting: Hetzner
- File hosting: GitHub
- Site builder: Zola static site generator
- Build server: GitHub Actions
- Container management: Docker
- Website search: ElasticLunr
- Authentication: Cloudflare Worker OAuth proxy
- Comments: Remark42
- Reverse proxy: Caddy
- Coding assistant: Claude Code
- Optimization: PageSpeed Insights
- Security scanning: SecurityBot.dev
- Monitoring: StatusDrift
Development effort
- Calendar time < 1 month
- Actual dev time < 20 hours
- Trees burned powering AI agents < many thousands
