Logo

Developer Blog

Anton Lijcklama à Nijeholt

Dedicated to cultivating engaging and supportive engineering cultures.

The liability of everything

These last 7 months have been quite hectic. I’ve relocated to a foreign country, and I’m now working fully remote. A dream come true! During this period, I have not spent a second on my developer blog. It’s just a simple statically generated website, so I didn’t think too much of it. A problem arose when I attempted to write a new post today. I was confronted with two errors as I was trying to preview my blog.

text
ERROR deprecated: site config key paginate was deprecated in Hugo v0.128.0 and subsequently removed. Use pagination.pagerSize instead.
ERROR deprecated: resources.PostCSS was deprecated in Hugo v0.128.0 and subsequently removed. Use css.PostCSS instead.

It made me realize once again that every tool, library, and line of code is likely to become a liability in the future. Anything you add to a project should have a clear goal and purpose for it to exist. Do you remember how the removal of the left-pad library broke the Internet? Interesting how many people decided to depend on an external library for a very simple function. Today, I learned first-hand how even a simple static website generator like Hugo can become a liability.

Let’s move on to the earlier mentioned errors. They were easy to fix, but a new problem appeared. This time, I was uncomfortably greeted with a blank home page. My posts were still accessible by their static URLs, it was the home page refusing to render anything. Inspecting the HTML confirmed that indeed something broke. No errors, no warnings, nothing… Built in 1579 ms, but no longer working as before.

html
<html>
  <head>
    <script
      src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload"
      data-no-instant=""
      defer=""
    ></script>
  </head>
  <body></body>
</html>

Why did this happen? Let’s give you a bit of extra context. During these 12 months I’ve kept my machine rigorously updated. Incredibly simple to do in this day-and-age. You can even fully automate most of it using a package manager like brew. Personally, I’d like to inspect what is being installed, and I have two separate commands for that:

  • brew update && brew outdated to update Brew’s formulaes and list the outdated packages.
  • brew upgrade after carefully inspecting which outdated packages are about to be updated.

Fortunately, I already understood that some Hugo update broke my blog, however, I take responsibility for not checking my blog after each update. As a year has passed since I wrote my last article, my first thought was to take a look at the breaking changes in every release. I’m not sure which version I used back then, but I know that I successfully published an article in August 2024, so let’s use that as our starting point:

bash
curl -s "https://api.github.com/repos/gohugoio/hugo/releases?per_page=100" | \
  jq -r '.[] | select((.published_at >= "2024-08-21")) | "\(.tag_name) \(.published_at)"'

Between August 2024 and August 2025, there were a staggering 54 updates! That’s at least a release per week… Kudos to the Hugo maintainers! Instead of reviewing all release notes for breaking changes, I decided to investigate it manually and brute-force my way through it. I temporarily switched to a new theme called Ananke and started overwriting directories with files from my custom theme, until my home page showed the dreaded blank page. This process of elimination allowed me to quickly understand which file was the troublemaker: the index.html file. Not too surprising in retrospective!

Even though the problematic file was located quickly, it still took about 30 minutes to fix the issue. Firstly, the index.html was expected at a new location. Secondly, some of the code I wrote to render the posts was no longer working, so I had to rewrite it. It was a great reminder that software evolves constantly, and things inevitably break along the way. One of my favourite quotes from Heraclitus also highlights this:

Τα πάντα ῥεῖ — Heraclitus

Freely translated as “Everything is always in motion”. Or in other words “nothing stays the same”. It also aligns with this interesting take of Casey Muratori where he explains why software keeps breaking.

Conclusion #

So what did I learn? Updating my Hugo CLI without verifying whether my blog still builds is bound to fail at some point. Ideally, I would have a CI/CD pipeline in place where my tools, code and dependencies are version locked. An optional integration test could check whether my site still loads correctly. However, considering this is just my personal platform to write about things that could come in handy for my future self and does not contain any mission-critical functionality, I’ve made the trade-off in the past that this site should be as simple as possible, and keep costs minimal. Whether my future self will agree with this decision remains a topic for another time.

Reference: Hugo updates between August 2024 and August 2025 #

Version Date
v0.149.0 2025-08-27T16:06:03Z
v0.148.2 2025-07-27T13:12:22Z
v0.148.1 2025-07-11T13:22:24Z
v0.148.0 2025-07-08T14:00:02Z
v0.147.9 2025-06-23T08:43:04Z
v0.147.8 2025-06-07T13:52:06Z
v0.147.7 2025-05-31T12:55:29Z
v0.147.6 2025-05-27T11:33:52Z
v0.147.5 2025-05-22T11:57:26Z
v0.147.4 2025-05-20T11:06:23Z
v0.147.3 2025-05-12T12:40:39Z
v0.147.2 2025-05-06T12:18:23Z
v0.147.1 2025-05-01T14:18:24Z
v0.147.0 2025-04-25T17:17:15Z
v0.146.7 2025-04-22T17:48:01Z
v0.146.6 2025-04-20T11:33:00Z
v0.146.5 2025-04-15T18:23:20Z
v0.146.4 2025-04-14T13:26:40Z
v0.146.3 2025-04-12T17:38:10Z
v0.146.2 2025-04-11T17:40:22Z
v0.146.1 2025-04-10T16:59:43Z
v0.146.0 2025-04-10T15:14:17Z
v0.145.0 2025-02-26T16:00:08Z
v0.144.2 2025-02-19T12:57:23Z
v0.144.1 2025-02-18T12:32:04Z
v0.144.0 2025-02-17T16:40:24Z
v0.143.1 2025-02-04T09:16:02Z
v0.143.0 2025-02-01T16:10:20Z
v0.142.0 2025-01-22T12:37:07Z
v0.141.0 2025-01-16T13:28:56Z
v0.140.2 2024-12-30T15:33:58Z
v0.140.1 2024-12-23T16:41:07Z
v0.140.0 2024-12-17T14:41:02Z
v0.139.5 2024-12-14T19:18:24Z
v0.139.4 2024-12-09T18:00:17Z
v0.139.3 2024-11-29T15:53:57Z
v0.139.2 2024-11-23T15:53:49Z
v0.139.1 2024-11-23T14:34:12Z
v0.139.0 2024-11-18T16:33:50Z
v0.138.0 2024-11-18T17:36:25Z
v0.137.1 2024-11-05T12:05:31Z
v0.137.0 2024-11-04T16:25:00Z
v0.136.5 2024-10-24T12:42:35Z
v0.136.4 2024-10-22T08:58:58Z
v0.136.3 2024-10-21T14:35:44Z
v0.136.2 2024-10-17T14:44:59Z
v0.136.1 2024-10-16T16:26:09Z
v0.136.0 2024-10-15T13:45:25Z
v0.135.0 2024-09-27T13:33:44Z
v0.134.3 2024-09-19T14:54:53Z
v0.134.2 2024-09-10T12:14:33Z
v0.134.1 2024-09-05T11:08:29Z
v0.134.0 2024-09-03T10:19:50Z
v0.133.1 2024-08-26T14:31:18Z

Posted on Aug 29, 2025 (updated on Aug 30, 2025)