Henrik Sommerfeld

Hugo Pipeline Series – Intro

metal pipe between trees at daytime
Photo by Quinten de Graaf.

Who is this for?

This is the first part in a series of posts where I’ll describe how I created my personal blog with a fair amount of work to achieve simplicity. The intended audience is:

  • Myself (as documentation)
  • Someone with their own Hugo blog, looking to improve automation
  • Someone interesting in learning one way of working with a Hugo blog

This will be an overview of the different pieces I use, it won’t be a detailed description or tutorial, but I’ll try to link to libraries and concepts.


Site characteristics

The site I’ll be describing has the following characteristics:

  • Annual running cost of nothing, except for the domain name
  • Static site (built with Hugo)
  • 400+ images
  • < 2 minutes combined build & deploy time
  • Custom domain with HTTPS
  • Lazy loading of images (with blurry preview when JS is available)
  • Search with Lunr
  • Lightbox for images and code
  • Dark/light mode
  • Alpine.js for custom JavaScript code
  • Cypress tests that run automatically on pull requests
  • Lighthouse audits automatically run after deploy
  • All code is in a public repo on GitHub
  • Runs locally without Internet access

What it doesn’t have:

  • Dynamic data loading (except for comments and analytics)
  • SPA characteristics (it has full page reloads)
  • Offline availability (it’s not a PWA)
  • A proper CMS
  • Configurable UI, like themes intended for re-use tend to have

A fashion blogger (or other non-technical friend) might view this setup as horribly complicated, but that’s because the complexity is hidden to the user in a typical blogging platform.

Admittedly, I’ve spent some time on this over the years, with small adjustment every now and then, to achieve this level of sophistication and simplicity. It might sound arrogant with “sophistication” and “simplicity” but storing the content as text files instead of in a database and having a static site that can run from a CDN is simple.

It’s sophisticated in that the pipeline is automated and has tests in the same way as our professional applications we develop at work. I’ll create a new branch, do code or design change and make a pull request (PR) to myself. If the tests that run automatically when a PR is created are green, I merge without hesitation. More details coming in future posts… (here is part 2)

No matching posts found. You can use wildcards and search only in titles, e.g. title:iot
Loading search index, please wait...
Search index failed to download 😢