π Stop Tahoe Update
A community-led effort to delay, suppress, and safely block unwanted macOS upgrades (e.g. Sequoia β Tahoe).
Safe β’ Transparent β’ Community-driven
Everything here is reversible and off by default.
βοΈ Why This Project Exists
Apple allows deferring major macOS upgrades (like Sequoia β Tahoe) for up to 90 days using MDM or configuration profiles.
Beyond that, users are on their own β exposed to constant upgrade prompts, badge counts, and surprise downloads.
Stop Tahoe Update exists to change that responsibly.
Weβre building a community-maintained source of truth for users who want to stay on stable macOS versions without unsafe hacks.
π― Project Goals
β Immediate Goals
- Provide
.mobileconfigprofiles for 30 / 60 / 90-day deferrals - Include safe install / uninstall / status scripts
- Establish a safety-first governance model
- Build and maintain a living documentation hub
π§ Community Research Goals
- π« Prevent βInstall Tonightβ or βInstall Nowβ prompts
- π Suppress Settings app badge counts for new macOS upgrades
- π‘οΈ Detect & optionally remove unwanted
Install macOS*.appdownloads - π Explore early network-detection of upgrade payloads (opt-in)
- π§© Track new Apple deferral keys & declarative MDM behavior
All experimental features are dry-run by default.
No background services, no silent system modifications.
ποΈ Repository Structure
stop-tahoe-update/ ββ profiles/ # 30, 60, 90-day deferral .mobileconfig files ββ scripts/ # Safe install/uninstall/status scripts ββ plugins/ # Optional "shield" experiments β ββ installer-watcher/ # Detect & alert on rogue installers β ββ update-signal-monitor/ # Early-warning system log monitor ββ docs/ # Goals, RFCs, research, compatibility ββ .github/ # Governance, CI, review workflows
π¬ Active Experiments
| Plugin | Type | Description | Default |
|---|---|---|---|
| Installer Watcher | LaunchAgent | Detects /Applications/Install macOS*.app and offers to move it to Trash |
Dry-run |
| Update Signal Monitor | LaunchAgent | Monitors unified logs & prefs for upgrade preparation signals | Dry-run |
Both run in user space, never require
sudo, and write audit logs under~/Library/Logs.
π§ Roadmap
| Phase | Description | Status |
|---|---|---|
| Phase 1 | 30/60/90-day deferrals + safety scripts | β Done |
| Phase 2 | Fallback shields (Installer Watcher, Signal Monitor) | π§ In progress |
| Phase 3 | Badge & prompt suppression research | π Community testing |
| Phase 4 | Declarative + network-layer experiments | π§ͺ Future |
π§© Vision & Philosophy
- Transparency over magic: Every line of code is inspectable and reversible
- Safety first: No background daemons, no automatic actions
- Community-led: Every installable artifact is review-gated
- Apple-aligned: Start with supported deferral keys, innovate cautiously beyond them
π§βπ» Contributing
We welcome:
- π§± Developers β build and test optional shields
- π Researchers β document macOS update behavior
- π§ͺ Testers β verify reproducibility across versions
- π§ Reviewers β audit scripts and profiles for safety
π See CONTRIBUTING.md and docs/GOALS.md.
π§° Quick Start
1. Clone or download the repo
git clone https://github.com/travisvn/stop-tahoe-update.git
cd stop-tahoe-updateEnsure the scripts are executable
# Ensure scripts are executable (just in case) chmod +x ./scripts/*.sh
2. Apply a 90-day deferral profile
The script will generate unique identifiers to prevent conflicts and attempt to install the profile.
./scripts/install-profile.sh profiles/deferral-90days.mobileconfig
Note
On recent macOS versions, silent installation may be blocked. If the script opens System Settings, please locate the "Profiles" (or "Downloaded Profile") notification and click Install manually to complete the process.
3. Verify status
4. Remove later if needed
./scripts/uninstall-profile.sh
π What the deferral profiles actually do
They use Appleβs official com.apple.applicationaccess keys:
<key>forceDelayedMajorSoftwareUpdates</key><true/> <key>enforcedSoftwareUpdateMajorOSDeferredInstallDelay</key><integer>90</integer>
These settings hide major upgrades from Software Update for up to 90 days. After that, the OS may begin prompting again.
βοΈ Safety & Governance
- π§Ύ Signed releases only β no
curl | shinstall methods - π§± CodeOwners required for
profiles/,scripts/, andplugins/ - π§ͺ CI validation: XML linting, ShellCheck, SHA-256 hash checks
- π‘οΈ No root operations unless clearly documented & user-initiated
- π Security disclosure policy: see SECURITY.md
πΊοΈ Beyond Tahoe
While this repo focuses on Sequoia β Tahoe, the long-term goal is a more general toolkit: StayOnMac β empowering macOS users to choose when (or if) they upgrade.
Future versions may include:
- Broader version targeting (Sonoma, Ventura, etc.)
- GUI wrappers for non-technical users
- Integration with open MDM tools
π¬ Community & Support
- π GitHub Discussions: share findings, theories, and test results
- π§©
observationstag: submit verified upgrade triggers or logs - π§ RFCs: propose new shields via
docs/rfcs/
π§Ύ License
MIT License β simple, permissive, and open. All contributions must remain verifiable, reversible, and user-controlled.