pkgtui

htop, but for packages

pkgtui

Search, install, remove and upgrade apt, snap, flatpak, Homebrew and MacPorts packages from one dashboard — without memorizing any of their syntaxes. Linux and macOS.

Latest release CI License: MIT

Why pkgtui

The everyday basics of browsing, searching and acting on packages — done once, done well, for every package manager on the machine at once.

●Every backend, one dashboard

A tab per package manager found on the system — apt, snap, flatpak, brew, macports — each with its own state. Search, filter, sort by size, view reverse dependencies.

▲Real live output

Install/remove/upgrade run in a real pseudo-terminal, shown live in a bordered box. sudo prompts and debconf dialogs work exactly as they would from the command line.

▲Upgrade all, with a preview

See exactly which packages will change, security updates called out separately, before you confirm anything.

◆11 built-in themes

From classic Dracula, Nord and Gruvbox to Catppuccin, Tokyo Night and Ubuntu's own palette. Browse them live, no restart needed.

○Rebind every key

Change any shortcut from inside the app, live, with a one-key reset back to defaults if it goes sideways.

●Sources & changelog aware

Add or remove apt PPAs and flatpak remotes, and read a package's changelog before upgrading it, without leaving the TUI.

Beyond wrapping the package managers

None of these tools answers any of this on its own — pkgtui does, from the same dashboard.

Disk cleanup explorerK

Old kernel packages apt's own autoremove deliberately leaves behind, leftover config files from already-removed packages, disabled snap revisions nobody ever revisits, Homebrew's cached downloads, inactive MacPorts versions, unused flatpak runtimes — with total reclaimable space and a direct purge.

Dependency treeW

Manual install or pulled in as a dependency, plus a navigable ├──/└── tree of reverse dependencies with a breadcrumb trail — drill into any of them to ask the same question again.

backend overlapO

Packages installed through more than one backend at once — apt and snap, apt and flatpak, brew and MacPorts — and snaps that haven't been refreshed in 6+ months, using the snap's own on-disk file timestamp, not locale-dependent text.

Unattended-upgrades dashboardA

Whether silent background upgrades are enabled, what the last automatic run actually touched, and when the next one is scheduled — normally visible only by digging through log files by hand.

Install a version, or downgradeV

Pick from every version apt-cache madison knows about across your configured repos — useful right after an upgrade turns out to be the one you wanted to avoid.

RevertV

Snap's own idiomatic undo, from inside the TUI: restores the previous revision's binary and its data/config, not just an older version number.

Metrics dashboardM

Installed packages ranked by disk usage as a bar chart, for every backend that can report one — snap has no size column in "snap list" and brew reports none at all, so pkgtui measures the revision file or the keg itself.

Upgrade conflictsX

Packages a conservative apt-get upgrade would leave behind because it needs to install or remove something else first — distinct from an explicit hold. "Upgrade all" already resolves most of these; this shows which, and why. Also catches packages Ubuntu's phased update rollout is holding back, which neither a plain upgrade nor "Upgrade all" will touch until the rollout reaches this machine.

Action logL

Every privileged action run this session, both backends together, with a timestamp and success/failure — a running record of what you actually did.

In action

pkgtui — apt
pkgtui apt demo

Searching an apt package, its dependency tree (W), and the disk-usage metrics dashboard (M).

pkgtui — snap
pkgtui snap demo

Same flow on snap, including the channel picker (c to cycle stable/candidate/beta/edge).

Installation

No verification/store required — grab the asset that fits and install it locally.

# replace <version> with the latest release number, no leading "v"
curl -fLO https://github.com/padovanl/pkgtui/releases/latest/download/pkgtui_<version>_amd64.deb
sudo apt install ./pkgtui_<version>_amd64.deb
# side-loaded, classic confinement — not on the Snap Store
curl -fLO https://github.com/padovanl/pkgtui/releases/latest/download/pkgtui_<version>_amd64.snap
sudo snap install --dangerous --classic pkgtui_<version>_amd64.snap
curl -fLO https://github.com/padovanl/pkgtui/releases/latest/download/pkgtui_<version>_linux_amd64.tar.gz
tar -xzf pkgtui_<version>_linux_amd64.tar.gz
sudo mv pkgtui /usr/local/bin/
# macOS (Apple Silicon or Intel) and Linuxbrew
brew tap padovanl/pkgtui https://github.com/padovanl/pkgtui
brew install --cask pkgtui
First launch on macOS: a few one-time clicks (Gatekeeper)
  1. Right after brew install --cask pkgtui finishes, macOS reports "pkgtui" Not Opened since the binary isn't notarized — click Done (not Move to Bin), it's already been placed on your PATH. macOS dialog reading pkgtui Not Opened, with Done and Move to Bin buttons
  2. Open System Settings → Privacy & Security, scroll down to the note that "pkgtui" was blocked to protect your Mac, and click Allow Anyway. macOS Privacy and Security settings showing pkgtui was blocked, with an Allow Anyway button
  3. Open a terminal and run pkgtui again — an Open "pkgtui"? prompt appears, click Open Anyway, then enter your password when asked. pkgtui starts normally from then on. macOS dialog asking Open pkgtui, with Move to Bin, Open Anyway and Done buttons

Only needed once, on the very first launch — thanks to @Sk8teb0arder for walking through this and sharing the screenshots.

# without Homebrew: darwin_arm64 on Apple Silicon, darwin_amd64 on Intel
curl -fLO https://github.com/padovanl/pkgtui/releases/latest/download/pkgtui_<version>_darwin_arm64.tar.gz
tar -xzf pkgtui_<version>_darwin_arm64.tar.gz
sudo mv pkgtui /usr/local/bin/
git clone https://github.com/padovanl/pkgtui.git
cd pkgtui
go build -o pkgtui .
sudo mv pkgtui /usr/local/bin/

Full instructions, checksums and arm64 builds on the releases page.

Every key, one dashboard

The complete keybinding reference — also available in-app any time with ?.

KeyAction
← / →Switch backend (one tab per package manager found)
tabSwitch view (Installed / Upgradable / Orphaned* / Search)
/Search the backend's full catalog, then enter to run it
fFilter the packages currently shown, live as you type
↑/↓, j/kNavigate the list (mouse wheel and clicks work too)
enterShow details for the selected package
spaceTag/untag the selected package for a batch action
iInstall the selected package, or all tagged packages
dRemove the selected package, or all tagged packages
uUpgrade the selected package
UUpgrade all packages, with a preview first
SSort the current view by installed size
cCycle the install channel (while confirming a snap install)
HHold/unhold the selected package (apt, flatpak, brew)
CView the selected package's changelog (apt)
PManage third-party sources: PPAs (apt), remotes (flatpak)
sSync the cache (apt-get update, flatpak update --appstream, brew update, port selfupdate; no-op on snap)
KDisk cleanup: old kernels, leftover configs, disabled revisions
WWhy is the selected package installed (manual vs. dependency, reverse-dep tree)
AUnattended-upgrades status (apt)
OBackend overlap: packages installed more than once, stale snaps
VInstall a specific version / downgrade (apt); revert (snap)
MMetrics dashboard: installed packages ranked by disk usage
XUpgrade conflicts: packages a plain upgrade would keep back, or Ubuntu's phased rollout is holding back (apt)
LAction log: what's run this session, and whether it succeeded
y / nConfirm / cancel a pending action
escGo back
,Open settings (theme, keybindings)
?Toggle the in-app help screen
ctrl+lForce a full screen redraw
qQuit