4 min read

First post on (this instance) of this Ghost instance

post image
an actual picture of me writing this post

Montreal, Canada — This personal site has served a very useful purpose over the years. It started as something that “I had to do” during undergrad because, well, every computer science undergraduate needed a personal site, right? (Shockingly, to no one, no)

Well, no job was ever got from the content of this site. But, indirectly, it became a great learning tool.

I have quite a bit of spare time right now as I'm recovering from a fractured rib and can't do much. So I'm once again migrating my personal website stack, and it got me thinking about the almost decade of history that this website has.

A History of Implementation

The early years (<2016)

I think this site began as a static page generated with Jekyll and hosted on GitHub pages. I never saved any posts from that era… and I'm not sure if I even had any.

There's not much to comment on this time other that it was probably some random domain I got for free from a hackathon, and nothing remarkable.

2016-2017 AnchorCMS

Then, as a first foray into overcomplicating this setup/using it as a learning tool, I migrated it to a DigitalOcean droplet. There I ran the PHP-based Anchor CMS (RIP) because the internet told me that WordPress was bad, and I had PHP experience from my then internship at Environment and Climate Change Canada. This didn't last too long, however.

I moved away from anything PHP-based because working on a legacy PHP codebase for 16 months was traumatizing.

2017-2024 Hugo

I never wrote about why I picked Hugo, but if I recall correctly, it was because the internet said that it was significantly faster than Jekyll. Plus, Go was new and cool back then, and I found it an intriguing language.

This phase started as an overkill NGINX server running on an EC2 instance, and I would use rsync to sync my local generated files to the server. Then, I got increasingly annoyed with having to pull out my computer and open Visual Studio Code to build the site and sync, so I looked for alternatives.

I found a product called forestry.io (RIP, again), developed by a team out in Prince Edward Island.

Archived landing page for forestry.io, retrieved from https://archive.is/xuQKX

This was a relatively productive time for this little site. I ended up writing a few posts because well, the UI actually worked, and I wouldn't end up side tracked making unnecessary changes to the site. It was actually nice to write, I didn't have to copy a photo to a directory, use the right Markdown syntax to insert the photo. I didn't have to re-remember the path to reference the image. I could simply, drag and drop a photo. 🤯

The workflow/implementation was fun.

  1. I would log in and publish an article on forestry.io
  2. Forestry makes a commit with the changes
  3. An event is fired to AWS CodeBuild to run Hugo build for the site
  4. CodeBuild would then copy the contents to the respective S3 bucket
  5. Lastly, CodeBuild would invalidate the caches for AWS CloudFront, the CDN I was using

It was so unnecessarily complicated when GitHub Pages would've sufficed. But, I reused the infrastructure to build the TMU CSCU Wiki, which is still up to this day. It was a great way to get some AWS experience, and cost a few pennies a month.

Then, in March 2023, forestry.io announced that it was shutting down so the team could focus fully on their new product, tina.io. I tried writing again manually in VS Code, but there was just too much friction to write.

2024-

This brings me to now. After fracturing my rib this past weekend, I found myself with a lot of spare time. Ghost was the clear choice in 2024 it seemed, and something I had previous experience using, when I set up TMU CSCU's main website many years ago during undergrad.

It's grown into an incredible product, and is even actively developing ActivityPub integration, which is a huge win to me, as someone who believes federated protocols are what the internet should be, rather than a series of siloed platforms.

Setting this instance up this very basic theme took a couple of evenings, all I had to do was:

  1. Run Ghost on my local desktop/server in a Docker container
  2. Set up a Cloudflare Zero Trust tunnel running in another container
  3. Configure this tunnel to target the Ghost container (hint: container names are their host names)
  4. Learn Handlebars, Ghost's template variables, Bootstrap 5
  5. Rebuild my old Hugo theme in Bootstrap 5 and Handlebars
  6. Change some DNS entries in Cloudflare to decommission my old static site
  7. Upload the zip of my new theme to this instance's admin interface

Now, I have a self-hosted instance of Ghost that I can still tinker with, but has a beautiful distraction-free writing UI, that works. Plus, it's implemented in an interesting way.

Diagram explaining Cloudflare Zero Trust Tunnels, taken from their documentation

I only set this site up today, so I don't have any solid opinion about it yet. I can say one thing though, for someone who wants to self-host anything without exposing home port(s) or an IP address to the internet, you have to check out Cloudflare Zero Trust Tunnels. It even routes/caches your content on their CDN for free, no set-up required.