Blog
Astro Ghost Migration Web Development

I Migrated My Site from Ghost to Astro. Here's Why.

After years on Ghost, I moved joshuawarren.com to Astro on Cloudflare Pages. Here's what I learned, what I'd do differently, and why static might be the answer for your content site too.

JW
Joshua Warren
· 3 min read

I moved this site from Ghost to Astro last week. It was time. Here’s what happened and why you might want to consider the same move.

Why I Was on Ghost

Ghost was great for its time. Clean editor, good publishing workflow, decent themes. I wrote hundreds of posts on it.

But Ghost has always been a blogging platform, not a site builder. And for what I wanted—a personal site that could host landing pages, handle the blog, and feel fast—Ghost was starting to feel limiting.

Specifically:

  • Landing pages were painful. Custom pages in Ghost are… not great. I was doing weird workarounds with code injection to make things look right.
  • Design control was limited. I wanted a consistent design system across everything—blog, landing pages, static pages. Ghost made that harder than it should be.
  • Hosting was expensive. Ghost Pro is fine, but for a personal site, it felt like overkill.

Why Astro

Astro is different. It’s a static site generator that treats your content as data. You bring your own components, your own styling, your own everything.

What sold me:

  • Full control. Every pixel. Every component. No fighting a CMS’s theme system.
  • Fast by default. Static HTML. Edge-deployed. It’s fast.
  • Content collections. I can keep my blog in Markdown/MDX, version control it, and treat it like code.
  • Component flexibility. React, Svelte, Vue, or none. Pick what makes sense.

The Migration

It took about a day to move everything:

  1. Exported all Ghost content
  2. Converted posts to Markdown files with frontmatter
  3. Built the Astro site with Tailwind
  4. Deployed to Cloudflare Pages

The hardest part was the redirect logic. Ghost URLs don’t map perfectly to static file URLs. I spent some time getting that right.

What I Gained

  • Complete design control. My landing pages now match my blog. The whole site feels cohesive.
  • Speed. This site loads fast now. Not “for a CMS” fast. Actually fast.
  • No ongoing platform cost. Cloudflare Pages is free for my usage. No $25/month to Ghost.
  • Git-based workflow. Content is code. I can review changes, test locally, and deploy with confidence.

What I’d Do Differently

A few things:

  • Start with the design system. I should have defined my Tailwind config and component library first. Would have saved refactoring time.

  • Use content collections from the start. Astro’s content collections are great. I should have leaned into them harder.

  • Plan redirects carefully. Ghost’s URL structure is different from static. Figure this out upfront.

Who This Is For

If you’re on Ghost (or WordPress, or any CMS) and you’re thinking about moving, here’s my take:

  • Stay if: You need the Ghost admin UI. Your team publishes through it. It’s working.

  • Move if: You want full design control. You’re comfortable with git. You’re building more than a blog—landing pages, a product site, something with pages that aren’t posts.

For me, the move was right. I wanted control. I wanted speed. I wanted my content in my repo.

The Bigger Picture

This is part of a larger shift I’m seeing: teams tired of platform dependency. CMS platforms, SaaS tools, monthly subscriptions—everyone wants out.

Static + git + edge deployment is becoming the default for content sites. It’s faster, cheaper, and you own your data.

That’s worth considering.


I’m building more on Astro for ecommerce projects now. If you’re thinking about a migration or want help setting something up, let’s talk.

JW
Joshua Warren

Ecommerce operator and AI builder. 25+ years building and scaling commerce, now focused on AI agents for ecommerce teams.

Want to talk about this?

I work with ecommerce teams on AI and automation. Happy to chat.

Book a Call