updt
updt is a Rust command-line tool that checks and runs updates across your development package managers from one interactive workflow.
Instead of remembering separate update commands for Homebrew, npm, cargo, rustup, Scoop, paru, pacman, DNF, Flatpak, and Termux pkg, run updt, review what has updates, choose the targets you want, and let the original package managers do the work.
Project Links
- Crates.io package: https://crates.io/crates/updt
- API documentation: https://docs.rs/updt
- GitHub repository: https://github.com/haohaaaa/updt
What It Does
updt answers one question quickly: which of my system and developer tools can be upgraded right now?
It checks supported targets in parallel, shows the results in a terminal selector, and upgrades only the targets you confirm. It does not replace any package manager or maintain its own package database; it orchestrates the tools already installed on your machine.
Why Use It
- One command for routine update checks across multiple ecosystems.
- Interactive selection before anything is upgraded.
- Direct target updates for scripts or muscle memory, such as
updt update npm cargo. - Platform-aware defaults for macOS, Windows, Arch Linux, Fedora Asahi Remix, and Termux.
- Small Rust binary with no shell script bootstrap step.
Quick Start
Install the latest release from crates.io:
Run the interactive update flow:
Update specific targets without opening the selector:
Install fish completions:
Features
- Parallel checks across enabled targets for faster detection.
- Interactive terminal UI for selecting which targets to upgrade.
- Direct non-interactive updates with explicit target names.
- OS profile policy that only enables targets that make sense for the current platform.
- Fish shell completion installer.
- Uses existing package manager commands and forwards their output.
Supported Update Targets
| Target | What it updates | Notes |
|---|---|---|
brew |
Homebrew formulae and casks | macOS profile |
npm |
npm global packages | Requires npm |
cargo |
cargo-installed crates | Requires cargo-install-update |
rustup |
Rust toolchains | Requires rustup |
scoop |
Scoop packages | Windows profile |
paru |
AUR packages | Arch Linux profile |
dnf |
Fedora system packages | Fedora Asahi Remix profile |
flatpak |
Flatpak apps | Arch Linux profile |
pacman |
pacman packages | Arch Linux profile |
pkg |
Termux packages | Termux profile |
Windows system package managers winget and choco are intentionally unsupported.
Platform Defaults
updt enables targets by OS profile:
| Profile | Enabled targets |
|---|---|
| macOS | brew, npm, cargo, rustup |
| Windows | npm, cargo, rustup, scoop |
| Arch Linux | npm, cargo, rustup, paru, pacman, flatpak |
| Fedora Asahi Remix | dnf, npm, cargo, rustup, flatpak |
| Termux | pkg, npm, cargo |
| Other systems | None |
Unsupported or missing commands are skipped during checks.
Requirements
Install the package managers you want updt to control. For cargo package checks, install cargo-update so cargo-install-update is available:
Target-specific notes:
cargochecks requirecargo-install-updateinPATH.cargo-binstallis recommended for faster binary installation of cargo-managed tools, except on Android (Termux).dnfchecks require support fordnf check-update --json(DNF5).dnfupgrades refresh repository metadata with--refreshso the elevated command sees current updates.dnfupgrades may usesudoorpkexec, depending on terminal focus and desktop session state.- Termux
pkgchecks refresh repository metadata withpkg updateand inspect candidates withapt list --upgradable. pacmanupgrades may usesudoorpkexec, depending on terminal focus and desktop session state.
Interactive Flow
Running updt starts a three-stage workflow:
- Check upgrade candidates.
- Select targets to upgrade.
- Run upgrades for selected targets.
The check stage runs in parallel across enabled targets. The upgrade stage runs the underlying package manager commands and forwards their output.
On Windows, Scoop's rustup package update and cargo's updt self-update are deferred until all other updates finish. A single foreground window waits for the current updt process to exit, then updates Scoop's rustup package (preserving local/global scope), followed by updt itself. The main summary lists these as pending; their final results appear in the separate window. Rust toolchain updates (rustup update --no-self-update) still run during the normal upgrade stage.
For other Scoop updates blocked by running processes, Kill & Retry stops processes running from the package's installation directory before retrying. If that includes the current updt process, it skips the package without stopping any processes and prints a command to run after updt exits. If stopping processes fails, the package is reported as failed without retrying. Deferred Scoop updates report any remaining process blockers in the final update window without stopping them automatically.
Selector controls:
| Key | Action |
|---|---|
Up / Down |
Move cursor |
Space |
Toggle selected target |
Enter |
Confirm selection |
q / Esc |
Quit selection |
CLI Reference
Two interactive interfaces
The original interface and the embedded terminal interface have separate entry points:
| Command | Interface |
|---|---|
updt |
Original TUI: checks, target selection and confirmation, then command output |
updt update npm cargo |
Original interface for the requested targets |
updt terminal |
New interface: real target status on the left, checks, confirmation and updates inside the terminal on the right |
updt terminal npm cargo |
New interface for the requested targets; updates the selected targets that have updates |
Without explicit targets, the new interface asks which targets to update in the right-hand terminal. Answer package-manager prompts there as well. Check commands stream their output while retaining separate captured output for parsing. Update order and deferred Windows updates use the same business logic as the original interface.
On Windows, deferred rustup and updt updates wait for the outer terminal interface to exit, so its executable no longer holds the installation directory open. Once the workflow finishes, press Enter or Esc to close the interface and allow those updates to run.
The new interface uses a native PTY (ConPTY on Windows), with ANSI colors, Unicode, terminal resizing, keyboard input, paste, and up to 2,000 lines of scrollback. The standalone validation modes remain available:
--demo runs a small color/progress/input demonstration without executing package-manager commands. --shell opens PowerShell on Windows or $SHELL (falling back to /bin/sh) on Unix without starting the update workflow. Commands you type run in that shell.
- Type directly in the terminal;
Ctrl+Cis forwarded to the child terminal. - Use
Shift+PageUp/Shift+PageDownto review output. Typing returns to live output. - Use
exitto end the shell, thenEnterorEscto return. F10asks for confirmation before ending a running terminal; it closes a finished terminal immediately.
The new interface currently has one shared terminal pane; the sidebar shows status rather than selecting individual terminal sessions. Mouse forwarding and full compatibility with arbitrary terminal applications are not yet validated.
Show the installed version:
Run the default interactive workflow:
Update selected targets without the interactive selector:
Install fish completion to ~/.config/fish/completions/updt.fish:
Development
Build the project:
Run tests:
Run formatting and lint checks before opening a pull request:
Contributing
Issues and pull requests are welcome. Please include the operating system, the target package manager, and the command output when reporting an update detection or upgrade problem.
See CONTRIBUTING.md for the development workflow and SECURITY.md for responsible vulnerability reporting.
License
This project is licensed under the MIT License.