Creations
I love creating things. It’s a big part of why I enjoy software development, and it often motivates me to take a DIY approach to solve my problems. Below are some of my creations.
The distance-vector routing algorithm is used in computer networking to determine the best path for data to take through the network. It can be tricky to understand, and working out examples by hand is cumbersome, so I built a basic simulator to use as a teaching aid with my undergraduate networking students. …
Combine multiple aerc-style address books into a single, unified address book. The unified address book contains no duplicate email addresses, and the addresses are sorted based on the order of the books, the order of the addresses within the books, and the optional ranks assigned to addresses. …
This year for Christmas, my siblings, wife, and I decided to each give a gift to one other person rather than having everyone give to everyone else. I’m a nerd, so instead of simply drawing names (what are we, animals?!), I wrote a little Python script to generate matches for us. …
A base Docker image for creating build sidecars for git-personal. These sidecars allow git-personal to trigger a build every time new code is pushed. For example, I use git-personal-builder to auto-deploy my website and to auto-publish its own Docker image. …
Seamless navigation between Sway windows and (Neo)Vim splits with the same key bindings. …
A status command for the Sway window manager’s built-in swaybar that allows sections of the bar to update independently. Each section updates at a regular frequency, and additional updates can be requested on-demand via a helper command and/or a background script. The sections are configured in a simple TOML file and communicate with the bar using the swaybar-protocol. …
A stand for my Kyria keyboard that allows me to use it tented 90° and is also a case.
A script to convert LDS General Conferences for e-readers, as well as pre-generated files for past conferences. These are pretty basic EPUBs – the footnotes are removed, images may not show up right, and links aren’t guaranteed to work – but if you just want a table of contents and the text of each talk, they should be good enough. …
A custom, split, ergonomic, tiny, mechanical keyboard that I built from a kit.
A Docker image for a simple, single-user Git server with support for mirroring to other Git servers and triggering automatic builds. I use this to maintain full control of my Git repos while still making them available to the world on public Git servers like SourceHut.
The code for this website! It’s a simple static site built with Hugo and my own custom layouts.
A simple Vim plugin to integrate the
+
register with Wayland’s system clipboard using wl-clipboard. This plugin allows you to yank text into the +
register and paste it in other Wayland applications, or copy text in other Wayland apps and paste it in Vim from the +
register. Operators and counts work, too! …The code for a previous, DIY version of this website. I used pandoc to convert Markdown to HTML and a Makefile to orchestrate the whole process. (But I’ve since moved on to Hugo.)
A Bash script wrapper for pandoc that I use to convert (primarily Markdown) files to PDFs. I appreciate pandoc’s incredible power and flexibility, but I can’t ever remember what options to pass to it without this script. …
An old desktop PC running Nextcloud and Pi-hole. I’ve had a lot of fun getting into self-hosting and have learned tons along the way.
A Dockerfile for running scheduled backups using restic with rclone as the backend. I used to run this on my home server but have since abandoned it in favor of running restic and rclone directly on the host OS to integrate my backups with ZFS snapshots. (There’s also an image available on Docker Hub, but it’s quickly becoming out-of-date…) …
Theme for Grav CMS that powered my old portfolio website. This was one of my favorite projects because other people actually used it; I loved getting an occasional email thanking me for the theme or asking for help getting it working. (I’ve since moved on from Grav for simplicity’s sake, but I’m still happy to help existing users! I’d also love to find a new maintainer – email me.)
Golang middleware for receiving, validating, and sending JSON in HTTP requests/responses. A few years ago I started writing a web server in Go and was surprised that I couldn’t find an easy way to manage JSON request/response bodies, so I wrote this.