Welcome! It's a blog! My blog!
tags: blog, server, hugoWelcome! I’ve been enjoying my time on Bluesky, but the whole “micro” blog thing was getting to me. For some of my thoughts I need a “macro” blog, so I made this! Thankfully, personal blogs are still relevant in 2025.
To celebrate my fancy new blog, I’ll give a brief overview of how it works.
My initial idea was to do a wordpress– I’ve done plenty of those in my time– but then I realized the concept of setting up and securing another wordpress for myself horrified me, so I looked into other options. I had heard of static site generators, but never used one before. After a bit of research, I settled on Hugo. Is it the best? I don’t know, but so far I don’t mind it and it seems to have pretty extensive community support.
I wanted a blog and a gallery, so I set up two different Hugo sites and I’ve configured NGINX to serve them at different locations. The root page brings you here, and the theme I’ve used is neopost, which I like because it has way more personality than most of the sanitary options that are available, and it reminds me of the bygone era of personal blogs. The gallery, available at /gallery, runs on Autophugo.
The plan for this blog is to supplement my Bluesky and act as a site to keep any of my long-winded rambles without having to post them in long, broken up threads. When I release things, this is also probably where I’ll keep the files.
There’s not much else to say! I’ve made some minor customizations to the theme, but not much that you couldn’t figure out in a few minutes and a google search. The most extensive modification is the “Song of the minute”, which I wrote to learn how to use Hugo. Here’s that code!
<div class="small-box" style="margin-top: 6px; margin-bottom: 6px;">
<div class="audio-player">
<h3 style="text-align: center;margin-top:6px;">Song of the minute</h3>
{{ $audioDir := "audio" }}
{{ $audioFiles := resources.Match (printf "%s/*" $audioDir) }}
{{ $shuffledAudioFiles := shuffle $audioFiles }}
{{ if $shuffledAudioFiles }}
{{ $randomAudioFile := index $shuffledAudioFiles 0 }}
{{ $songmeta := index ( last 1 (split $randomAudioFile.Name "/") ) 0 }}
{{ $songauthor := trim (index (split $songmeta "-") 0) " " }}
{{ $songalbum := trim (index (split $songmeta "-") 1) " " }}
{{ $songtitle := index (split (trim (index (split $songmeta "-") 2) " 0123456789") ".") 0 }}
<div style="text-align:center;"><p>{{ $songauthor }}<br><i>{{ $songalbum }}</i><br><b>{{ $songtitle }}</b></p></div>
<audio controls style="width:100%;">
<source src="{{ $randomAudioFile.Permalink }}" type="audio/mpeg">
Your browser does not support the audio element.
</audio>
{{ end }}
</div>
</div>
Hugo’s syntax is really weird. It’s certainly usable, but it feels archaic? I might need some getting used to it. Because the pages are static, I have a cron job running to rebuild the page every minute (hence song of the minute). I could’ve done this with some Javascript and a list of songs so the selection occurs on the browser, but I didn’t want to. (Also, keen-eyed readers may have noticed that my code will break on songs whose titles start with a number. My solution is to not include any songs where the title starts with a number.)
The same cron job also pulls the latest version of the site down from my personal Gitlab server, so I can just git-push it there whenever I want to commit a new post or change. I mostly only mention this because I want to share what may be the world’s most cursed Gitlab server. It’s a Raspberry Pi 4 with two 512GB USB sticks stuck in it for storage.

If you’re wondering why there’s two USB sticks, it’s because they’re in RAID 1. Data security is important! Surely nothing bad can happen to my data now, it’s foolproof. (This is a bit. I am the fool. Don’t do as I do, because I do bad ideas for a laugh.)
It’s actually pretty usable.
Anyways, thanks for checking the blog out! I hope to have more here soon.