One command to update your entire Mac — Homebrew, the App Store, and macOS itself.
Built for Apple Silicon (M-series, arm64).
./TrueMacUpdater.sh
That's it. The script walks through three stages and gives you a clean summary at the end.
| Stage | Tool | Action |
|---|---|---|
| 1 · Homebrew | brew |
Updates the catalog, upgrades formulae and casks, then cleans up old versions |
| 2 · App Store | mas |
Upgrades every app you own from the Mac App Store (asks for your password — mas 7 installs as root) |
| 3 · macOS | softwareupdate |
Installs system & security updates (asks for your password) |
It's resilient: if one stage hits a problem, the others still run, and the summary tells you honestly what succeeded and what didn't.
- Safe by default — shows you what's outdated (and whether you have the disk space for it) and asks before changing anything.
- Live progress — packages and apps upgrade one at a time with an
[n/N]counter, and a status area pinned to the bottom of the terminal keeps all three stages in view while their output scrolls above. --dry-run— preview everything without touching your system.- Self-healing — installs
mas(and offers to install Homebrew) if they're missing. - No more skipped taps — auto-trusts packages you already have installed from third-party Homebrew taps, so
brew upgradestops silently skipping them (Homebrew 6+). New, not-yet-installed packages still prompt you; opt out with--no-trust. - Recovers from link conflicts — when a formula's
brew linkstep collides with files a cask already owns (classically thedockerformula vs. thedocker-desktopcask), it auto-runs Homebrew's ownbrew link --overwritefix instead of failing the whole Homebrew stage. A genuine upgrade failure still reports as failed. - Sudo kept alive — type your password once; no mid-run interruptions.
- Done notification —
--notifyposts a macOS notification when the run finishes, so you can tab away. - Honest summary — per-stage and per-item pass/fail, counts, elapsed time, and a distinct "staged" state for macOS updates that only finish installing on restart. App Store updates are verified against the app bundle's version on disk, not just
mas's exit code. - Full transcript saved to
~/Library/Logs/TrueMacUpdater/. - Color-aware — respects
NO_COLORand non-interactive pipes.
./TrueMacUpdater.sh # interactive, does everything
./TrueMacUpdater.sh --dry-run # preview only, change nothing
./TrueMacUpdater.sh -y -r # fully unattended, reboot if macOS needs it
./TrueMacUpdater.sh --skip-system # just Homebrew + App Store (no sudo needed)| Flag | Description |
|---|---|
-y, --yes |
Don't ask for confirmation; assume yes |
-n, --dry-run |
Show what would happen, change nothing |
-r, --restart |
Reboot automatically if macOS updates require it |
--skip-brew |
Skip the Homebrew stage |
--skip-appstore |
Skip the App Store stage |
--skip-system |
Skip the macOS system-update stage |
--no-cleanup |
Don't run brew cleanup |
--no-trust |
Don't auto-trust installed packages from third-party taps |
--notify |
Post a macOS notification when the run finishes |
--no-color |
Disable colored output |
--no-log |
Don't write a transcript |
-h, --help |
Show help |
-v, --version |
Show version |
- An Apple Silicon Mac (M1/M2/M3/M4…) running macOS.
- Homebrew — the script offers to install it if it's missing.
mas— installed automatically via Homebrew if needed.- An App Store account you're signed in to (for App Store updates).
git clone <this repo>
cd true-mac-updater
chmod +x TrueMacUpdater.sh
./TrueMacUpdater.sh --dry-run # take it for a spin firstWant it even faster? Drop an alias in your ~/.zshrc:
alias update-mac="/path/to/TrueMacUpdater.sh"