A unified TUI for keeping every package manager up to date.
UniPack lets you browse, search, upgrade, and remove packages across pip, npm, pnpm, bun, cargo, apt, pacman, AUR, rpm, flatpak, snap, and brew β all from one terminal UI. It is focused on keeping your system up to date, not bootstrapping new installs: use your package manager of choice for first-time installs, then let UniPack handle the ongoing updates. It remembers your package lists between runs so reopening feels quicker, and it shows when updates are available where the underlying tools support it.
When pacman is available (Arch and other pacman-based distros), global Python libraries belong in python-* packages (official repos and often the AUR under the same naming). UniPackβs pip tab then lists those python-* installs, runs upgrades/removes through sudo pacman when no AUR helper is present, and through yay or paru (whichever is installed) when you have one, so behaviour matches distro conventions instead of pip install --user / breaking system Python.
- Finds which supported package managers are installed
- One list per tool β switch with Tab / Shift+Tab
- Live search β filter as you type (
/), and pressCtrl+fwhile searching to toggle normal/fuzzy matching - Upgrade and remove without leaving the app (installing new packages is intentionally out of scope)
Ctrl+uβ run a backend-native full-system update on the active tab (withy/nconfirmation, where supported)oβ show only packages with updates, or everything, for the current manageraβ see updates from all managers at once (Space toggles a row,uupgrades what you selected with full-system fallback where eligible,a/dselect all or none, Shift+letter quickly toggles rows for managers whose name starts with that letter)- Distro name in the header on Linux
- TokyoNight-style colors
- Twelve sources: pip, npm, pnpm, bun, cargo, brew, apt, pacman, AUR (yay and/or paru β either is enough), rpm, flatpak, snap
- Optional sudo before the TUI β on an interactive terminal, when a backend that needs elevation is present, UniPack can ask to run
sudo -vup front so later upgrades are not blocked waiting for a password (you can decline and runsudo -vyourself instead)
| Manager | Platform | Notes |
|---|---|---|
pip |
Linux / macOS | Elsewhere: pip3 / PyPI. If pacman exists: installed python-* packages (repo + AUR); the list shows the suffix after python-; upgrades use yay/paru if available, otherwise sudo pacman |
npm |
Linux / macOS | Global packages |
pnpm |
Linux / macOS | Global packages |
bun |
Linux / macOS | Global packages |
cargo |
Linux / macOS | Installed crates |
brew |
macOS / Linux | Homebrew |
apt |
Debian/Ubuntu | Installed packages |
pacman |
Arch Linux | Official repos |
aur |
Arch Linux | AUR when yay or paru is on PATH (either alone registers the tab) |
rpm |
Fedora/RHEL | |
flatpak |
Linux | Flathub apps |
snap |
Linux |
cargo install unipackgit clone https://github.com/firstp1ck/unipack
cd unipack
cargo build --release
sudo cp target/release/unipack /usr/local/bin/This repository includes PKGBUILD for building and installing with Archβs makepkg. It produces the unipack-git package (provides unipack) and pulls the latest sources during the build.
git clone https://github.com/firstp1ck/unipack
cd unipack
makepkg -siYou need the base-devel group (for makepkg) and network access so the PKGBUILD can clone the upstream tree it builds from.
- Rust β current stable toolchain (install or update via rustup)
- Any of the package managers above that you want UniPack to control
- Sudo for privileged backends β UniPack runs upgrades/removes non-interactively, so a live sudo session avoids password prompts mid-action. On a normal terminal, when something like
apt,pacman,aur,rpm, orsnapis detected (and for the pip tab whenpacmanis present), startup may offersudo -vbefore the TUI appears ([y/N]; declining is fine). You can also authenticate whenever you like:
sudo -vIf you accept the startup prompt and sudo -v fails, UniPack exits with a non-zero status so scripts notice the failure.
| Key | Action |
|---|---|
β / k |
Move up (wraps) |
β / j |
Move down (wraps) |
Ctrl+d |
Page down the list |
/ |
Toggle search mode |
Ctrl+f |
Toggle normal/fuzzy search mode (while search is active) |
o |
Toggle upgradable-only vs all packages |
a |
Open all upgradables overlay (Esc / q to close) |
u |
Upgrade selected row (main list) or selected rows (overlay, with full-system fallback where eligible) |
Ctrl+u |
Confirm and run full-system update for the active backend (supported: apt, pacman, aur, flatpak, snap) |
Del |
Remove selected package |
Tab / Shift+Tab |
Next / previous package manager |
r |
Refresh lists and pending-update counts |
Esc |
Leave search, or quit when not searching |
q |
Quit (only when not in search; in search, q is part of the query) |
# Launch UniPack (optional sudo warm-up prompt may appear first)
unipack
# Show help (stdout, no TUI; includes the privilege note)
unipack --help
unipack -hTo upgrade: select a row and press u, or press a for the all-managers overlay, tick rows with Space, and press u.
To run a full-system update (supported backends): press Ctrl+u on the active tab, then confirm with y.
To remove: select a row and press Del.
To install a new package: use your package manager directly (for example sudo pacman -S python-<name>, yay -S python-<name> / paru -S python-<name> when using pacman-based repos/AUR, sudo apt install <pkg>, or pip install --user <pkg> when not using that layout). UniPack intentionally does not install new packages β it is focused on updates.
- Ratatui β TUI framework
- Crossterm β terminal backend
- Tokio β async runtime
- Serde β reading structured output from some tools
