Automated Ubuntu Server Installs

Recently I created a small home lab with some Odroid H3+ boards and a NAS. My plan was to run Ubuntu 20.04 on the Odroids and then use ansible to further configure them. The Ubuntu server install ISO was the easiest way to get Ubuntu installed, but I ran into an issue: The default drivers didn’t work with the Odroid’s network hardware. Installing the drivers manaully was pretty straight forward (there are packages), but I wanted the whole install process automated to allow me to re-image them quickly when necessary....

August 5, 2023

consul-patch-json 0.3.0

Consul has been my go-to for service discovery and configuration management for a long time. I’ve primarily been using it to store JSON formatted configuration and data, but I’ve found myself writing the same code every place I go: Patch the JSON value at a specific key, but safely using CAS. I’ve finally gotten around to formalizing a tool and open sourcing it: ngerakines/consul-patch-json. This small tool does exactly what it says: It applies some JSON changes to a Consul key value....

April 28, 2023

Countdown metrics

Yesterday I whipped a small daemon that publishes a seconds-until countdown metric to statsd: ngerakines/countdown-metrics-rs There are lots of use cases, but the one I have is pretty simple: Tracking API key expiration. I have a handful of API keys and auth tokens that expire every 90 days. I want to know when they’re going to expire so I can rotate them. I also want to be able to share this information and make it easy for other people to both contribute to the rotation process and also track their own or other shared events....

April 20, 2023

GitHub Actions in Rust

Rust is a great language to create GitHub actions. In this post, I’ll walk through how I created the ngerakines/pr-has-issues-action GitHub action. For some context, I wanted a lightweight way to validate the content of a PR, specifically to ensure that the title and body are both not empty and contain at least on issue prefix. For example, if I were to create a PR with the title “Support account creation”, I would want to ensure that the title contains at least one issue prefix, such as “ISSUE-1 Support account creation”....

April 14, 2023

Creating web did messages

BlueSky uses DIDs (distributed identities) to represent entities that create and manage content. One of the DID methods that is supported is did:web. The specification for this method is available at This post will walk through the code that I used to create the document. I’ve been paying close attention to the atproto project and specification because I think it has a lot of potential. Having been involved in Mastodon and activitypub, I’m really excited to see projects like this....

April 12, 2023

Kubernetes Consul Mutator

Earlier this year, I ran into an interesting problem at work where we wanted to be able to restart pods across multiple deployments when a specific Consul key changed. I went through a couple of ideas with the team, and the one that I landed on was having a small Kubernetes operator that would watch for changes and then update the deployments, triggering a rolling restart. Although this isn’t a unique problem, I didn’t immediately find any existing solutions that would work for us....

April 11, 2023

Things that I've been using lately

Here are some things that I’ve been using lately: Visual Studio Code w/ GitHub Copilot (Lurking on) BlueSky Unifi If you’re in the market for a home camera system or smart doorbell, you really should consider getting something like Unifi protect. It has an up-front cost, but you’ll get the most out of your money with it. The cameras are great, and the integration with the rest of the Unifi ecosystem is top quality....

April 10, 2023

Site refresh

I’m moving my blog over from the bare domain to the subdomain. The bare domain has a simple landing page to highlight my projects, work, and social media links. I’m pretty happy with how it turned out. Here it is:

April 9, 2023