In the early days of my blog, I was searching for an expressive blogging platform. I had been inspired to start the blog after meeting Monty Rasmussen from Dart Academy at a Google Develop Group Meetup. Monty encouraged me to start a Flutter blog, so I went forth. Dart.academy runs on ghost, so I figured "why not?".
Ghost let me be expressive with Markdown, let me customize the look and feel of my blog, provided a managed solution so I didn't have to worry (as much) about platform updates and security, and it allowed me to access it from anywhere I happened to be, even on my phone. It fit the bill for everything I needed.
I signed up, and off I went posting my articles about the Octal Clock ... which is now terribly out of date because: WOW Flutter has really been moving!
For my blog, I had made a basic fork of a standard theme so that I could add in an email list sign up and a comments section. One day, Ghost published a major upgrade to their platform and, suddenly, my theme was out of date. They'd refactored a bunch of the system and it took me hours to get my theme customizations updated and working again. It would happen several other times that random Ghost upgrades would break my theme and lead to hours of maintenance. It was a real headache each time, but it didn't happen too often so it was fine.
However, what really put the nail in the coffin was the switch to the Koenig editor with the launch of Ghost 2.0 and the introduction of Cards. This really put a cramp in my style. I picked ghost so that I could use markdown to write my posts. The new editor was fine for basic ramblings, but it really made it hard to quickly and efficiently interleave code blocks into the post. It also made it harder to reuse URLs and to make footnotes1.
I originally started out just writing my posts in one giant Markdown card, but it was still hard to write the posts. Every time I would double space it would exit the markdown card and start a new text card.
Eventually, I tried to embrace the new editor and just break out markdown cards for the paragraphs where I needed it. This just slowed down my writing process and made me feel frustrated every time I tried to write a blog post. I felt like I was spending more time fighting with my editor than I was actually writing decent looking posts.
What I really wanted out of Ghost was a simple, markdown blogging platform. What it turned in to was a "headless Node.js CMS". This is fine, and Headless CMS platforms are cool. It's just not what I wanted for my blog platform. I just wanted to write markdown. It's quick. It's easy. It's expressive. It lets me quickly switch from one context to another without having to get fiddly with a UI. My hands get to stay on the keyboard and I get to just write.
During my searches for a free alternative to Ghost, the most common "free" alternative was Medium. I even had several insiders suggest that I move to medium to give my blog more "legitimacy". Medium has its pros and cons, but I don't like it because of its paywall model. Readers currently get 3 articles a month, then have to pay $5/mon to access more. This helps support medium and pay the content creators, without requiring ads, but it creates a barrier for people to be able to consume my content. I also have very little control over the look and feel of the blog, and zero control with managing my audience. My goal has never been to monetize this blog, and I'd rather pay money for hosting (Ghost cost me about $230/yr) to get my content out for free than get paid to write my content. It's a little weird, but that's how my hobbies go.
I wanted to write some new posts recently, and I just couldn't get myself over the hump of dealing with the new ghost editor, so I went hunting for alternatives again. I ran into this very detailed article on nehalist.io about why they switched off Ghost, and it resonated inside my soul. I dug around a bit and discovered they were now using Gatsby, so I dug in some more to find out what it's all about. They and lots of other creators have plenty of articles about their various setups and use cases.
- I get to use markdown to write my posts
- My site is published as a static page without the need for a database
- It's free and runs on git, so I can write my posts from anywhere again.
Gatsby uses markdown. All the posts are written in markdown, and each post is wholly self contained. Information about publication date, author, tags, etc, are stored in metadata in the post's markdown. As long as I'm not changing the posts URL (because I cross link a lot), then I can manage everything about a post in one area. No need to hunt through a UI for settings, or update available tags before I can manage my post.
The build process is customizable with plugins, which opens up all sorts of doors for fun content. It also allows for an amazing amount of flexibility with styling and formatting my blog posts.
All of the posts for a Gatbsy blog live in a Github repository, alongside the site itself. This lets me organize my posts in a directory structure that makes sense (especially for series), instead of just a long list of post titles in the editor. The amount of flexibility and control this gives me is liberating.
Additionally, because everything is in git, I have a clear history of every edit I've made to he blog. I can see who made it, when it was made, what was changed, etc. I get all the functionality of an audit log for free, because of git commits.
Additionally, with how I am currently hosting it, the hosting is free. This cuts down my hobby expenses by 100%. Which allows me to direct that money towards other things.
I'm currently using Gatsby Cloud (free plan) to push my builds to Netlify. Netlify is then doing all the hosting and management of the static files. They even manage the letsencrypt https certificate for me, which is a mixed blessing2. It's also backed by a huge CDN, so my very-cache-friendly content can be easily and quickly distributed worldwide.
Everything "just works", and the integration is built in an mostly sets itself up for you.
Here's my new blogging process, and - as a developer - it brings me great joy.
- Write a blog post in markdown
- Preview the blog post locally as I'm writing it
- Commit it to a git branch and create a pull request into master
- Wait for Gatsby Cloud hook to compile and push a live preview to Netlify
- Verify all the links and styling worked correctly in a live environment
- Merge the pull request
- Let Gatsby Cloud compile and push the new live site to Netlify
It's like having my blog hooked up to a really slick CI/CD platform.
Currently, I don't have a way to schedule a post to go live at a certain date/time. This is particularly useful when you are writing a post for a feature that is going to be deployed in the future and you want to time your post to go live around the time of the feature announcement (like my initial flutter web post). Right now, I have to wait until the right moment and then merge/push my changes to master to trigger the deploy. I'm sure there are ways I could get this set up and working, but I haven't dug in to it ... yet.
I wish I had a decent mobile editor. The Ghost mobile app was actually pretty decent. There are plenty of posts that I outlined or brainstormed on my mobile device. It was really easy to take out, open the app, and jot a few notes down, or write up paragraphs of content while riding the train. The github editor is less friendly to me. You win some, you lose some.
Ghost was wonderful, while it lasted, but they're moving in a new direction that I'm not interested in following. Gatsby gives me everything I really loved about Ghost when I first started, with very few drawbacks. Netlify lets me host my content for free on a world-wide CDN and manages a bunch of important infrastructure pieces for me.
Writing blog posts doesn't feel painful to me anymore.
In all honest, it just broke URLs for me completely because it tried to treat everything as a local URL by default. As I was converting my blog over, I found some many broken links to external resources because they were all prefixed with https://flutter.institute/
Like, really, why does https://flutter.insitute/https://flutter.dev/ make any sense? I link to external resources constantly in my posts, and this just was the worst.
2: Your DNS records must be fully propagated before Netlify and Letsencrypt can automate the certificate process. This means you may be getting ssl errors on your https connection for 24-48 hours during transition as your DNS changes take effect. Also, make sure to properly update your DNSSEC records when you migrate the domain or everything is going to think your DNS has been hijacked and stop resolving the IP address. Ask me how I know...↩