Over the holidays I rebuilt this blog from scratch. This isn’t the first time it’s needed major maintenance. For such a simple piece of software, it’s been surprisingly hard to keep operational for - at time of writing - 13 years. I thought a recap of its history would be interesting, if only as a cautionary tale for my future self.

Since I started this blog I moved country, got married, became a US citizen, adopted two cats, bought a home, sold a startup, worked at several companies and did three stints as an independent contractor… and somehow didn’t yet manage to write about any of those things on this blog!

2009-2014: Tumblr

I started this blog in 2009. I wanted a space to dump occasional words and photos, without thinking at all about the mechanism, so I just set up a Tumblr and called it a day.

2014-2015: Octopress + Codeship + GitHub Pages

I don’t remember what motivated me to migrate off Tumblr five years later. I vaguely recall having to use a clunky WYSIWYG editor to post, but jumping through hoops to add custom CSS or JS might have been the trigger. I still didn’t want to build everything from scratch, so I found Octopress, which was somewhere in between a Jekyll fork and a bundle of styles and plugins. That gave me a nice balance: a polished theme, reasonable defaults, social network integrations, while still giving me direct access to the HTML when I needed it.

Ditching Tumblr meant I also needed somewhere to host the blog. I still didn’t want to manage infra, so GitHub Pages seemed like a great fit. Unfortunately, in 2014, GitHub Pages wasn’t the flexible platform it is today. It was a great way to host static HTML, but its support for static site generators was limited to running a specific version of Jekyll, with pre-baked config. My Octopress setup wasn’t going to work.

A common workaround was to run Jekyll locally and commit the generated static site to a separate branch of the same Git repo, then use GitHub Pages to serve that branch. The manual build step reminded me uncomfortably of FTPing files to a VPS, so instead, I set up a CI build on Codeship to automatically build, commit and push the static site each time I pushed a new commit to the blog.

At this point I had - of course - spent more effort setting up a blogging workflow than I had actually writing blog posts. So it goes.

On the plus side, around this time, a couple of my posts - notably What programming is like - got read and appreciated by a lot of people, which made it all feel worth it!

2015-2023: Jekyll with Octopress trimmings

In 2014 to start an Octopress blog you forked the original Octopress repo - a heavily-customised Jekyll setup - and added your own commits on top. That meant you were pinned to certain versions of certain gems. At some point I found that due to incompatible changes those gems and in Ruby itself, I couldn’t build the blog any more.

A static site generator that I couldn’t run meant I couldn’t post any more, or even change anything. And Octopress was pretty long in the tooth by now. The author was talking about a “full rewrite”. I didn’t feel like being tied to a monolithic framework when I’d chosen Jekyll in the first place for simplicity and control.

I decided to migrate off Octopress onto mainstream Jekyll, and make sure I was running on the latest version, so this couldn’t happen again. (Ah, the innocence of youth.)

I had a post I wanted to publish, and didn’t want to rebuild my entire blog layout and styles from scratch first. So I imported the layout, styles, and bunch of plugins from Octopress. I now had a plain Jekyll blog, which looked like an Octopress blog.

Among other highly questionable decisions, importing the Octopress styles ended up meaning downloading the minified stylesheet from the live blog and committing it to the repo. This was the whole 40kB stylesheet with whitespace and newlines removed - my commit comment at the time called this “completely unmaintainable”. Naturally I ended up wanting to add some custom styles anyway, so I tacked them onto the end of the unmaintainable 40kB blob.

The (admittedly somewhat baroque) multi-branch CI deploy + GitHub Pages hosting basically still worked, so I didn’t change that, besides fixing some minor bit-rot.

2023: starting from scratch with Jekyll + Netlify

“History doesn’t repeat itself, but it does rhyme.” Again I found my blog wouldn’t build. This time it was an accumulation of unaddressed issues - not too surprising as all the libraries and infrastructure I’d depended on had been moving on for eight years.

