The universal Linux package manager updater.
One command. One password. Every package manager updated.
Important
YOU HAVE TO UPDATE MANUALLY! I broke the update script, so you have to update manually this update. In this version it's functioning again. Sorry!
Important
Shepherd is now BAA! The project has been renamed. Please update your software to the latest version: all commands now start with baa instead of shepherd.
curl -sSfL https://raw.githubusercontent.com/jstreitb/baa/main/install.sh | bashSecurity Note: You can verify the installer script before running it by downloading it first, reading it, or checking its checksum against the release assets.
To update BAA itself to the latest version, simply run:
baa --updateTo uninstall BAA from your system, run:
baa --uninstallOr build from source:
git clone https://github.com/jstreitb/baa.git
cd baa && make build
sudo mv baa /usr/local/bin/$ baa
- Detects installed package managers automatically
- Asks for your sudo password once (masked, secure)
- Updates everything sequentially with a live animated TUI
- Shows a summary of what succeeded and failed
That's it. No config files, no complicated setup.
| Flag | Description |
|---|---|
--update |
Updates baa to the latest version |
--uninstall |
Uninstalls baa from your system |
--credits |
Shows the credits and exit |
--version |
Prints the current version |
--help |
Shows the help message |
| Manager | Detected via | Sudo | Non-Interactive Flags |
|---|---|---|---|
| apt | apt-get |
β | DEBIAN_FRONTEND=noninteractive, --force-confold |
| pacman | pacman |
β | --noconfirm |
| flatpak | flatpak |
β | -y --noninteractive |
| snap | snap |
β | β |
Adding a new manager? It's a single file. See CONTRIBUTING.md.
|
Probes Password stored as Non-interactive flags handle everything. No "Press Y to continue" interruptions. |
If a manager needs user input (e.g. a dpkg config prompt), BAA suspends the TUI and drops you into the raw terminal. Resume is automatic. Catppuccin Macchiato theme, ASCII sheep animation, live command output, styled summary screen. Single static binary. No runtime dependencies. ~3 MB. |
BAA takes security seriously:
| Measure | Implementation |
|---|---|
| Password storage | []byte β never a Go string |
| Memory cleanup | Explicit zeroing with for i := range pw { pw[i] = 0 } |
| Password delivery | Piped via stdin to sudo -S |
| Process args | Password never appears in CLI arguments |
| Environment | Env vars passed through sudo -- env to reach child processes |
| Goroutine copies | Each copy is independently zeroed after use |
baa/
βββ cmd/baa/main.go # Entry point
βββ internal/
β βββ ui/ # Bubbletea TUI (model, views, styles, components)
β βββ pkgmanager/ # PackageManager interface + implementations
β βββ utils/ # Secure sudo execution, error sanitization
βββ install.sh # One-line installer
βββ .goreleaser.yml # Release automation
βββ Makefile
Built with the Charmbracelet ecosystem:
- Bubble Tea β TUI framework
- Lip Gloss β Styling
- Bubbles β Components
Contributions are welcome! Please read the Contributing Guide before getting started.
"If you can't beat them, join them."
This project was architected and developed with the support of AI Assistance.
MIT β go build something great.
