Migrated to Hugo

- 4 mins read

I’ve been using Jekyll for this blog for more the 12 years. It was great at the time, but over the years I found myself getting more and more frustrated with the only constant in the Ruby/Gem/Bundler stack: never ending breaking changes. I don’t really know what’s going on in that space and that’s the second issue I had with Jekyll, I treated it like a blackbox cause I had no desire to get into Ruby and still don’t unless I need to professionally.

Take for example yesterday when I tried to change this blog’s structure a bit, I immediately found myself in dependency hell when I tried to run jekyll locally. A Ruby standard module called ‘csv’ was apparently completely removed and now has to be an external module (naturally with breaking changes). I struggle to imagine a single good reason why a stable production programming language like Ruby needs to do such a drastic change to its standard library in between two minor versions.

I hate eternally swirling software. In my opinion good software should know its job well and do it right, if there’s nothing to fix or enhance anymore then there’s no need for changing and certainly no need to break existing stable features.

I aired out my frustrations on Mastodon only to hear echos from other developers who experienced the same. I was tempted to take the same path they chose and role my own static-gen solution (using Go probably) but I ultimate chose to dive into Hugo mainly because of my new infatuation with golang.

Hugo is too powerful

I saw that phrase while searching around to try to understand how Hugo selects its layouts/templates, users in its community state that “oh Hugo is not like the others, it’s too powerful so it has a completely magical pipeline that can only be vaguely described for even trivial features” (not verbatim), I spent 3-4 hours slapping my head against the desk trying to answer simple questions like: why isn’t it picking up the archives template? why is search (with Fuse.js) not working? why can I see tags one moment and then they’re all gone the next? I was constantly finding simple solutions for things I wanted that weren’t mentioned in the docs..

For example its docs talk about this vague “taxonomies” feature to classify content, but I don’t think it mentions that by default you can just ignore that noise completely and you get “category” and “tags” support by default.

Or their guide to how to access resources like images: well you place them in the same path as the markdown files and use this over-engineered pattern to scan the content in this folder and hope it picks up the file you want. But they don’t mention you can just throw assets in the generated-by-default static folder and it’ll be accessible from anywhere in the site!

I had to stop and think. What’s going on here? Hugo certainly over-engineers everything and seems to really hate allowing users to describe anything explicitly, everything must be magical if it can be. One comment led me to my mistake. Hugo is too powerful, generating static blogs is beneath its power so it delegated the responsibility to the themes..

So in Hugo, every theme is essentially its own static generator pipeline 😅

Once I understood this, it was clear to me that deciding on the theme is the important part and Hugo itself gets out of the way. So I looked at 100+ themes and found Poison.

From there, it was trivial to setup the new site, then adapt the previous content and fix any clear issues.

And now, this blog has been refreshed anew with Hugo+Poison 💀

There’s plenty of cool features in poison but one thing I may want is to integrate a commenting service, disqus is unfortunately gone completely. But Poison supports a self-hosted alternative Remark42 and that will be a fun side-project one day. Although I really like the idea of utterances and giscus both ehm borrow github’s facilitiees to implement comments 😅