All right Peter — let’s make this boringly reliable, the way infrastructure should be.
There are three sane ways to keep per-app light mode enforced on modern macOS. They differ mainly in how “enterprise” you want to get.
I’ll walk from simplest → most robust, with opinions included at no extra charge.
Option 1 — Login script (best balance of power vs simplicity)
This is my default recommendation.
You create a small script that re-applies the settings every time you log in. If macOS resets anything during an update, the next login quietly fixes it.
Example:
#!/bin/zsh
# Force Calendar to Light Mode
defaults write com.apple.iCal NSRequiresAquaSystemAppearance -bool true
# Force Mail to Light Mode
defaults write com.apple.mail NSRequiresAquaSystemAppearance -bool true
Save it as:
~/bin/force-light-apps.sh
Make it executable:
chmod +x ~/bin/force-light-apps.sh
Then register it as a login item:
System Settings → General → Login Items → Add → select the script
That’s it.
No permissions prompts. No background daemons. No brittle hacks.
This survives reboots, OS upgrades, and mild Apple tantrums.
Option 2 — macOS Shortcuts automation (clean UI, slightly less durable)
If you prefer something visible and Apple-blessed: 1. Open Shortcuts 2. Create a new shortcut called: “Enforce Light Apps” 3. Add action: Run Shell Script
defaults write com.apple.iCal NSRequiresAquaSystemAppearance -bool true
defaults write com.apple.mail NSRequiresAquaSystemAppearance -bool true
4. Automation tab →
“When I log in” → Run shortcut
This works well, but occasionally breaks after macOS updates until you re-approve permissions. Apple really likes consent screens.
Option 3 — LaunchAgent (most robust, most nerdy)
This is the “I don’t trust GUIs” option. macOS has a built-in scheduler called launchd. You can tell it:
“Every login, enforce this whether the user remembers or not.”
Create this file:
~/Library/LaunchAgents/com.whateveryouwant.force-light-apps.plist
Contents:
<key>ProgramArguments</key>
<array>
<string>/bin/zsh</string>
<string>-c</string>
<string>
defaults write com.apple.iCal NSRequiresAquaSystemAppearance -bool true;
defaults write com.apple.mail NSRequiresAquaSystemAppearance -bool true;
</string>
</array>
<key>RunAtLoad</key>
<true/>
Then load it:
launchctl load ~/Library/LaunchAgents/com.peter.force-light-apps.plist
From now on:
• login → enforced • reboot → enforced • macOS update → enforced • Apple engineers quietly sobbing → irrelevant
This is how admins do it.
My strong recommendation
For a single power user Mac:
Option 1 (login script) It’s transparent, readable, debuggable, and future-proof enough.
For “this machine must always behave correctly”:
Option 3 (LaunchAgent) That’s professional-grade macOS automation.
Useful bundle IDs
For convenience:
Calendar com.apple.iCal
Mail com.apple.mail
Notes com.apple.Notes
Reminders com.apple.reminders
Safari com.apple.Safari
Preview com.apple.Preview
You can confirm any app with:
osascript -e 'id of app "Calendar"'
One important caveat
This trick forces Aqua (Light) UI chrome, but:
• email content rendering • calendar colors • message backgrounds
may still obey app-level settings.
That’s normal. You’re overriding the window appearance, not rewriting the app.
Final thought
You’ve essentially created:
Dark Mode for the operating system Light Mode for cognition-heavy tools
Which is ergonomically sound and backed by actual usability research — bright reading surfaces reduce eye strain for dense text, even when the surrounding UI is dark.
Apple accidentally shipped the perfect feature… and forgot to expose the checkbox.