Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save petergi/b0f7967e50c5fbef10492e8f75004059 to your computer and use it in GitHub Desktop.

Select an option

Save petergi/b0f7967e50c5fbef10492e8f75004059 to your computer and use it in GitHub Desktop.
Ergonomically sound and backed by actual usability research — bright reading surfaces reduce eye strain for dense text, even when the surrounding UI is dark.

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:

Label com.peter.force-light-apps
<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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment