macOS updater. Detects installed package managers and runs their update commands. Built-ins: brew, mas, npm, pip, pipx, gem, cargo, rustup, softwareupdate, mise, uv, pnpm, gcloud, conda, composer, gh, deno, bun, yarn, port, tlmgr, flutter, ghcup, opam, nix, tldr, vscode (extensions), vscodium, dotnet (global tools), krew, helm (repos), gup (Go binaries), juliaup, elan, pixi, mamba. Only installed ones run; uninstalled managers are skipped by detection.
brew tap EmreErinc/tap
brew install buum
brew upgrade buum # get the latest releasego build -o /usr/local/bin/buum ./cmd/buumPush a new semver tag to trigger the release pipeline (build, GitHub Release, Homebrew tap update):
./scripts/release.sh v0.1.4Manual order if you prefer raw git:
git push origin main
git tag v0.1.4
git push origin v0.1.4Each tag must be new on GitHub — re-pushing an existing tag does not
trigger the workflow. The repo needs a TAP_GITHUB_TOKEN secret with write
access to EmreErinc/homebrew-tap.
buum # detect + update all detected managers immediately
buum -i # pick managers interactively
buum --dry-run # show what would run
buum --only brew,npm # subset
buum --except pip # all except these
buum --json # machine-readable event stream
buum --retry-failed # rerun only what failed last time
buum list # show detected + known-but-missing managers
buum config path # print config file path
buum config set # toggle which installed managers are enabled
buum config edit # edit config in $EDITOR
buum completion zsh sync # install/refresh zsh tab completionbuum config set lists every supported manager with its current state,
grouped into Installed and Not installed, and saves your choice as
the default:
? Select managers 35 of 36 selected
↑↓ move · space toggle · a all · / filter · enter confirm · q cancel
Installed:
> [x] brew
[ ] gem
Not installed:
[x] pipx
...
↑ 0 more · ↓ 2 more
The list shows up to 36 lines and scrolls with ↑/↓ (fewer in a short
terminal window).
Disabled managers stay in the list, so you can switch them back on. enter
saves and q/esc cancels without writing. It needs a real terminal. Saving
keeps your comments and any extra keys; only indentation is normalized.
Every real run (not --dry-run) saves its report to
~/.local/state/buum/last.json (or $XDG_STATE_HOME/buum/last.json), in the
same shape as the --json final report. buum --retry-failed reruns only the
managers marked failed there. Skipped managers are not retried, and the
flag cannot be combined with --only, --except or -i.
buum completion zsh sync sets up zsh tab completion in one step:
- writes the script to
~/.zsh/completions/_buum - appends
fpath=(~/.zsh/completions $fpath)pluscompinitto~/.zshrc(or$ZDOTDIR/.zshrc) only if no such fpath line exists - deletes
~/.zcompdump*so zsh rebuilds its completion cache
Re-run it after upgrading buum, then exec zsh. buum completion zsh alone
still prints the script to stdout.
buum -i opens a checkbox menu to choose which managers to update. Use:
↑/↓to move the cursorspaceto toggle the selected managerato toggle all managers/to filter by nameenterto confirm and run the selected managersqorescto cancel
All managers start selected. After choosing, buum asks Save this selection as default? [y/N]. Answering yes writes your enable/disable set to the config so
future runs honor it. Note: saving only affects the managers you were shown, so
combining -i with --only/--except limits which managers the save can
enable or disable.
The menu requires a real terminal (stdin and stdout must not be piped). In CI or when input is redirected, buum falls back to a numbered prompt.
buum never auto-answers prompts and never times out waiting for input. If a
manager asks for a sudo password or a y/N confirmation, buum surfaces it and
waits. A fully detached run (e.g. cron with no stdin) will block if a manager
prompts — pre-authorize sudo or set non-interactive steps in config.
~/.config/buum/config.yaml overrides the built-ins. See config.example.yaml.