macOS-only CLI that runs cli update commands in batch from a single TOML config file. Use it to run update commands of various globally installed clis you have such as brew,npm,pnpm,vp etc
upsft reads a TOML config listing your tools (Homebrew, rustup, pnpm, etc.) and their update commands, then runs them sequentially via direct shell injection. No more hunting down each tool's update incantation.
I know you will tell me about bash scripts. I did that too. It felt verbose. I am not found of shell scripts for such things, i like them as in project scripts. ClI for me was a cleaner approach, feature addible. There is a config file where you can control the cli behaviour.
| Method | Command |
|---|---|
| Homebrew | brew install devharshthakur/tap/upsft |
| Cargo | cargo install upsft |
Important
upsft is macOS-only. It is tested only on macOS.
upsft [OPTIONS]Run with no flags to execute all dependency updates in order.
| Flag | Description |
|---|---|
-l, --list |
List all managed dependencies and their commands |
--init |
Create default config at ~/.config/upsft/config.toml |
-c, --config <path> |
Use a custom config file path |
-h, --help |
Print help |
-V, --version |
Print version |
Note
--init and --list are mutually exclusive. -l/--list displays the number of dependencies followed by one name = "command" line each.
Default location: ~/.config/upsft/config.toml
Override with -c <path>. Use --init to scaffold a blank config at the default path (or the custom path given with -c).
[deps]
brew = "brew update && brew upgrade && brew cleanup"
rustup = "rustup update"
pnpm = "pnpm self-update"| Section | Required | Description |
|---|---|---|
[deps] |
Yes | Table of name = "shell command" pairs |
| Rule | Details |
|---|---|
| Dep name | Non-empty, alphanumeric ASCII + _ / . / - |
| Dep command | Non-empty string |
[deps] table |
Required — config fails if missing |
| Execution order | Preserves insertion order (TOML preserve_order) |
| Shell | Each value runs via sh -c with no sanitization |
Warning
Dep commands are passed directly to shell with no sanitization. Only use config files you control. Never point -c at untrusted input — this is a shell injection risk by design.
| Code | Meaning |
|---|---|
| 0 | All deps updated successfully |
| 1 | Config error or a dep command failed |
Note
A non-zero exit from any single dep command fails the whole run. Subsequent deps are still executed.
MIT — see LICENSE.