Leaving WordPress after twenty years
I have been running this blog on WordPress since 2006. Twenty years is a long time to keep anything in one place, and for most of them WordPress was exactly the right tool: it let me publish, tinker, break things, and fix them, without ever thinking too hard about the machinery underneath.
What finally moved me off it wasn’t a grand decision. It was a bad afternoon.
The afternoon nothing would save
I was in the middle of modernising the theme — a full redesign, new fonts, a proper dark mode, the works. Somewhere along the way, saving posts started to fail. Not with an error I could point at, which is the worst kind. I’d hit Update, the editor would say it saved, and the content would quietly revert. Autosaves came back empty. Previews were blank.
I did what everyone does first: blamed my own code. Then the plugins. Then the theme I’d just been editing. I disabled things one by one and got nowhere, because the symptom kept shifting. Sometimes it saved, sometimes it didn’t.
The clue that broke it open was a boring one. Reads were fine. The site loaded, the editor loaded, everything I could look at was healthy. Only writes vanished. And when I edited a post straight from the command line, it always worked. That combination only points one direction: the request body wasn’t reaching PHP.
So I stopped theorising and measured it. A three-line probe at the origin, echoing back the size of the body it actually received:
<?php
// How many bytes of POST body did we actually get?
echo strlen(file_get_contents('php://input'));
Pointed straight at the origin, it received every byte, every time. Sent through the CDN in front of it, the same request arrived empty a quarter to three-quarters of the time. The POST bodies were being dropped in transit.
While I was still elbow-deep in it, Cloudflare’s status page lit up with an incident whose title matched exactly what I was in the middle of proving: POST requests not succeeding — not reaching origin servers correctly. It’s a strange kind of relief to see a status page confirm your own diagnosis. The bug wasn’t mine. It wasn’t even WordPress’s.
The question underneath the bug
Here’s the thing, though. An edge network having a rough afternoon is not a reason to abandon a platform. Incidents happen; they get fixed. If that were the whole story, I’d have waited it out.
But sitting there watching saves fail, I found myself asking a question I’d been avoiding for years: why is my blog dynamic at all?
Because the answer was that it no longer needed to be. Everything that once justified a database and a PHP process had already left the building. The QR Code generator that used to run here is its own product now. My apps each have their own sites. One by one, the genuinely dynamic pieces had moved out to where they belonged, and I’d never noticed that what remained was… writing. Text. Posts like this one.
I was running a database, a server-side language, a plugin ecosystem, and a monthly security-update habit, an entire machine of moving parts to serve what is, functionally, a folder of documents. The Cloudflare incident didn’t create that mismatch. It just held up a mirror to it.
Files again
So I rebuilt the whole thing as a static site with Astro, and it turned out to be the ideal fit precisely because it removes moving parts rather than adding them.
There is no database. No PHP. No login page to attack, no plugins to keep patched. Every one of my old posts, nearly a hundred of them, images and all is now a plain Markdown file in a folder. The site is compiled once, ahead of time, into flat HTML that a CDN can serve from the edge without ever bothering an origin server.
And the failure that started all this? It simply can’t happen here. There is no POST from a reader to drop, because there is no write path in the request cycle at all. Publishing is something I do on my own machine and push out; visitors only ever read. An entire category of problem disappeared, not because it was fixed, but because I stopped needing the thing that caused it.
The post you’re reading right now is this, sitting in version control:
---
title: Leaving WordPress after twenty years
date: 2026-07-18T15:00:00
tags: [Astro, WordPress, Cloudflare, Static Site, Blog]
---
I gave a few things up. Comments are gone, and I don’t miss them. There’s no dashboard to log into from my phone at midnight which, it turns out, is a feature. If I ever genuinely need something dynamic again, it can live on its own, the way the QR generator and the apps already do.
Twenty years of WordPress served me well, and I mean that without irony. But a blog is, at heart, just writing that someone reads. Mine is finally shaped like that again: files that turn into pages, and nothing in between that can quietly lose your work on a bad afternoon.