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.topgrade

Usage

# 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 --yes

Example 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 plugins

Configuration

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 = true

Supported steps (selection)

CategoryExamples
System package managersapt, brew, dnf, pacman, zypper, nix, flatpak, snap, winget
Language toolchainsrustup, ghcup, go, flutter, opam
Language package managerscargo (installed binaries), pip, npm, gem, composer
Shell frameworksoh-my-zsh, prezto, fisher, zinit
Editor pluginsNeovim (lazy.nvim, packer, vim-plug), VS Code, Emacs
Miscellaneousmas (Mac App Store), topgrade itself

Tips

  • Add topgrade to a weekly cron job or launchd timer to keep everything up to date automatically
  • Use --disable to skip steps that require a VPN or that are slow on a particular day
  • Combine with --yes in unattended/CI scenarios where interactive prompts are not possible