If you want all the gory details on how I migrated my Citation Needed newsletter from #Substack to self-hosted #ghost here they are:
https://citationneeded.news/substack-to-self-hosted-ghost/

Happy to try to help anyone else making this move!

#SubstackMigration #CitationNeeded

Migrating from Substack to self-hosted Ghost: the details

I migrated Citation Needed from Substack to self-hosted Ghost. Here is exactly how I did that.

Citation Needed
@molly0xfff if you have Ghost, you have everything
@molly0xfff Only tangentially related, but there is this other really great band also called Ghost, fronted by Masaki Batoh:

@molly0xfff

Shared here and on LinkedIn. I admit to skimming the technical details. ๐Ÿ™‚

Also, I had to do a Google Image search to figure out what the preview image had to do with the article:

https://commons.wikimedia.org/wiki/File:Ghost_live_2015.jpg

ETA: Most of the #Substack tagged posts I can see here are about #SubstackMigration, while most posts with that tag on LinkedIn are from people (still) hosting on that platform. Not surprising

File:Ghost live 2015.jpg - Wikimedia Commons

@funcrunch FWIW I put the image credits at the very bottom of each post!

@molly0xfff

Ah, I looked but didn't see it in the small print under the footnotes ๐Ÿ™‚

@molly0xfff thanks for the thorough explanation of the process! Cool that you now have a much greater control of your non-a16z setup!
@molly0xfff thanks for sharing! Can I ask what you're doing for footnotes on Ghost? This has been the bane of my Ghostly existence: adding a new footnote requires renumbering, and for the footnote to be linkable it needs to be either an HTML or markdown card (so I can't just cut-and-paste the wysiwyg test).

@thenexusofprivacy it's pretty janky lol. i just write either [#fn-uniqueidimadeup] or [#ref-uniqueidimadeup] in-text depending on whether it's a footnote or a reference, and then i put an accompanying [fn/ref-uniqueidimadeup] at the bottom of the page with the footnote/reference content.

then when i'm about ready to publish, i run a little script to go through and grabs the rich-text, changes it to a HTML card, inserts the footnote, and numbers everything for me.

@thenexusofprivacy i'll put it on github once i've cleaned it up a little
@molly0xfff thanks much! janky-but-useful is good!
@molly0xfff kind of loved reading this, thanks for sharing !
@molly0xfff I'm guessing that DO hosts a lot of sites that you don't like. Probably a lot more than Substack.
@molly0xfff congrats on the move! one small thing you might want to fix (if youโ€™re not already aware): the horrifying lots-of-plans page is still accessible to new subscribers via โ€˜Sign inโ€™ -> โ€˜Donโ€™t have an account? Sign upโ€™, which takes you to a modal dialog with all the crap instead of the nice subscribe page :o
@eta yeah, it's on the to-do โ€” unfortunately, all the sign up/sign in/account modal stuff is part of the ghost monorepo and not modifiable through the theme, so i backburnered it
@molly0xfff needs more blood sacrifice
@molly0xfff I thought it was neat you were doing all this on the same size droplet at Digital Ocean that I have, โ€ฆ then I saw you had to double it. ๐Ÿ˜‚
@marcoshuerta honestly now that i improved the caching it might be able to squeak by on the original size droplet, but it's nice to have a little headroom.

@molly0xfff Wow! Thank you for writing that detailed explanation! This is great for anyone moving to Ghost!!

I migrated from Substack over to WordPress back in Novemberโ€ฆ but I donโ€™t have any of the complexity you did! (For example, mine is free so no payment processing or anything.)

@molly0xfff reading the footnote, https://bunny.net has been my replacement for Cloudflare. Theyโ€™re smaller and donโ€™t have product replacements for everything Cloudflare does but itโ€™s at least worth a look.
bunny.net - The Global Edge Platform that truly Hops

Hop on bunny.net and speed up your web presence with the next-generation Content Delivery Service (CDN), Edge Storage, and Optimization Services at any scale.

bunny.net

@derekheld @molly0xfff Came here reading the same footnote and actually wanting to point out bunny, too :)

