Skip to content

CubWatson/true-mac-updater

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 

Repository files navigation

TrueMacUpdater

License: MIT Platform: macOS Shell: Bash Version

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.

Screen Recording 2026-06-13 at 9 30 48 PM

What it does

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.

Highlights

  • 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 upgrade stops 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 link step collides with files a cask already owns (classically the docker formula vs. the docker-desktop cask), it auto-runs Homebrew's own brew link --overwrite fix 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--notify posts 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_COLOR and non-interactive pipes.

Usage

./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)

Options

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

Requirements

  • 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).

First run

git clone <this repo>
cd true-mac-updater
chmod +x TrueMacUpdater.sh
./TrueMacUpdater.sh --dry-run     # take it for a spin first

Want it even faster? Drop an alias in your ~/.zshrc:

alias update-mac="/path/to/TrueMacUpdater.sh"