Goodbye WordPress

đź”— **Source:** [Goodbye WordPress](https://nolanlawson.com/2026/09/30/goodbye-wordpress/)
> [!note]+ Document Notes
> ---
> tags: [wordpress-migration, static-site-generators, astro, self-hosting, coding-agents]
> author: Nolan Lawson
> source: nolanlawson.com
> reference: https://nolanlawson.com/2026/09/30/goodbye-wordpress/
> date created: 2026-10-01 10:11
> ---
> > [!info] Generated analysis — not the author's words. Sections below are machine-written
> > from the captured source. Only text inside `> [!quote]` blocks is verbatim from the author.
> > Do not quote or attribute any other line to the named author.
> # 🏷️ Title: Goodbye WordPress
> ## đź§ Table of contents
> - [📝 Summary](#-summary)
> - [đź“– Main content](#-main-content)
> - [🗒️ Notes](#️-notes)
> - [📚 References](#-references)
> - [🗣️ Paraphrase](#️-paraphrase)
> - [đź“° Newsletter](#-newsletter)
> - [âś… Action items](#-action-items)
> - [đź§Ş Hypotheses](#-hypotheses)
> - [📊 Methodology](#-methodology)
> - [âť“ Questions](#-questions)
> - [đź”® Future research](#-future-research)
> - [đź’ˇ Implications](#-implications)
> - [đź§ Learning styles assessment](#-learning-styles-assessment)
> - [📊 Accessibility assessment](#-accessibility-assessment)
> - [🌍 DEIB assessment](#-deib-assessment)
> - [âś… Logical validity](#-logical-validity)
> - [🛡️ DARVO analysis](#️-darvo-analysis)
> - [🎯 Conclusion](#-conclusion)
> - [🔄 Refactor appendix](#-refactor-appendix--goodbye-wordpress)
> ## 📝 Summary
> - **What happened.** Nolan Lawson published "Goodbye WordPress" on nolanlawson.com on 2026-09-30. The first line says the blog "has moved from WordPress.com to self-hosting" (¶0), and the closing line says goodbye to WordPress (¶20). The captured text carries no byline. The author is recorded as Nolan Lawson because the domain and the first-person text point to that name, so the byline is inferred.
> - **The claim.** The author gives three reasons for leaving after 15 years on WordPress (¶1): "recent drama" that eroded confidence in WordPress as a long-term bet (¶2), the editor drifting away from plaintext Markdown toward Gutenberg, which the author never enjoyed (¶3), and a $110 per year charge for something that "could be hosted for free on Cloudflare with a static site generator" (¶4). A fourth, broader argument in ¶13 says coding agents make self-hosting easy enough that WordPress incumbents "should" be nervous.
> - **Why it matters.** It's a first-person exit account from a long-time WordPress.com user who is also a developer, with a specific stack, specific losses (comments, followers, theme) and specific gains (cost, performance, accessibility fixes). The reasons split cleanly into technical, cost, and confidence-in-governance categories, which maps to work different WordPress teams own.
> - **Key stakeholders.** The author. Readers who follow via WordPress.com (the author says there are "a few hundred followers there," ¶7). WordPress.com, WordPress.org core, the Gutenberg editor team, the plugin ecosystem, and anyone assessing why individual bloggers leave.
> - **Risks and tradeoffs.** This is a personal blog post, not research. One blog and one author sample nothing. The WordPress-related claims (drama, CVEs, plugin marketplace risk, Markdown export limits, WordPress adopting LLM code) are the author's claims and weren't checked here; the text links sources for some of them (see References). The author reports losing comments, pingbacks, WordPress followers, and a 15-year-old theme (¶6 to ¶8), and reports that the migration needed a custom script, Markdown conversion fixes, and feed setup work (¶14). Hosting is described as self-hosted; the captured text doesn't name the host or the new running cost.
> - **Bottom line.** The post gives a concrete, replicable migration path (WordPress export, Astro rebuild by an AI agent, REST API script for Markdown, matched RSS/Atom feeds) and a candid list of what was lost. The part most relevant to WordPress teams is the stated reasons, which are mostly about confidence, editor direction, and cost rather than missing features. The "WordPress should be nervous" conclusion is opinion built on one case.
> ## đź“– Main content
> **The announcement and the reader instruction.** ¶0 tells followers on WordPress that the blog now lives at a self-hosted address and that they should point an RSS reader at nolanlawson.com/feed. That one instruction is how the author handles the audience move. The text doesn't describe 301 redirects at the HTTP level; it does mention "a small legacy URL redirect" in JavaScript (¶10) and RSS/Atom feeds set up "so that feed readers wouldn't notice a difference" (¶14).
> **Reasons for leaving, as stated.** Three are listed in ¶1 to ¶4. They differ in kind:
> - *Confidence in governance or direction.* ¶2 cites "recent drama" and an "eroded" confidence in WordPress as a long-term bet. The text doesn't say which events, which people, or which decisions. The drama is the author's characterization and is left undefined.
> - *Editor and technical experience.* ¶3 says the interface "keeps nudging" the author away from the old plaintext Markdown editor, which "remains excellent," and that Gutenberg's click-and-drag experience was slow and clunky. This is a usability and workflow reason, stated as personal experience.
> - *Cost.* ¶4 says WordPress charges $110 per year for something that could be hosted for free on Cloudflare with a static site generator. The $110 is the author's figure; the plan name and what it covers aren't given.
> - A later technical and security argument (¶13) says an "aging blogging technology" still deals with "critical CVEs in its templating engine" and has a "wild-and-woolly plugin marketplace." Both phrases carry links (see References). The author presents this as a reason incumbents face pressure, not as the direct cause of this move.
> **What the author gave up.** ¶6 comments and pingbacks (low value to the author, who runs a Mastodon instance and links to threads there or on Lobsters and Hacker News; spam was "a constant battle," with bots made more convincing by LLMs). ¶7 WordPress followers (a few hundred; the author hopes some readers move to plain RSS and "avoid tying themselves to one vendor"). ¶8 the "Spring Loaded" theme from the early 2010s, which needed recurring CSS tweaks for font size, layout, and accessibility.
> **What the author gained.** Lower cost, a modernized style, a dark theme, and what ¶9 calls a "radical (near-)zero-JS and zero-tracking vision." ¶10 lists the exceptions: JavaScript runs only the dark mode switcher, a small legacy URL redirect, search through astro-pagefind, and lite-youtube-embed for YouTube. Images are lazy-loaded except early ones, the font is the system font, old tweets are pre-rendered, and speculation rules speed navigation. ¶11 explains dropping analytics: blockers distort the data, tighter referrer policies made it less useful, and watching spikes is bad for the author's anxiety. ¶12 describes the design (larger fonts, no gradients, drop-shadows, or tag cloud) and accessibility fixes: consistent heading levels, a skip link, and fixes after an Axe audit.
> **How it was done.** ¶13: Claude did most of the work from a prompt along the lines of "Here's a WordPress export, rebuild it in Astro, go nuts." ¶14: WordPress exports HTML, not the author's Markdown, so a small script pulled the Markdown from the WordPress API. Astro and WordPress convert Markdown to HTML slightly differently, which needed fixes. RSS and Atom feeds were rebuilt to match. ¶15: the agent also found broken links, missed spam comments, and OpenGraph image problems. ¶16: Astro enabled proper ES6 syntax highlighting, with a custom Shiki theme. Claude artifacts were used to compare designs.
> **The stance on LLMs.** ¶18 keeps a personal rule against LLMs touching prose, while letting agents build the design. ¶19 argues that avoiding LLM output entirely is no longer possible because WordPress, social platforms, browsers, and operating systems all ingest it, and credits Claude with details such as listening for localStorage events in the theme picker, forced-colors handling, and RSS formatting.
> **Uncertainties.** The reasons are stated, not evidenced. "Drama" is undefined. Cost savings aren't computed against the new setup. No performance numbers appear for before or after. No mention of other bloggers leaving Word
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](https://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](https://managewp.com/wordpress-spring-themes/#:~:text=Spring%20Loaded). 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.
[](https://nolanlawson.com/wp-content/uploads/2026/09/compare.png)Lighthouse scores before and after. To be fair, WordPress was already pretty fast!
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](https://github.com/shishkin/astro-pagefind)), and [lite-youtube-embed](https://github.com/paulirish/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](https://developer.mozilla.org/en-US/docs/Web/API/Speculation_Rules_API) 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](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/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](https://github.com/dequelabs/axe-core) audit.
[](https://nolanlawson.com/wp-content/uploads/2026/09/sidebyside-optimized.png)Before and after.
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](https://thehackernews.com/2026/09/wordpress-issues-patch-for-critical.html) in its templating engine (not to mention a [wild-and-woolly plugin marketplace](https://patchstack.com/whitepaper/state-of-wordpress-security-in-2025/)) 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](https://shkspr.mobi/blog/2024/08/liberate-your-markdown-posts-from-jetpack-in-wordpress/), 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](https://nolanlawson.com/2026/08/16/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](https://shiki.style/) 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](https://claude.com/features/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](https://nolanlawson.com/2026/08/31/on-not-becoming-a-cyborg/), but the design, to me, is just meh. On many blogs I read I just immediately turn on [Firefox Reader Mode](https://support.mozilla.org/en-US/kb/firefox-reader-view-clutter-free-web-pages) 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`](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@media/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., Goodbye WordPress, Nolan Lawson, 01m3vwv1m1v8jwkw6dhz5at3ew.