How this site was built four times
This site has been rebuilt four times: Carrd, then WordPress with the Astra theme, then Ghost, and now Next.js and React. Each move was driven by hitting a ceiling rather than by wanting new software. This page is the honest version of what each one was good at and what made me leave.
Most CMS comparisons are written by people who sell one of the options. This is the opposite: four platforms I actually shipped on, in order, with the reason each one stopped working.
The pattern is worth stating up front, because it took me four attempts to see it. Every migration was caused by the same thing — the platform was fine at what it was built for, and I had started asking it to be something else.
- № 01CarrdThe first site
- № 02WordPress + AstraThe blog era
- № 03GhostThe writing era
- № 04Next.js + ReactNow
Carrd
A single page, live in an afternoon, for almost nothing.
- Shape
- One page
- Blog support
- None to speak of
- Time to live
- An afternoon
- Best for
- A link-in-bio or a landing page
The first version of this site was a Carrd page. One scroll, a short bio, a few links, done.
It deserves more credit than it gets. If what you need is one page that exists and looks tidy, Carrd will beat every option below it on time-to-live and cost. I had something on the internet the same day I decided to.
What it is not is a place to write. There is no post model, no archive, no tags. A blog on Carrd means either one enormous page or a manual page per article, and both fall apart by the fifth one.
The mistake I made was treating that limitation as a reason to not write. For a while the site being a single page was a convenient excuse for having nothing to put on it.
Why it ended
I wanted to publish articles, and there was nowhere to put them.
WordPress + Astra
A real blog, at the cost of becoming a part-time sysadmin.
- Theme
- Astra
- Stack
- PHP, MySQL, plugins
- Maintenance
- Ongoing, unavoidable
- Failure mode
- Plugin conflicts and update breakage
Next was WordPress running the Astra theme. This is the default answer for a reason, and it did work. Posts, categories, tags, an archive, an editor. Everything Carrd was missing.
Astra was a good choice inside a bad category. It is genuinely light compared to most themes, and it does not fight you the way page-builder themes do.
The cost is not the software. It is the maintenance surface. A WordPress install is a database, a PHP runtime, a theme, and however many plugins you have talked yourself into. All of it updates on its own schedule, and any of it can break the site while you are asleep.
The other cost is subtler. WordPress makes it very easy to keep configuring instead of writing. There is always another plugin that will supposedly fix the thing that is actually a discipline problem. I spent time in settings screens that I should have spent on drafts.
It also gets slow by default. Not because it has to be, but because getting it fast means caching plugins, image plugins, and a fight with whatever the theme ships.
Why it ended
The upkeep was larger than the publishing. I was maintaining software rather than writing.
Ghost
The best writing experience of the four, and the hardest to bend.
- Hosting
- PikaPods, managed
- Strength
- Editor, speed, memberships
- Limit
- Anything interactive
- Warning sign
- Layout logic living in code injection
Ghost was the first platform that felt built for the actual job. The editor is excellent, the reading experience is fast without effort, and memberships and email are in the box rather than bolted on.
I ran it managed, on PikaPods, which removed most of the WordPress problem. No SSH, no update anxiety, a dashboard for restarts and memory. If your output is essays and a newsletter, this is a very hard setup to argue with, and I would still recommend it to most people writing online.
Where it stopped fitting was everything that was not an essay. This site has interactive tools, a live 3D graph of my knowledge vault, dashboards, and pages that are closer to small applications than articles. Ghost is a publishing platform, and those things sit outside what it is for.
So I worked around it, and the workarounds are the tell. Custom pages injected through code injection. Layout handled by scripts in a header field. A dynamic index page whose logic lived in a text box in an admin panel rather than in version control.
None of that is Ghost's fault. It is what happens when you keep asking a tool to do the thing next to the thing it does. Every workaround was reasonable on its own and the sum of them was unmaintainable.
Why it ended
The site had stopped being a blog. Half of what I wanted to build was not publishing.
Next.js + React
Content in files, everything else in code, all of it in git.
- Framework
- Next.js 16, React 19
- Styling
- Tailwind CSS v4
- Content
- MDX files in git
- Hosting
- Vercel
- Carried over
- 31 essays, 16 videos, original URLs
The current site is Next.js with React and Tailwind, deployed on Vercel. Posts are MDX files in the repository. There is no database and no admin panel.
The immediate gain is that the awkward things became easy. An interactive assessment, a searchable index, a 3D graph, structured data generated from the same source as the visible text. On Ghost each of those was a workaround. Here they are just components.
The second gain is that everything is one artifact. Content, layout, schema and deployment all live in git, so a change is a diff and a mistake is a revert. Nothing important is stored in a text field in someone's admin panel.
It is not free of cost, and pretending otherwise would be dishonest. There is no editor. Publishing means writing a file with correct frontmatter and running a build. If a type is wrong the build fails, which is better than a broken page but is not what most people want from writing a blog post.
The thing I care most about survived: every URL from the Ghost era still works. 31 essays and 16 videos carried across on their original paths, because breaking your own archive to change platforms is a self-inflicted wound.
I think this is the last migration, and I am aware that is what I would have said each previous time. The difference is the reason. The first three moves were forced by ceilings in the platform. This one has no ceiling I can see, because at this layer anything I want is a thing I can write.
Why it ended
Still here.
- Every migration was caused by asking a tool to do the job next to the one it was built for, never by the tool being bad at its own job.
- The reliable signal that you have outgrown a platform is the number of workarounds you are maintaining, not how the platform feels to use.
- Preserving URLs across a migration matters more than any feature you gain from it, because your archive is the only thing that compounds.
- Better software solved none of my writing problems. Publishing frequency tracked how much I had to say, not what I published with.
- Pick the simplest platform that fits what you are actually doing this year, and accept that you will move again.