Here's hoping this post is short and sweet…

Back in 2019 I moved my blog off of WordPress and over to Ghost. In short, I wasn't happy with WordPress and wanted a blogging engine that felt more like it was made for blogging than a full CMS where I didn't use 99% of the features on offer. Ghost seemed to align with my values as a writer and a general user of technology, and over the past 6 years, that's only become more clear that was the right choice for me. Thankfully, this post is not about how I'm moving away from Ghost, I'm just changing who's hosting it.

For the past 10 years, I've used DigitalOcean to host my projects (this blog, Quick Reviews, and Quick BIN Lookup) and they've been utterly fantastic. I think the pricing is fair, their reliability has been fantastic, and I always seem to be able to do what I need with ease with their system. That said, when you get a virtual server from DigitalOcean, it's yours through and through. That's great because it's only me making changes to it, but it's also challenging because, well, I'm the only one who can make changes to it.

As a basic example, when a Ghost update is released, nothing changes on my site until I ssh into the server as the ghost-mgr user, cd into the var/www/ghost/ directory, and run ghost update. This isn't a big deal and I've got a few aliases set up in my .zshrc file so that I can literally type, birchtree to ssh into the server at the right place and then update to update to the latest Ghost version. However, sometimes during that update I'll see a warning about how I'm now using an older version of node than I should, so then I go over to update node, but it's all from the command line so it's trickier than just going to an app store and pressing "update". Also, I might update node, but then need to update other things to make my system actually start using the new version of node. Then I realize it's been a couple years since I updated my Ubuntu version and I should get on a more secure release and that's borderline impossible for someone with my skill set. None of this even gets into what if the Ghost service died on the server because I messed something up? Well, it's on me to fix it.

Anyway…it's mostly fine until it isn't. But this was worth it to me when the cost difference was pretty stark. I was originally paying $10/month for DigitalOcean to host my site, but in time, my needs grew and I needed to upgrade to the $14/month plan to get through more traffic spikes. Then in recent months Ive had a few times where spikes in activity brought my site down for a few minutes here and there, so I began looking at what another service upgrade would cost me. The option that appeared right for me was going to be $24/month, which is just $1 less expensive than Ghost Pro. The question became whether it was worth $1/month for me to never worry about software updates or Google for what combination of npm and apt command line requests I needed to run to get things in good working order. For me at this point in my life, the answer is a resounding yes.

Why Ghost Pro and not another option?

I did some research on other options here and honestly there wasn't a better one as far as I could tell. There are some that have cheaper plans, but some didn't do email newsletters unless you paid for a similarly-priced plan. Others were cheaper, but made you manage the server yourself, which was no different from what I was coming from. Still others had limits on file storage that I would run into quickly unless I paid for their plan that cost the same as Ghost Pro.

So yeah, I wasn't finding a service that served my higher-than-average-but-still-not-crazy needs for cheap. At that point, I figured I may as well use the official option since I know people using them who have had great uptime, speeds, and support. Also, I've been using Ghost for 6 years and paid nothing to the creators for the privilege. It's great that they truly make their software open source, but if I'm going to pay someone to manage the installation for me, I'm happy to go direct to the creators.

Also, Ghost is currently beta testing their ActivityPub integration with Ghost Pro users, and I wanted to get in on that. This is available in the open source version I was using as well, but it required me to set up an ActivityPub service on my server as well, and that was the last straw for me; there was simply no way I wanted to manage another service on my server. Here's a peek at what the notifications tab looks like in Ghost.

The migration process

Moving from Ghost to Ghost is honestly pretty simple, and I just followed this official guide to get it to work. The hardest part was that I have about 5GB of images and their importer tool doesn't like accepting files much bigger than 500MB, so I had to break my images folder into about 10 parts, create 10 ZIP files, and upload them one at a time. But once that was done, we were off to the races, everything just worked.

One thing I had to remember was to connect my Stripe account to this new Ghost installation before importing my subscribers, since that connection needs to be active to link the customers in Ghost to those customers in my Stripe account. The import went perfectly smoothly though, and subscribers should not notice any difference.

Finally, I did have to go into the integration settings to generate a new API key to use for my Obsidian plugin and Ulysses to continue posting to my site, but that was trivial effort.

Finishing up the domain change

Everyone's least favorite part of a site migration is the DNS work to get your domain name to redirect to the new IP address. Mercifully, this has gone pretty smoothly as well, as I just had to swap in a single new CNAME and A record which I did in seconds on my Cloudflare account. it took about 5 minutes for those changes to get picked up by Ghost and it validated my domain and set up my TLS certificate for me (another thing I had to manage on my self-hosted site).

The email sending domain defaulted to a ghost.io address, but I wanted to have a more seamless transition for those subscribed to More Birchtree, so I then configured my birchtree.email domain to work for sending emails. This was a matter of setting a few CNAME and TXT records and they say this can take a day or so to complete. Mine still hasn't completed so I can't send any member posts until it does, but I'm fairly confident this will sort itself out later today and I'll be ready to pick up with the member posts like normal.

Oh, and the RSS thing…

If you're subscribed to this site via RSS, a DNS change is often a surefire way to get feed readers to think you have a bunch of new posts, so I'm sorry if you have some repeat posts in your reader today. I saw them, a reader on Bluesky told me they saw them, so yeah…bummer but no idea how to get around it.

Here's to a bright future!

This post is largely for myself and for those who are interested in the tech behind blogging. Outside of "oh, that's interesting," this change should have precisely zero impact on any of you going forward. The site was always reliably available and loaded pretty quickly, so you won't notice anything there. The RSS feed is the same as before as are all the URLs.

The one difference is that you can now follow the site on apps like Mastodon using the <a href="mailto:@index@birchtree.me">@index@birchtree.me</a> handle. My new posts will all appear on social apps from that account now, and the benefit is that you can reply to them and I'll see those in my Ghost admin portal (again, see the screenshot above) rather than having those replies go to an unmanned bot account. We'll see how this goes, but I'm really happy to bring Birchtree natively to the open social web.