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 | ✓ | ✓ | ✓ | — |
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.