We migrated a few sites off CF and StackPath to Bunny and it's working quite nice. Support is also responsible and responding fast and I think they have a reasonable test period to try them out (and the pricing seems fine, too)

@molly0xfff so what you are saying is, self host from the get go?
@ausernamedjosh ehh, it's hard to confidently say i would have done as well getting off the ground if i had self-hosted from the start
@molly0xfff This is so great to share. I hope it helps others migrate
@molly0xfff just waiting on one more migration from another writer and I'm out!
@molly0xfff I am not in the newsletter sending game, I never used Substack, but wow... this is fun to read and provided lots of (geeky) insights moving to Ghost as a publishing platform.
If you want to know about settings up Ghost incl. nitty-bitty details to redirects, payments (via Stripe), Mailgun and a lot more, this one is for you!
@molly0xfff ummmmmmโ€ฆ kindaโ€ฆ that link goes to Substack, didnโ€™t read.
@mirabilos it does not
@molly0xfff oh, oops? Now I see it too. Is it possible that this or a similar-looking post also containing your name linked to Substack earlier?

@molly0xfff This is wildly funny because I'm literally running the migration at the very moment that your post crossed my feed. If all goes well, I'll be at ghost.jimcarroll.com

I started up on ghost two days ago after reading the Platformer story.

I'm wildly small on Substack, but Ghost looks better anyways.

I'll start out on the platform, but after reading your post, might self-host.

@molly0xfff "xNext up was email. In order to send bulk emails from Ghost, you need to use Mailgun. Mailgun is actually the priciest part of my setup, at $75/month"

---> Run, don't walk to Sendy -> https://sendy.co

Do what you are using Mailgun but for pennies, via Amazon SES (their bulk email service). I run my newsletter and other things off it; its very straightforward, has a great interface, and ALL the options.

Sendy - Send Newsletters 100x cheaper via Amazon SES

A self hosted newsletter application that lets you send trackable emails via Amazon Simple Email Service (SES) at 100x cheaper than other hosted solutions.

@jimcarroll would need to do a lot of additional work to integrate a separate mailsender โ€” Ghost has built-in Mailgun support and that's it
@molly0xfff Got it. That's sad; Sendy is a wonderful system. You might explore it just to understand it; might come in useful at some other time.

@molly0xfff Update - it looks like I can just go straight to Amazon SES. Since I'm already using that and have DMARC setup, I'm going to explore this.

So in the minutes since I've started reading your post, I've spun up an Ubuntu server at Vultr and will give it a go to try a self-hosted Ghost.

Will report back!

https://stackoverflow.com/questions/74680319/how-can-i-use-amazon-ses-with-ghost

How can I use Amazon SES with Ghost?

I saw at https://ghost.org/docs/config/#mail that SES is allowed. But I edited my config.production.json and ran ghost restart, but Ghost still says: Set up Mailgun to start sending newsletters! ...

Stack Overflow

@jimcarroll @molly0xfff #GhostBlog has separate configuration for transaction email and bulk email.

If you want to send out both through Mailgun, you can send the transactional emails out through the Mailgun SMTP interface.

You can send (only) transaction emails out through SES also via SMTP.

The Ghost project is open supporting other providers for bulk email, but first an "adapter" needs to be created that abstracts the details for each provider.

Ghost also uses Mailgun for analytics.

@markstos @molly0xfff So I can't use SES for bulk? That kills my initiative to do a standalone then. No sense paying Mailgun $$$$ for what I can do for pennies.

@jimcarroll @molly0xfff Thatโ€™s right. I worked on supporting others a couple of years ago and even submitted a code change for it. That didnโ€™t fit their standards and was rejected. https://github.com/TryGhost/Ghost/pull/14984

I didnโ€™t pick it back up because Mailgun has a free plan up to 5,000 emails per month, and I use that.

I also use SES at work and Mailgun is a nicer product to use.

core: refactor bulk email service to allow non-mailgun senders. by markstos ยท Pull Request #14984 ยท TryGhost/Ghost

