Projects
These are some of the open-source side-projects I've worked on recently. You can find more on my GitHub profile.
Self-hosting
I like to self-host things as much as I can, and that requires some infrastructure. There's a lot of ready-made software that fills that gap, but sometimes none of it quite works how I want it to.
Centauri
A reverse proxy that's super easy to configure, obtains certificates automatically from an ACME provider like Let's Encrypt, and can even expose services over Tailscale instead of the public Internet.
Dotege
A tool to generate configuration files based on currently running Docker containers. Originally designed to be used for haproxy, I now use it to generate a configuration file for Centauri.
Goplum
A simple, self-hosted monitoring service. Periodically runs checks and sends notifications when things go wrong.
tsp
A small Tailscale proxy for TCP connections. Run it alongside another service (like a database or IRC bouncer) and it will allow you to access it securely over your tailnet.
certwrapper
Wraps another binary, and manages obtaining a certificate for it from an ACME provider (such as Let's Encrypt). Whenever the certificate is updated, the child binary is sent a signal so it knows to reload.
Go libraries
Go is my favourite language for writing software in, and I've built up a small collection of libraries to make things easier.
envflag
Allows setting standard Go flags via environment variables. Lets you write simple code, while still supporting configuring the app nicely when using Docker/Kubernetes/etc.
slogflags
Defines two flags to control Go's structured logging package (log/slog). These permit users of your apps to set the logging level and format easily, with no boilerplate on your side.
config
For desktop applications that need to persist user configuration. Handles storing and loading a YAML file in the appropriate location (%AppData% on Windows, ~/.config on Linux, etc).
gitrefs
Provides a simple way to list references from a remote git repository over HTTP, without needing a full git client or a checkout of the remote repository.
latest
A library that lets you find the latest versions of software, packages, images, etc.
legotapas
Provides build constraints for the lego library. This allows you to build applications that obtain certificates using ACME DNS challenges with a specific provider without having to bundle 30+MB of dependencies.
apkutils
Utilities for operating on Alpine Linux packages and package indices. Supports verifying public key signatures, parsing package lists, and so on.
aca
A generator for unique, human-friendly identifiers. Useful when users may need to share codes with each other, such as when inviting them to play a game. Each identifier is an adjective, colour and animal, like 'satisfied-yellow-tapir'.
hotsource
Enables live reloading of web-based frontends when files are changed on disk with minimal setup.
Tools and services
Utilities and services and other things I've written that I can't nearly categorise any further.Contempt
Container file templating engine. Allows you to generate a Dockerfile (or Containerfile) from a template, substituting in the latest version of its dependencies, packages, and so on.
Puzzad
A web-based, self-paced puzzle hunt. The site is open source: it uses a Go backend and a Svelte frontend. The puzzles are not open source, but there are several 'adventures' available to play for free!
Todoistager
Tool to automatically apply age-based labels to tasks in your Todoist account, so you can review those that have been hanging around for way too long.
GitHub release redirector
Redirects HTTP requests to assets from the latest release of a GitHub project. Designed to enable simple automatic updates in clients.
Webhooked
Command-line utility to automatically adds a webhook to all of your GitHub projects. Because for some reason there's no account-wide webhooks. Still.
Alphabat
Simple command line tool to retrieve the battery status of a HyperX Cloud Alpha Wireless headset. (This also has the side effect of making the headset report the correct battery level when pressing the power button.)
Contact form
A simple web service that allows users to type into a form, and send you an e-mail. Supports CAPTCHAs to prevent spam, custom templates, etc.
Splendid
A multi-player, web-based board game engine. It features a nodejs backend that handles game logic, and a Svelte-based frontend that displays the game state and allows players to interact with it.