Devops
auto-mr: one command from feature branch to merged PR
A Go CLI that pushes your branch, opens an MR/PR, waits for CI, and merges — works on both GitLab and GitHub
I push a feature branch a dozen times a week. Every single time, the dance is the same: git push, switch to the browser, click the “Create MR” button, set assignee, set reviewer, add labels, wait for CI, click merge, switch back to terminal, git checkout main, git pull, git branch -d feature/.... It’s not hard. It’s just tedious — and the kind of friction that adds up over a week.
I had a shell script glued together with glab, gh, jq, yq, and gum doing this for years. It worked, but it broke whenever any of those tools updated and was a pain to ship to a fresh laptop. So I rewrote the whole thing in Go and called it auto-mr. One binary, no external CLIs, works on both GitLab and GitHub.
calcdate: date arithmetic that doesn't make you cry
A Go CLI for date math, range generation, and timezone conversion with a readable expression syntax
Every shell scripter has, at some point, googled “date subtract day mac” or “GNU date macOS BSD difference” and wished they hadn’t. The date command is one of the most platform-fragmented tools in any Unix toolbox: GNU date and BSD date disagree on basically every flag that matters. And once you’ve worked out the syntax for “yesterday,” you still need to do something useful with it — like generate a range of timestamps for a backfill, or compute end-of-month, or skip weekends.
I got tired of this. So I wrote calcdate. Same binary on Linux, macOS, anywhere. One expression syntax. Version 2 just landed and the syntax is now genuinely pleasant to use.
claude-plugins: a personal Claude Code marketplace for DevOps and Go
A curated set of Claude Code plugins — agents, commands, and skills — covering DevOps, software engineering, and modern Go development.
Once you start using Claude Code seriously, you accumulate prompts. A snippet that always produces the right golangci.yml. A spell that turns “I need a GitLab CI pipeline” into a working .gitlab-ci.yml. A code-review checklist you keep pasting in. After enough copy-paste, the obvious move is to package those into proper Claude Code plugins. That’s what claude-plugins is.
httpfileserver: serve a directory over HTTP, the boring way
A tiny Go binary (and scratch Docker image) to expose a directory over HTTP, with optional basic auth and configurable timeouts
Once in a while I need to throw a directory online. Share a build artifact with a colleague, expose a folder of files inside a Kubernetes cluster, mount a release directory behind an internal nginx — the kind of task where a full web server is overkill and python3 -m http.server is too primitive.
That’s the niche httpfileserver fills: a single static Go binary (or a scratch-based Docker image) that serves a directory, with the few quality-of-life features I always end up wanting.
logwrap: prefix any command's output with timestamps and log levels
A Go wrapper that intercepts stdout/stderr in real time and decorates each line with timestamps, levels, user, and PID
I have a recurring frustration: I run a script in CI, it produces output, something fails, and I have no idea when any of it happened. Did the failure come 200ms after start or two minutes in? Was it stdout or stderr? It’s the difference between “took a minute to figure out” and “took half an hour.”
The fix is to prefix every line with a timestamp. Easy in theory, annoying in practice — especially if you want the prefix to differ between stdout and stderr, or if you want UTC, or colors, or to drop the prefix in production. So I wrote logwrap: a small Go binary you put in front of any command and it adds a configurable prefix to every line, in real time, without buffering.