Cli
A Fully Local AI Assistant in One docker agent YAML
Point Docker Agent at a local OpenAI-compatible server, declare a few toolsets, and you have a private assistant that reads files, runs shell commands and calls your own scripts — no cloud API key required
docker agent is Docker’s agent runtime (the CLI plugin built on the open-source cagent project — you’ll
see that name in ~/.config/cagent). Its whole contract is a single YAML file: one block describing agents,
one describing models. Nothing stops you from pointing the model block at localhost, which is the
interesting part — the same declarative agent, tools and all, running against a model on your own machine.
opencode.json: Wiring a Terminal Coding Agent to a Local Model
One JSON file turns opencode into a fully local assistant — declare an OpenAI-compatible provider, describe your models, and check the resolved config before you trust it
opencode is a terminal coding agent, and it has no opinion about where its tokens
come from. Providers are declared in an opencode.json file, so pointing it at a model running on your own
machine — LM Studio, an MLX server, llama.cpp, vLLM — is a matter of a baseURL and a couple of lines of
metadata. Here’s a config with three providers side by side: a LAN box, a hosted API, and a local server.
3 Ways to Add a --version Flag to a Go CLI
Inject build metadata with -ldflags, read it back with debug.ReadBuildInfo, or grab a tiny helper package — three approaches to a --version flag, with the trade-offs of each
Every CLI eventually grows a --version flag. Users need it to file useful bug reports, scripts need it to gate behavior, and you need it when an issue lands and you want to know what binary the reporter is actually running. Go gives you a few ways to wire this up — none of them long, but each with different ergonomics. Here are the three I reach for.
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.
bullets: a colorful, goreleaser-style logger for Go CLIs
A small Go logging library focused on beautiful terminal output — bullets, spinners, progress, and updatable lines — without dragging in a heavy framework.
I love how goreleaser looks when it runs. Tidy bullets, indented sub-steps, the right amount of color, occasional spinners. Every time I write a Go CLI of my own, I want that aesthetic — and I don’t want to pull in a 100-dependency logging framework to get it. So I wrote bullets.