MacAppUpdate scans /Applications, matches every app to Homebrew, Sparkle, or the App Store, and installs updates with a strict Team-ID safety check. Local-first, aggregate telemetry only.
macOS 14+ · Universal (Apple Silicon & Intel) · Self-signed alpha, notarization next
Homebrew Cask, Sparkle appcasts, Mac App Store, .pkg installers — all routed through one classifier. See exactly which source resolved each app.
Every download is verified: SHA-256 match, codesign valid, and — the one nobody else does — Team ID identical to the currently installed copy. Server compromises abort loudly.
FileManager.replaceItem with a same-volume staging dir. Interrupt at any point and the app on disk stays working. Old version kept for 7 days.
No account. No bundle IDs sent by default. No auto-install without your click. All events grep-able as JSON Lines under ~/.local/state.
"Outdated & idle" filter — batch update everything you're not currently using. Bucket chips split updates into major / minor / patch.
Casks that need custom install scripts hand off to brew install --cask with one click. Best of both worlds.
| MacAppUpdate | Manual clicking | brew upgrade --cask | App Store only | |
|---|---|---|---|---|
| Homebrew casks | ✓ | — | ✓ | — |
| Sparkle appcasts | ✓ | manual | — | — |
| App Store apps | reports | ✓ | — | ✓ |
| .pkg installers | ✓ (with admin) | manual | partial | — |
| Team-ID safety check | ✓ | — | — | Apple |
| Atomic install | ✓ | — | varies | ✓ |
| Runs on your Mac, no account | ✓ | ✓ | ✓ | — |
Loading release history…
No, not by default. The list is stored locally as JSON Lines. Bundle IDs go to Sentry (only) when an update fails, so we can fix the underlying bug — you can turn that off in Settings > Advanced. Aggregate counts (outcome, source, error class) go to TelemetryDeck, always anonymous.
brew upgrade --cask?brew handles ~70% of Mac apps and does it well. What it doesn't do: check whether the download's Team ID matches your installed copy (i.e. detect a compromised CDN), fall back to Sparkle appcasts for the 20% brew doesn't cover, or refuse safely when a bundle ID unexpectedly changes. We use brew as a fallback and add the safety layer.
Apple doesn't allow it: MAS binaries only download from Apple's CDN with device attestation, the app is root-owned, and overwriting the bundle breaks the App Store receipt (kills in-app purchases and subscriptions). We surface the outstanding update and one-click into the App Store's Updates page. If you install the free mas CLI, we can trigger the upgrade directly.
The downloaded update is signed by a different Apple Developer than the copy already on your Mac. This is either (a) the vendor legitimately changed their signing identity — rare — or (b) the update server was compromised. We abort the install unconditionally in both cases. You can grant an exception per-app in overrides.json if it's (a).
Only for apps whose bundle in /Applications is owned by root (usually pkg-installed: Google Drive, Nextcloud, Microsoft apps). For those, macOS shows its standard admin password prompt once per install. Regular DMG-installed apps update without any prompt.
Alpha is free. Post-1.0 pricing will be announced separately — early adopters get grandfathered.