Use Case Ghost documentation says "More bulk mailers besides Mailgun are planned". This PR helps along that goal with some foundational work. Also, I signed up with Mailgun today, and there is no ...

GitHub

@markstos @molly0xfff @markstos
@molly0xfff

I've now got a working self-hosted site at https://daily.jimcarroll.com ... managed to get my Substack import working fine. The biggest issue was tuning the server size to accept the import of my file - 897MB.

I'm struggling with the mailgun config though; I'm not familiar with JSON and have tried to run this through a few JSON validators without luck.

@molly0xfff - thanks for your pointer to Ghost - was never really aware of it and I will build out on it now. To build mine - I'm a huge fan of Runcloud.io for server builds - and they had this handy document that made the process all quite straightforward.

https://blog.runcloud.io/ghost/

The nice thing is it configs my server with fail2ban and other hardening, as well as pretty seamless GUI to the rest of the server config.

If anyone can offer up thoughts on my JSON formatting here it would be helpful. This version crashes. (I'm using the basic one for now)

The Daily Inspiration

Thoughts, stories and ideas about tomorrow. Innovation, creativity, disruption and more.

The Daily Inspiration
@markstos @jimcarroll @molly0xfff think it is still in progress, but in another pull-request https://github.com/TryGhost/Ghost/pull/19398
๐Ÿ“ฎ Postmark integration by andreascreten ยท Pull Request #19398 ยท TryGhost/Ghost

I have been working on an integration of Postmark with Ghost. Please provide your feedback before I continue. To-Do Implement analytics Handle Postmark errors Add tests

GitHub
@molly0xfff Thanks for writing about this Molly.
@molly0xfff this is an amazng read, thanks for all the gory detail!
@molly0xfff Good call. Substack is becoming a Nazi bar, just like the bird site.
@molly0xfff it genuinely makes me so happy that you can have separate footnotes and references now ๐Ÿฅฐ
@molly0xfff I have loved Ghost Blog for years!
@molly0xfff This is a great writeup! I'm curious if there's a reason you picked Ghost over WordPress? (This is not a trick question, I have no horse in that race.)

@jwz @molly0xfff Footnote D on the post said she's not as familiar with PHP and it has a bit feature-bloat for her site.

She also echos your (I think this was you?) concerns about CloudFlare in footnote E and asks for alternative suggestions

@sfrazer434 @jwz @molly0xfff I have used WP for about two decades now (oh god) and Ghost for a shade under two years. The constraint of the newsletter form, vs the infinite sprawl of the CMS space that WP-corporate targets, makes Ghostโ€™s editor generally more pleasant to use. I assume thatโ€™s the same on the admin side, though these days Iโ€™m hosted for both.
@jwz buried in the footnotes: "In fairness, it is possible to self-host WordPress, which is also open-source. It is, however, also written in PHP โ€” a language I am much less comfortable with and enjoy much less than Ghost's JavaScript. WordPress is also quite a bit older, and, in my opinion, somewhat bloated with features I don't and won't need."
@schalkneethling ^ this post might be helpful for you.
@molly0xfff I've not used substack but ghost has been great.
@molly0xfff Amazing post, thanks for going into so much detail! One thing I noticed though is a couple of example URLs are overflowing creating extra space on the right. So when you read it on mobile you can accidentally keep scrolling to right when trying to scroll down which is a bit annoying on a long article like this
@molly0xfff Ugh this was clearly quite painful. Thanks a lot for sharing! Glad it was *possible* to migrate at least, even if it was hard.
@molly0xfff this was a fascinating read. Do you know if there is an easy migration from a paid Ghost plan to self hosted? Iโ€™m thinking letting them deal with the difficult parts and then switching to self-hosted could be a smoother ride?
@stuart I don't know, could be worth a shot!
@molly0xfff I don't see how you're handling TLS certificate procurement and renewal? ๐Ÿ‘€
@MohammedSahaf it's all set up out of the box with Ghost and Let's Encrypt! Didn't have to do anything to get it set up.

@molly0xfff I just found your stuff in the spam folder! Hope it sorts itself.

Good choice of band btw ๐Ÿค˜