Posts
retry: a tiny CLI for the things that almost always work
A Go CLI (and library) for retrying flaky commands with fixed delays or exponential backoff
There’s a category of bash one-liners I keep rewriting: “run this thing, and if it fails, try again a few times with a delay.” curl against a service that’s still booting. A kubectl rollout status that flickers. A flaky integration test. A docker pull from a registry having a bad five seconds.
You can write the loop yourself in five lines of bash. I’ve done it hundreds of times. But I always forget the exit code handling, the sleep arithmetic, the cap on retries. So I wrote retry — a single binary that does exactly this, with proper exponential backoff if you want it.
s3xplorer: a fast web UI to browse a single S3 bucket
A self-hostable Go web app to browse, search and (optionally) trigger Glacier restores on an S3 bucket — backed by PostgreSQL for instant browsing
The AWS console is great until you want to give someone a read-only link to a single bucket. Then it’s terrible: you have to mint an IAM user or a federated role, walk them through the console, scope it down, deal with their MFA, and so on. All they wanted was to browse a folder.
s3xplorer started as a weekend POC to play with the AWS Go SDK v2 and the minio client, and turned into the tool I now use to expose a bucket to humans without giving them AWS credentials.
Hosting a Helm Chart Repository on GitHub with chart-releaser
Step-by-step guide to publish Helm charts on GitHub Pages using the helm/chart-releaser-action, with a clean repository layout that decouples the application from its chart
Hosting a Helm Chart Repository on GitHub with chart-releaser
GitHub Pages plus the helm/chart-releaser-action is the de facto way to turn a GitHub repository into a Helm chart repository. No extra hosting, no separate registry — just a gh-pages branch and a workflow file.
This post walks through the layout I use in practice: one repository for the application, a separate one for the chart.
Installing the Vagrant libvirt Provider on Ubuntu 22.04 LTS
End-to-end setup for running Vagrant on top of KVM/libvirt on Ubuntu 22.04 — virtualization packages, group membership, NFS, plugin build dependencies, and the vagrant-libvirt plugin itself
Installing the Vagrant libvirt Provider on Ubuntu 22.04 LTS
Vagrant ships with VirtualBox as its default provider, but on Linux KVM/libvirt is the better fit: it’s the kernel’s native hypervisor, it’s faster, and it doesn’t require an out-of-tree kernel module. The bridge between the two is vagrant-libvirt, a Vagrant plugin that drives libvirt instead of VirtualBox.
This post walks through the full setup on Ubuntu 22.04 LTS (Desktop or Server). It is largely a distillation of Paul Neumann’s gist, which itself builds on Philippe Vanhaesendonck’s Oracle Linux write-up — kept here for my own reference and slightly reorganized.
Go Project Structure: Patterns That Scale
Practical guide to structuring Go projects from flat layouts to hexagonal architecture, with examples for CLIs, APIs, and monorepos
Go doesn’t enforce a project layout. That freedom is powerful but requires discipline — start simple and let structure emerge as complexity grows.