nxtupdate - bash - 80x24

user@macos : ~ $ nxtupdate

NxtUpdate

One command finds Homebrew, npm, pip, Cargo, and macOS, then updates them.

NxtUpdate is a universal package updater for macOS. It detects the package managers already installed on your Mac, shows what is outdated, and lets you review and apply those updates from an interactive terminal interface or from direct commands. Missing managers are ignored. There is no config file: install the command and run it.

Install

macOS only. Runtime required: Bun 1.0+.

Both install methods below still use Bun as the runtime, so Bun has to be on your PATH either way. If you have just installed Bun, open a new terminal first. Then confirm the command with nxtupdate --version and start the interface with nxtupdate.

user@macos : ~ $ npm install -g nxtupdate

user@macos : ~ $ bun add -g nxtupdate

What it does

The same five sources are available from the terminal interface and from the CLI. A source is included only when its command is already installed.

  • nxtupdate scan detects Homebrew, Node, Python, Cargo, and macOS. Each hit is printed with its command. Anything that is not installed is listed at the end and left alone.

  • nxtupdate list checks for outdated packages. When more than one manager is present it asks which ones to include, unless you pass --yes. A current manager prints "up to date". A manager that cannot be updated safely is marked skipped, with the reason.

  • nxtupdate update scans first, then asks which managers to update unless you pass --only or --yes. --dry-run previews the work and does not modify anything. --verbose prints package names during the update. When nothing is outdated it reports that everything is already up to date.

  • nxtupdate with no arguments, or nxtupdate tui, opens the full-screen interface. It scans, then the main menu lets you update packages, view the outdated list, or uninstall. You choose the packages to update or remove, and the update screen shows progress for each manager. Arrow keys move, Enter confirms, and Ctrl+C quits. --dry-run and --no-sudo work on tui the same way they do on update.

Homebrew updates formulae and casks. When you select individual casks, they are upgraded with brew upgrade --cask, separate from formulae. Node covers global packages for the active manager among npm, pnpm, Yarn, and Bun. Python uses pip3 or pip. It skips a virtual environment, and it skips an externally managed environment instead of passing --break-system-packages. Cargo can be detected from the cargo command, but listing outdated installed binaries requires cargo-install-update. Install that helper once with cargo install cargo-install-update. macOS system updates go through softwareupdate and may ask for your administrator password. --no-sudo leaves those updates out of a TUI or CLI run. System updates cannot be uninstalled.

--only limits list and update to one manager. It matches the manager name or its command, for example homebrew, npm, pip, cargo, or softwareupdate. Run nxtupdate <command> --help to see the options accepted by one command. The full reference is in the docs.

Example output

nxtupdate scan and nxtupdate list print plain text. The session below shows the real messages for a Mac where Homebrew, npm, pip, and softwareupdate are installed, Cargo is not, and pip reports an externally managed environment. The wget line is only an example of the name current โ†’ latest format. Your package names and versions come from the machine you run it on.

user@macos:~$ nxtupdate scan

๐Ÿ” Scanning for installed package managers...

โœ” Found 4 package manager(s):
 ยท ๐Ÿบ Homebrew (brew)
 ยท ๐Ÿ“ฆ Node (npm) (node)
 ยท ๐Ÿ Python (pip) (pip3) โ€” skipped: externally managed (PEP 668); use Homebrew, pipx, or a virtual environment
 ยท ๐ŸŽ macOS System (softwareupdate)

Not installed: Rust (Cargo)

nxtupdate list --yes skips the manager picker and prints one block per manager. A skipped manager keeps the reason from detection. The total line appears only when at least one package is outdated.

user@macos:~$ nxtupdate list --yes

๐Ÿ“‹ Checking for outdated packages...

๐Ÿบ Homebrew (1 outdated)
 ยท wget 1.21.3 โ†’ 1.25.0

๐Ÿ“ฆ Node (npm) โ€” up to date

๐Ÿ Python (pip) โ€” skipped: externally managed (PEP 668); use Homebrew, pipx, or a virtual environment

๐ŸŽ macOS System โ€” up to date

 Total: 1 outdated package(s)

A dry run uses the same scan, then stops before any upgrade. nxtupdate update --dry-run prints "Dry run mode โ€” nothing will be modified", and finishes with "Dry run complete. Run without --dry-run to apply updates." If the scan finds nothing to do, the update command prints "Everything is already up to date!"

Questions

Which computers can run it?

macOS only. The runtime is Bun 1.0 or later. npm install -g nxtupdate and bun add -g nxtupdate both need that runtime, because the published package executes with Bun. After installing Bun, open a new terminal so the updated PATH is loaded, then run nxtupdate --version.

What if a package manager is missing?

It is ignored. nxtupdate scan prints the managers it found and a "Not installed" line for the rest. NxtUpdate does not install Homebrew, Node, Python, Cargo, or any other manager for you.

Will it change a Python virtualenv or system Python?

No. Inside a virtual environment, pip is not used. If pip reports an externally managed environment (PEP 668), Python is shown as skipped and NxtUpdate will not modify it with --break-system-packages. The skip text points to Homebrew, pipx, or a virtual environment.

How do I update one manager, or preview first?

nxtupdate list --only homebrew and nxtupdate update --only npm limit the run. --dry-run on update or tui shows what would change and writes nothing. --no-sudo skips macOS updates that need an administrator password. --yes skips confirmation and the interactive manager picker. --verbose on update prints the package names being updated.

Can packages be removed?

The terminal interface has an uninstall action. You review the installed packages before anything is removed. Homebrew, Node, Python, and Cargo can remove packages they installed. macOS system updates cannot be uninstalled.

What does Cargo need beyond the cargo command?

Detection only needs cargo on your PATH. Listing and updating installed binaries uses cargo-install-update. Without that helper, Cargo has nothing to list. Install it once: cargo install cargo-install-update.