← Back to blog
Updates·Jul 13, 2026·5 min read

Leaving WordPress After Twenty Years, in About a Day

This weekend I ended a twenty-year relationship with WordPress.

I'd already mentioned that I was migrating off it, but I said at the time I'd keep this blog running there a while longer.

Then I woke up and just pulled the trigger. Somewhere between coffee and opening my laptop, I decided the slow transition wasn't going to happen. So I made it fast instead.

Goodbye wordpress

Why I did it

The honest reason I stayed with WordPress this long is comfort. I could blog, drop in images, and schedule posts through the WP Admin backend without thinking. I could use it with my eyes closed, and there's something to be said for that kind of ease.

But the more I sat with it, the more it felt wrong. Every other month I've been building, adapting, and experimenting with tools I'd never touched before.

Meanwhile, the blog that's supposed to be the center of my online presence was still running on the one platform I never had to push myself on. My biggest fear was breaking something. So I never touched it.

Trading WordPress for Next.js and Vercel changed that. It genuinely felt like a divorce. A little bitter, a little uncertain. But mostly relief.

What made it possible

A while back I built my own dashboard, Ryoka OS. It's the center of everything I do: publishing, content, scheduling, all of it, without logging into a dozen different tools, even remotely. The one gap was that I couldn't add images inside my docs yet.

I sat down with Claude AI, and we closed that gap. We improved the docs feature, added the ability to drop images straight into a post, cleaned up the flow from draft to published, and fixed how images get stored and pushed out to each blog post.

That one change mattered more than it sounds like it should. It's what let me cut WordPress loose, because now every property I run publishes through the same system.

I can open Ryoka OS, write, schedule, and publish across every site or entity I hold, including the niche blog network I've been planning, starting with indiehacker.blog, and my other journal about life in Taiwan on pieter.tw.

One day, give or take

The whole rebuild took under twenty-four hours, though it felt closer than that toward the end. Here's roughly what happened.

I built a new design and layout from scratch. Minimal, but not another generic WordPress template.

I rebuilt the blog system itself, individual post pages, category pages, pagination, all wired into Supabase and Ryoka OS, so the site went from static placeholder content to the same live data already running pieter.tw.

I fully expected the WordPress migration to be the hard part. Instead I found that 30 of my 31 old posts had already been manually rewritten into Ryoka OS as backups at some point, so what I feared would be a huge migration turned into vetting posts one by one.

I built a redirect map for the roughly 34 old WordPress URLs so nothing broke on the way out, then flipped DNS at Namecheap and pointed the domain at Vercel. Done.

The hard parts

Not everything was clean. Knowing where content actually lived at any given moment- Supabase, WordPress, a stale CSV export, or whatever was live at that second- caused real confusion more than once.

At one point, a stale export nearly shipped a broken redirect; one entry pointed at a literal broken URL string instead of a real slug. I only caught it by rechecking against fresh data instead of trusting the snapshot I already had.

Some of the CSS bugs looked simple and weren't. A sticky toolbar quietly did nothing, and it took a while to realize the real problem was a minHeight versus height mismatch several layers up, not the sticky positioning itself.

A stray file named literally [slug] instead of a folder silently broke an entire route, and it looked fine until I actually visited the page.

And at some point I realized six or more pages had fully duplicated header code, so a change as small as reordering the nav or resizing the logo meant editing the same block five, ten, thirteen times over.

Where I went wrong

A few honest mistakes along the way. Early on, I pasted images as raw HTML straight into a rich text editor, which silently failed, since rich text editors don't render pasted markup; they just print it as text.

I also mixed up pieterborremans.com with its Vercel preview URL. They looked interchangeable and weren't. An image would work on one and 404 on the other, and it took a bit to diagnose why.

And I got the favicon wrong the first pass, pointing it at an existing rectangular photo instead of building a proper square icon the way my other properties already do it.

What surprised me

The part I was most afraid of, the actual WordPress and image export, turned out to be the smallest part of the whole project.

Almost everything that took real time was structural: consistent headers, consistent typography, consistent navigation, one shared component instead of the same code copy-pasted across pages.

And rechecking live data before shipping anything that depended on it- the redirects, the deduping- mattered more than I expected. Both near misses came from trusting a snapshot instead of double-checking it.

Where I land now

By the time I saw the finish line, it was still before dinner. I started the day with basically zero confidence this would work. But the further in I got, the more it clicked, especially once I slowed down enough to follow what Claude AI was walking me through instead of rushing past it.

I also spent more time than I probably should admit nitpicking the design. I wanted something that wouldn't need a refresh every year, and that felt like mine. Minimal, quiet, but still doing something.

What felt impossible at 6 am turned into something closer to a straight line by evening. WordPress, the hosting, the plugin updates that break for no reason, all of that is gone now. Twenty years, and I don't miss it yet.