Goodbye WordPress
This blog has moved from WordPress.com to self-hosting. If you were following it via WordPress, you should use an RSS reader pointed at nolanlawson.com/feed instead.
WordPress has served me faithfully for 15 years, but I think it’s time to move on. A few things have nudged me in that direction:
- The recent drama surrounding WordPress has left a bad taste in my mouth and eroded my confidence that it’s a good long-term bet.
- The WordPress interface keeps nudging me away from the old-school plaintext Markdown editor (which remains excellent to this day!), and I never enjoyed the slow, clunky, click-and-drag-and-whoops-you-misclicked experience of Gutenberg.
- WordPress charges me $110/year for something that could be hosted for free on Cloudflare with a static site generator.
Of course I’m losing some things by moving off of WordPress:
- Comments and pingbacks. To be honest, this never felt super valuable to me. I already run a Mastodon instance, so I’m fine just linking to a thread there, or on Lobsters, Hacker News, etc. Plus it was a constant battle to keep up with the spambots (who have gotten incredibly convincing thanks to LLMs).
- WordPress followers. I guess WordPress has its own quasi-RSS system, and I have a few hundred followers there? Well, if this convinces some folks to go pure-RSS and avoid tying themselves to one vendor, then I won’t count it as a loss.
- The theme. I have a lot of nostalgia for my vintage early-2010s “Spring Loaded” theme. I think it gave my blog a bit of charm that I so clearly did not care about the appearance and just kept rocking a retro theme like a bad haircut. It wasn’t zero upkeep, though ‒ I ended up tweaking the CSS many times over the years to bump the font size, fix weird layout issues, improve accessibility, etc.
That said, I’m also gaining quite a bit by moving off of WordPress. Not only am I saving a chunk of change, but I also gave myself an opportunity to modernize the style, add a dark theme, and improve performance with a radical (near-)zero-JS and zero-tracking vision.

In terms of performance, I went with pure-HTML/CSS wherever possible, with JS only popping up to run the dark mode switcher, a small legacy URL redirect, the search (via astro-pagefind), and lite-youtube-embed for the odd YouTube video. Images are lazy-loaded unless they appear very early in the post, everything is the system font, and I pre-rendered all tweets (for my older posts that reference them). Speculation rules speed up navigation a bit on browsers that support it.
In terms of tracking, I decided to just drop it entirely. Of course I could use Cloudflare’s own client-side tracking, or some other provider, but 1) a lot of my readers have ad/tracker blockers anyway, so it’s inaccurate, 2) this data has gotten less useful as more and more sites have tightened their referrer policy (Google used to tell me the search terms! that people actually typed! insanity), and 3) it’s probably bad for my mental health anyway to look at these numbers. Realizing that I’m getting a Hacker News spike is slightly ego-inflating but probably does more harm than good to my anxiety levels.
As for the design, I decided to keep some of the colors and layout from the original theme while largely modernizing it: larger fonts, no gradients or drop-shadows, and no more tag cloud (although I do have some sentimentality for tag clouds!). I also improved the accessibility: my heading levels are finally consistent (I messed this up over the years mostly due to confusion about the main page versus per-post pages), there’s a “skip to main content” link, and I made various other fixes after an Axe audit.

Of course, because it’s 2026 and I’m incredibly lazy (my blog wouldn’t have kept a 15-year-old theme if I wasn’t), I used Claude to do most of the work. The prompt was basically “Here’s a WordPress export, rebuild it in Astro, go nuts.” The fact that it’s this easy to self-host should really make incumbents like WordPress nervous – I’m not sure how an aging blogging technology that still has to deal with critical CVEs in its templating engine (not to mention a wild-and-woolly plugin marketplace) can compete with a static site whipped up by agents. I wish them the best of luck, but I’m stepping off the train.
To be sure, there were issues: WordPress doesn’t export my Markdown files, only HTML, so I had to write a small script to pull them from the WordPress API. I also needed to fix some tiny differences in how Astro converts Markdown to HTML versus WordPress, and I had to set up the RSS/Atom feeds so that feed readers wouldn’t notice a difference. (How many times have I seen someone’s blog suddenly dump all their posts into my feed when they migrated from one system to another?)
Unsurprisingly, since you can just choose how many bugs you want now, the agent also found a bunch of stuff on its own, including broken links, spam comments I missed, and issues with OpenGraph images. I didn’t want to “correct the record” on too many of my older posts, but I did clean up some minor styling and linking issues.
Switching to Astro also meant I could finally get proper syntax highlighting (it’s irked me for years that my WordPress theme doesn’t support ES6 syntax), and I even wrote my own Shiki theme to match the page style. This is the kind of thing I would have considered far too indulgent (and a distraction from, you know, actually writing stuff) pre-LLMs, but these days it’s just a prompt away. For this kind of work, I particularly like Claude artifacts since I can have the agent pitch me on a few different designs.
// Random code snippet to show the colors
class Yolo {
woot() {
const yay = 'yay'
return `ES6 works now! ${yay}`
}
}
Overall, this is basically a project that I had in the back of my mind for years, and which I could finally justify thanks to coding agents. I admit that it gave me some pause to imagine that the design for my website, my entire presence on the web, would now be LLM garbage, but I realized that I just didn’t care. Similar to how, 15 years ago, I grabbed a random WordPress theme and ran with it, I don’t see much harm in having the agents give me the window dressing while I write the content. I still have a personal prohibition against LLMs touching my prose, but the design, to me, is just meh. On many blogs I read I just immediately turn on Firefox Reader Mode anyway, so honestly a lot of people’s designs are just the equivalent of a 90’s Flash splash screen to me.
Plus, if your goal is “don’t let LLMs taint anything you put on the internet,” well WordPress itself is surely eagerly gobbling up LLM code, every social media platform is doing the same, web browsers and OSes are doing it too, so… if you’re touching a computer, you’re interacting with LLM output these days. This seems to just be the direction the world is going in, and I don’t hold code so sacrosanct that I feel the need to keep my code an island of purity in a sea of slop. In any case the agents do a better job than me; I’m continually impressed by Claude’s ability to think of minor things like listening for localStorage events in the theme picker, handling forced-colors aka high-contrast mode, proper HTML formatting for RSS feed readers, etc.
So anyway, this is the new site! Unless you’re reading this while I’m still in the process of moving stuff over. Goodbye, WordPress, and thanks (sincerely!) for hosting my blog for all these years.
You can comment on the fediverse.