My CI solution had stopped working. GitHub Pages had got a lot more capable in the meantime, now supporting arbitrary Docker containers via GitHub Actions, so I switched to that, but encountered errors from Jekyll. I tried upgrading to the latest version of Jekyll to find it had made several breaking changes which broke my build in other ways.

I flailed for a while trying to debug this, but gave up sometime around discovering that Jekyll was sometimes trying to apply my baseurl prefix twice.

My Octopress blog had supported lots of nice things - category pages, a fancy stylesheet with collapsible sidebars, embedded widgets showing my recent tweets and Pinboard bookmarks. It was blinding me to the simplicity of my actual task - take 18 Markdown files and publish them online.

I started a new Jekyll1 project from scratch, imported the Markdown files from the old repo, and had everything working in a couple of hours.

For hosting, I had heard good things about Netlify, so I wanted to try them out. They dealt seamlessly with my (now extremely unremarkable) Jekyll build. Setting up a custom domain took a couple of tries but is now working fine.

New domain, new blog title

My old blog lived at blog.samstokes.co.uk/blog. I don’t remember why I thought the /blog suffix was a good idea, particularly in combination with the blog subdomain. It was probably an SEO best practice I read about somewhere.

While I was nuking everything from orbit and starting again, I thought it would be a good opportunity to take advantage of one of the silly domains I had registered a while back. So my new blog is Five Eights, at five-eights.com.

Why Five Eights? Well, it’s almost as good as five nines.

I set up a bunch of redirects - from the old domain to the new, and from old URL structures to new - so hopefully, all my URLs from the last 13 years should still be valid. I doubt anyone cares what I thought 13 years ago about the UK’s Digital Economy Act, but I’m doing my infinitesimal part to keep the Web from eroding.

Future work - comments and analytics

As a remarkable coda to the above catalog of breakages over the last 13 years, the Disqus comments I’ve been using since 2009 are still working fine. That’s actually pretty impressive, given I’m pretty sure most of the platforms they integrated with have collapsed over that time. On the other hand, Disqus was acquired by a holding company in 2017, and their privacy practices seem pretty shady.

In any case, the new blog doesn’t support comments. In 2009 blog comments seemed like a great way to start a conversation, but now I’d rather move the discussion to other, more real-time platforms, and keep this my own little corner of the Web. And this way I don’t have to include Disqus’s third-party Javascript (and, no doubt, tracking cookies) on my site.

Some of my older posts had some good discussions, so I’m working on importing those comment threads from Disqus.

Update 2023-02-20: I got the Disqus import working, so comments on previous posts are showing up now. Definitely happy to have preserved a record of that conversation.

Since a couple of my posts got a fair amount of readership, analytics has become important to me. For now I’m sticking with Google Analytics because I’m familiar with it, but I’m thinking of looking into more privacy-focused solutions like Plausible.

Future work - digital garden

Notably absent from this post is any sort of New Year’s Resolution to Blog More This Year, because those always look rather silly in retrospect, particularly when followed by another multi-year hiatus. I’d like to write more, but I think it’s fair to say at this point that regular blogging isn’t something I’m wired for.

I do like the idea of thinking in public, though. There are plenty of things I write down - musings on concepts, half-finished theories, cocktail recipes - that I’d love to discuss online.

This seems closer to notions of a digital garden - where the focus is less on a chronologically ordered list of timestamped, evergreen, finished essays, and more on an evolving set of “living documents”. Part of my difficulty with blogging is that psychological barrier of needing to have a finished thought at a particular time. I’m interested to see if I can evolve this site into a digital garden. Hopefully there won’t be any more ground-up rewrites needed first!

  1. I briefly considered switching blogging engines, to something trendier like Hugo or Ghost, or even something written in Rust, my current favourite hobby language. But all of this bit-rot has reminded me of the benefits of remaining close to the mainstream. Jekyll works, and it’s widely used. At least when it breaks again, I’ll be in good company.