Posts
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.
gitlab-backup2s3: Encrypted GitLab Backups to S3, with Kubernetes Support
A Docker image wrapping gitlab-backup with AES-GCM encryption and Kubernetes CronJob deployment for automated, secure GitLab backups to S3
gitlab-backup2s3: Encrypted GitLab Backups to S3, with Kubernetes Support
Source code: github.com/sgaunet/gitlab-backup2s3 Helm chart: github.com/sgaunet/helm-gitlab-backup2s3
In the previous article, I covered gitlab-backup, a CLI tool for exporting GitLab projects and groups as portable archives. It handles the export, the restore, and supports both local and S3 storage natively.
But for production backup workflows — especially in a Kubernetes environment — you often want more: scheduled execution, optional encryption at rest, and a container image that bundles everything together. That’s exactly what gitlab-backup2s3 brings to the table.