Projects

Here are some of the things I've been working on! You can see some bigger, long-standing projects I've got at the bottom or a running log of the smaller things I've been doing laterly.

Smaller Things

Click to see the rest of the log...
  • Setup a Windows mini-PC for photo editing (2025-04-10)
    • Since I do a fair bit of photography, I end up needing to do a fair bit of photo editing too, which kinda sucks because of the state of creative software on Linux.
      • Sorry GIMP, you're great but you just don't compare to professional tools.
    • Since upgrading wall-e to a larger ThinkCentre, I've had a spare ThinkCentre M73 Tiny kicking around. I nicked a 128GB SSD off of Charlie, installed Windows 11 on it (surprisingly without hitch, despite the machine being a 4th-gen i5 with no form of TPM whatever) and loaded VueScan and Affinity Photo onto it.
    • The computer fits nicely on my existing desk by hiding under my laptop stand.
    • I've since scanned and edited a whole roll of film on it, and while it's not the most performant thing in the world, the experience was immediately better than trying to do the same on Linux.
  • Reworked small projects (2025-04-09)
    • Tweaked this page to be loaded from a YAML file during build and to put everything but the first five entries in the list in a collapsible box
    • This uses a fun little dataloader class that I wrote that allows the (controlled) loading of arbitrary YAML from the disk in Jinja templates
  • A couple small tweaks to society-voting (2025-04-07)
    • Rewrote some of the layout for presenter mode and fixed a bug (pr 1, pr 2)
  • Wrote some VBA in Excel (2025-04-04)
    • Hacked an Excel spreadsheet around to make a quick little tool to use at work
    • Part of my job involves copying some data out of a Sharepoint database, formatting it and sending it on, which up until now was done manually.
    • This is trivial to automate with a Python script, but then there was interest from the rest of the team in using it - none of whom are particularly technically inclined (plus getting them to download and run a "random executable", ie. a Python interpreter, seems like a bit sketch)
    • So I rewrote it all in VBA and threw it in an Excel macro-enabled spreadsheet alongside a quick UI using some text boxes and buttons.
    • This was the best option considering the existing constraints around (not) sharing personal data and running random executables and also because it fitted fairly well in with out existing workflows.
    • Overall, not a horrendous experience. Fun to do something a bit different for a change.
  • Hackathon Game (2025-03-23)
    • Made a little game using PyGame at a hackathon - it's kinda like a cross between Papa's Pizzeria and Papers Please
    • Everything was built from scratch in 24 hours, including all the pixel art (thanks Nathan!!)
    • Repo Screenshot of the game
  • Small website tweaks (2025-03-19)
    • Moved dependency management to uv and updated the Dockerfile to use that accordingly
    • Replaced a very outdated dependency on pyinotify in favour of inotify (this stopped me upgrading past Python 3.11 because they removed an API pynotify needed in 3.12)
    • Upgraded the generator's Python version to 3.14 (from 3.10 lol)
  • Added a backlight block to cdmbar (2025-03-05)
    • cdmbar is my DIY i3wm status bar.
  • Small contributions to MusicBrainz (2025-02-26)
  • Setting up Navidrome and beginning to build out my music collection (2025-02-21)
    • Lately I've been wanting to start building up my own library of music that I own and control and is of better quality than what you'd find on streaming services
    • I picked Navidrome to manage that collection, and provide a nice API to use it on clients across my devices
    • So far, so good! It's running on the newly-upgraded wall-e and I'm using Copyparty to upload files to be ingested into it along with Feishin and Symfonium as clients.
    • Listening to lossless FLACs compared to mashed streaming audio is like being enveloped in a warm embrace of rich sound that you never realised you were missing
  • Moving wall-e to new hardware (2025-02-15)
    • wall-e is my home server that I use to run Gitlab and some other file storage services. Historically, this has been run on a ThinkCentre M73 Tiny and that's been all well and good, but I was starting to need an upgrade on the 8GB of RAM and 256GB of storage.
    • I decided to upgrade to a ThinkCentre M710s and toss a terabyte of spinning rust in it - plus I now have actual DIMM slots to add more RAM and I get a slightly newer and faster CPU (we're now rocking a Intel i5-7400 @ 3.5GHz!) so big wins all round.
    • The only hitches I had were:
      • Taking about an hour to work out that I needed to switch the BIOS to use legacy boot because that's how the boot SSD that I was physically moving over was partitioned
      • Needing to edit /etc/network/interfaces to adjust for the new ethernet adapter name before I could connect to the internet
  • NowPlaying (2025-02-14)
    • NowPlaying is a teeny tiny web service to fetch your latest Spotify song and expose it as a basic API endpoint
    • This is used to power the "the last song I listened to on Spotify" thing on my homepage
  • Switching Walrss to use index-based feed filtering (and other improvements) (2025-02-11)
    • Historically, Walrss has filtered feed items in the digests it generates using the time of each item, selecting only items that have been published since the last run.
    • This is unreliable since feed items do not always have an accurate date or any date at all - instead, it's best to use the feed item ID to remember what has been seen before and only send the new stuff down the wire, which is what Walrss now does.
  • Moving all my services to use Postfix as an MTA (2025-02-09)
    • I run quite a few services that send email, each of which has historically been set up to reach out to SMTP services like Fastmail and Sendgrid to send their mail.
    • This meant each service had its own API key and required a slightly annoying configuration process each time
    • Each of my servers now runs an instance of Postfix in a Docker container that accepts incoming mail from other containers and forwards it on to Fastmail.
    • Now, as opposed to having 8 different SMTP configurations littered about across multiple servers and email providers, I have 2 configurations, one per server, both pointing at Fastmail. Easy!
  • The log ends here!

Bigger Things

  • Advent of Code solutions
    • For years 2020 to 2023 inclusive
    • Completed an average of 45 stars per year
  • society-voting
    • Project for my uni's computer science society to streamline committee elections
  • Walrss
    • A RSS/Atom/JSONFeed email digest generator
    • A screenshot of the Walrss web UI and an email digest that Walrss generates
  • RailMiles
    • A DIY train journey tracker
    • See also this blog post (though the app has been substantially updated since writing)
    • A screenshot of RailMiles
  • cdmbar
    • A status bar for the i3 window manager