{"id":49385903,"url":"https://github.com/jstreitb/baa","last_synced_at":"2026-04-28T09:14:39.358Z","repository":{"id":352244324,"uuid":"1214405739","full_name":"jstreitb/baa","owner":"jstreitb","description":"BAA: The cozy TUI that herds your package managers. Unified updates for apt, pacman, snap \u0026 flatpak... 🐑","archived":false,"fork":false,"pushed_at":"2026-04-27T11:19:03.000Z","size":14178,"stargazers_count":2,"open_issues_count":6,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-27T13:13:01.873Z","etag":null,"topics":["apt","automation","bubbletea","charmbracelet","cli","developer-tools","flatpak","go","golang","linux","opensource","package-manager","pacman","security","snap","system-update","terminal-app","terminal-ui","tui"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jstreitb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-18T14:32:16.000Z","updated_at":"2026-04-27T11:19:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jstreitb/baa","commit_stats":null,"previous_names":["jstreitb/shepherd","jstreitb/baa"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/jstreitb/baa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jstreitb%2Fbaa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jstreitb%2Fbaa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jstreitb%2Fbaa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jstreitb%2Fbaa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jstreitb","download_url":"https://codeload.github.com/jstreitb/baa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jstreitb%2Fbaa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32373900,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-27T20:07:02.737Z","status":"online","status_checked_at":"2026-04-28T02:00:07.250Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apt","automation","bubbletea","charmbracelet","cli","developer-tools","flatpak","go","golang","linux","opensource","package-manager","pacman","security","snap","system-update","terminal-app","terminal-ui","tui"],"created_at":"2026-04-28T09:14:36.863Z","updated_at":"2026-04-28T09:14:39.345Z","avatar_url":"https://github.com/jstreitb.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# 🐑 BAA 🐑\n\n**The universal Linux package manager updater.**\n\nOne command. One password. Every package manager updated.\n\n⭐ **If you find BAA useful, consider giving it a star!**\n\u003cbr\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003cbr\u003e\n\u003c/div\u003e\n\n\u003e [!NOTE]\n\u003e **From Weekend Project to Clean Code:** BAA was originally planned as a quick weekend project, which resulted in the old codebase becoming absolute spaghetti code. To ensure maintainability, security, and testability, we have completely rewritten the application from scratch with a modular, enterprise-ready architecture.\n\n\u003cdiv align=\"center\"\u003e\n\u003cbr\u003e\n\n[![Release](https://img.shields.io/github/v/release/jstreitb/baa?style=flat-square\u0026color=b7bdf8\u0026label=Release)](https://github.com/jstreitb/baa/releases)\n[![License](https://img.shields.io/badge/License-MIT-a6da95?style=flat-square)](LICENSE)\n[![Go](https://img.shields.io/badge/Go-1.21+-8aadf4?style=flat-square\u0026logo=go\u0026logoColor=white)](https://go.dev)\n[![Stars](https://img.shields.io/github/stars/jstreitb/baa?style=flat-square\u0026color=eed49f)](https://github.com/jstreitb/baa/stargazers)\n\n\u003cbr\u003e\n\n\u003cimg width=\"1200\" height=\"600\" alt=\"demo\" src=\"https://github.com/user-attachments/assets/12710854-d638-436b-9de4-d6d9ba3cfab7\" /\u003e\n\n\u003cbr\u003e\n\u003c/div\u003e\n\n---\n\n## Quick Install\n\n```bash\ncurl -sSfL https://raw.githubusercontent.com/jstreitb/baa/main/install.sh | bash\n```\n\n\u003e **Security Note:** You can verify the installer script before running it by downloading it first, reading it, or checking its checksum against the release assets.\n\nTo update BAA itself to the latest version, simply run:\n```bash\nbaa --update\n```\n\nTo uninstall BAA from your system, run:\n```bash\nbaa --uninstall\n```\n\nOr build from source:\n\n```bash\ngit clone https://github.com/jstreitb/baa.git\ncd baa \u0026\u0026 make build\nsudo mv baa /usr/local/bin/\n```\n\n## How It Works\n\n```\n$ baa\n```\n\n1. **Detects** installed package managers automatically\n2. **Asks** for your sudo password once (masked, secure)\n3. **Updates** everything sequentially with a live animated TUI\n4. **Shows** a summary of what succeeded and failed\n\nThat's it. No config files, no complicated setup.\n\n## Command-Line Flags\n\n| Flag | Description |\n|------|-------------|\n| `--update` | Updates baa to the latest version |\n| `--uninstall` | Uninstalls baa from your system |\n| `--detect` | Shows detected package managers and exit |\n| `--credits` | Shows the credits and exit |\n| `--version` | Prints the current version |\n| `--help` | Shows the help message |\n\n## Supported Package Managers\n\n| Manager | Detected via | Sudo | Non-Interactive Flags |\n|---------|-------------|------|-----------------------|\n| **apt** | `apt-get` | ✓ | `DEBIAN_FRONTEND=noninteractive`, `--force-confold` |\n| **dnf** | `dnf` | ✓ | `-y` |\n| **zypper** | `zypper` | ✓ | `--non-interactive`, `up` |\n| **pacman** | `pacman` | ✓ | `--noconfirm` |\n| **nix** | `nix-env` | ✗ | `-u` |\n| **brew** | `brew` | ✗ | `upgrade` |\n| **flatpak** | `flatpak` | ✗ | `-y --noninteractive` |\n| **snap** | `snap` | ✓ | — |\n\n\u003e **Adding a new manager?** It's a single file. See [CONTRIBUTING.md](CONTRIBUTING.md#adding-a-new-package-manager).\n\n## Features\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 🔍 Auto-Detection\nProbes `$PATH` for every supported package manager — no configuration needed.\n\n### 🔒 Secure by Design\nPassword stored as `[]byte`, zeroed after use, delivered via `stdin` pipe. Never appears in process args or logs.\n\n### 🤖 Fully Autonomous\nNon-interactive flags handle everything. No \"Press Y to continue\" interruptions.\n\n\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\n\n### 🛟 Interactive Fallback\nIf 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.\n\n### 🎨 Beautiful TUI\nCatppuccin Macchiato theme, ASCII sheep animation, live command output, styled summary screen.\n\n### ⚡ Fast \u0026 Lightweight\nSingle static binary. No runtime dependencies. ~3 MB.\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n## Security\n\nBAA takes security seriously:\n\n| Measure | Implementation |\n|---------|---------------|\n| **Password storage** | `[]byte` — never a Go `string` |\n| **Memory cleanup** | Explicit zeroing with `for i := range pw { pw[i] = 0 }` |\n| **Password delivery** | Piped via `stdin` to `sudo -S` |\n| **Process args** | Password never appears in CLI arguments |\n| **Environment** | Env vars passed through `sudo -- env` to reach child processes |\n| **Goroutine copies** | Each copy is independently zeroed after use |\n\n## Architecture\n\n```\nbaa/\n├── cmd/baa/main.go           # Entry point\n├── internal/\n│   ├── ui/                        # Bubbletea TUI (model, views, styles, components)\n│   ├── pkgmanager/                # PackageManager interface + implementations\n│   └── utils/                     # Secure sudo execution, error sanitization\n├── install.sh                     # One-line installer\n├── .goreleaser.yml                # Release automation\n└── Makefile\n```\n\nBuilt with the [Charmbracelet](https://charm.sh/) ecosystem:\n- [Bubble Tea](https://github.com/charmbracelet/bubbletea) — TUI framework\n- [Lip Gloss](https://github.com/charmbracelet/lipgloss) — Styling\n- [Bubbles](https://github.com/charmbracelet/bubbles) — Components\n\n\u003cdiv align=\"center\"\u003e\n\n### 🐑 The Flock\n\nBAA is a community-driven project. A huge thank you to the amazing people who help guide the herd!\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003ca href=\"https://github.com/jstreitb/baa/graphs/contributors\"\u003e\n\u003cimg src=\"https://contrib.rocks/image?repo=jstreitb/baa\u0026max_age=86400\" alt=\"Contributors\" \u0026max_age=86400\u0026v=1/\u003e\n\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\n## Contributing\n\nContributions are welcome! Please read the [Contributing Guide](CONTRIBUTING.md) before getting started.\n \n## AI Assistance\n\n\u003ci\u003e\"If you can't beat them, join them.\"\u003c/i\u003e\u003cbr\u003e\n\u003cp\u003eThis project was architected and developed with the support of \u003cb\u003eAI Assistance\u003c/b\u003e.\n\u003c/p\u003e\n\n## License\n\n[MIT](LICENSE) — go build something great.\n\n\u003cbr\u003e\n\u003chr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\u003cbr\u003e\n\u003csub\u003eMade with 🐑 by \u003ca href=\"https://github.com/jstreitb\"\u003ejstreitb\u003c/a\u003e and the flock.\u003c/sub\u003e\n\u003cbr\u003e\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjstreitb%2Fbaa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjstreitb%2Fbaa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjstreitb%2Fbaa/lists"}