topgrade
Upgrade everything on your system in one command — package managers, language toolchains, editors, and more.
topgrade is a system-wide upgrade tool that detects and runs all the updaters
available on your machine in a single pass. Instead of remembering to run
brew upgrade, apt upgrade, rustup update, pip install --upgrade,
nvim --headless +PlugUpdate, and a dozen other commands separately, topgrade
chains them all together and gives you a unified view of what was updated and
what (if anything) failed.
Features
- Comprehensive detection — automatically discovers what package managers, language toolchains, and tools are installed and runs the appropriate update command for each
- Cross-platform — works on Linux, macOS, and Windows, adapting to whatever is present on each system
- Dozens of supported systems — covers apt, brew, dnf, pacman, nix, cargo, rustup, pip, npm, gem, go, composer, conda, flatpak, snap, and many more
- Editor plugins — updates plugins in Vim/Neovim (vim-plug, lazy.nvim, packer), Emacs (DOOM, Spacemacs), VS Code, and others
- Shell plugins — updates oh-my-zsh, prezto, fisher, and other shell plugin frameworks
- Configurable — disable specific steps, set custom commands, and add your own upgrade scripts via a TOML config file
- Dry-run mode — see what would be run without actually running anything
Installation
cargo install topgrade
Or via your system package manager:
# Debian / Ubuntu (Debian 13+)
apt install topgrade
# Fedora
dnf install topgrade
# macOS
brew install topgrade
# Arch Linux
pacman -S topgrade
# Nix
nix-env -iA nixpkgs.topgradeUsage
# Run all detected upgrade steps
topgrade
# Show what would be run without executing anything
topgrade --dry-run
# Run only specific steps
topgrade --only brew,cargo,rustup
# Disable specific steps for this run
topgrade --disable pip,gem
# Don't ask for confirmation before running
topgrade --yesExample output
topgrade runs each step in sequence and prints a clear header and result for
each one:
─────────────────────────────────── System ────────────────────────────────────
sudo apt update && sudo apt upgrade
...
─────────────────────────────────── Rustup ────────────────────────────────────
rustup update
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: checking for self-update
stable-x86_64-unknown-linux-gnu updated - rustc 1.82.0
─────────────────────────────────── Cargo ─────────────────────────────────────
Running cargo install-update -a
...
─────────────────────────────────── Summary ───────────────────────────────────
✔ System
✔ Rustup
✔ Cargo
✔ Node packages (npm)
✔ Oh My Zsh
✔ Neovim pluginsConfiguration
Topgrade reads from ~/.config/topgrade.toml. Use it to disable noisy steps,
add custom commands, or tweak behaviour:
# Don't ask for sudo password prompt preamble
set_title = false
# Disable steps you don't want
[disable]
# pip3 = true
# gem = true
# Run custom commands as extra steps
[commands]
"Sync dotfiles" = "cd ~/.dotfiles && git pull --rebase"
"Update fonts" = "fc-cache -fv"
# Don't clean up after brew
[brew]
cleanup = false
# Use a specific Python for pip upgrades
[pip3]
use_pip3 = trueSupported steps (selection)
| Category | Examples |
|---|---|
| System package managers | apt, brew, dnf, pacman, zypper, nix, flatpak, snap, winget |
| Language toolchains | rustup, ghcup, go, flutter, opam |
| Language package managers | cargo (installed binaries), pip, npm, gem, composer |
| Shell frameworks | oh-my-zsh, prezto, fisher, zinit |
| Editor plugins | Neovim (lazy.nvim, packer, vim-plug), VS Code, Emacs |
| Miscellaneous | mas (Mac App Store), topgrade itself |
Tips
- Add
topgradeto a weekly cron job orlaunchdtimer to keep everything up to date automatically - Use
--disableto skip steps that require a VPN or that are slow on a particular day - Combine with
--yesin unattended/CI scenarios where interactive prompts are not possible