Bye bye Tumblr
I'm finally off Tumblr! I've moved to Ghost, a NodeJS based CMS/Blogging platform.
An interesting coincidence, just as I was doing my First Post to Tumblr, 8 years ago, Ghost was just starting out via a Kickstarter campaign - now, 8 years on they released a new version https://ghost.org/changelog/4/.
The editor experience is really nice in Ghost, a what you see is what you mean style, with a very Markdown feeling editor. I liked it.
They have clearly been thinking about the publishing and editing experience, with a lot of nice features, without much bloat.
It supports scheduling, large number of integrations etc. A very polished first impression for sure.
I did consider other systems Gatsby.js+Contentful or Hugo, basically anything from the JAM stack trend. I was trying to avoid hosted solutions or massive PHP systems (WordPress/Drupal), no time for keeping up with patches.
Really, it came down to the editor experience in JAM style systems and Ghost won.
I had 8 years of post in Tumblr, over 110 posts, which I wanted to keep. Thankfully Tumblr has a great API, and I was able to extract the old posts out using a slightly modified version of Tumblr-to-ghost. I found the tags made things messy when re-importing to ghost, so modified the script to just assign a single tag (Tumblr) when importing.
I took a stock base theme called Edition, removed the membership features (which as of Ghost 4 are forced on you, somewhat controversially) and added a few other minor tweaks. It's on GitHub - https://github.com/a-c-m/Edition
I like it for now.
It has not been pain free, or even easy. I very nearly gave up at a few points. Many Yaks were shaved.
Problems I ran into:
1. Importing Markdown to Ghost is hard
- I write a lot in Markdown, so wanted an easy way to import. Turns out there isn't a good one. Which is puzzling.
- Copy/Paste into the MobileDoc based editor, works fine, but importing files as posts wasn't an option.
- I explored various options, even starting to write my own converted. In the end I gave up and have legacy posts as embedded HTML
2. Routing / Custom URLs in Ghost is non-obvious https://ghost.org/docs/themes/routing/
- Initially, I wanted to keep consistent URLs for legacy posts, but this is impossible in Ghost due to how URLs and routing works. Which is made ever more confusing due to that not being clear in the UI - https://github.com/TryGhost/Ghost/issues/12824
- Even once you understand routing/collections, there are more gotchas - you need a new route for the homepage to list everything. Luckily some community is very helpful https://forum.ghost.org/t/using-collections-but-keeping-an-index-with-all-the-posts/14546/6
- I've settled for a custom path (/Tumblr/) for legacy posts, and will have to set up a custom redirect file for the more popular posts.
3. Static hosting?
- Given Ghost's history/pedigree from Gatsby, seems like a simple option for static hosting would have been a no-brainer. But it's not.
- I really don't want to spend over $100 per year on hosting. Nor do I want to support/maintain a NodeJS server exposed to the internet. A static site seemed like the best solution.
- Many options, most of them partial/not great.
- Netlify perhaps? https://forum.ghost.org/t/how-do-i-create-a-free-ghost-blog-on-netlify/15662/2 - No, still got to host a public-ish node server.
- Ghost Static Site Generator - https://github.com/Fried-Chicken/ghost-static-site-generator is what I went with - but really would have hoped something similar was built into Ghost from the start.
- So far, due to the static hosting and way I'm exporting/saving the site - I've not managed to get them to work, so will likely lose some SEO juice. But that's OK for now.
- Locally hosted instance, which I update when I want and have full control over
- GitHub Pages to host the code and serve the static HTML
- Simple script to export the site using Ghost Static Site Generator
- Using Free Cloudflare account for HTTPS following https://shyr.io/blog/free-ssl-for-github-pages-with-custom-domains
That's it. No ongoing server costs, I control the code, HTTPS, nice editor experience in Ghost. Works so far.