Does macOS support different dark mode settings per app?
The short answer is no - not natively. When you go to System Settings → Appearance, you set a single preference that applies across the entire operating system. Every app that honours the system appearance will switch together. There is no checkbox that says "keep Mail in light mode while everything else is dark."
iOS behaves slightly differently. Some iOS apps expose their own appearance setting within the app itself - Spotify and Telegram are good examples - but this is because the individual developer chose to build that control in. macOS apps are less likely to do this, and macOS itself does not offer the infrastructure for it at the system level.
That said, there is a reliable workaround for macOS using a low-level preference key called NSRequiresAquaSystemAppearance. Writing this key to an app's defaults domain via Terminal forces that app to always render in the Aqua (light) appearance, even when the system is in dark mode. The key can also be set in reverse to force dark mode on an app that would otherwise respect a light system setting.
This is not a new trick - it has existed since macOS Mojave introduced system-wide dark mode in 2018. It is documented in Apple's developer documentation and used by sysadmins to manage appearance settings on managed devices.
How do you force an app to stay in light mode on a dark Mac?
The command is straightforward. Open Terminal (search for it in Spotlight with Cmd+Space) and run the following, replacing com.bundle.identifier with the actual bundle ID of the app you want to override:
defaults write com.bundle.identifier NSRequiresAquaSystemAppearance -bool YES
Setting the value to YES forces the app into light mode (the Aqua appearance). After running the command, fully quit the app with Cmd+Q and relaunch it. The override takes effect on the next launch - it does not apply to a running instance.
If you want to force an app into dark mode regardless of the system setting, use NO instead:
defaults write com.bundle.identifier NSRequiresAquaSystemAppearance -bool NO
To remove the override entirely and let the app follow the system again, delete the preference key:
defaults delete com.bundle.identifier NSRequiresAquaSystemAppearance
Again, quit and relaunch the app after running the delete command.
Step-by-step summary
- Find the app's bundle identifier (see the next section for how to do this).
- Open Terminal and run:
defaults write [bundle.id] NSRequiresAquaSystemAppearance -bool YES - Fully quit the app with Cmd+Q.
- Relaunch the app. It will now use light mode regardless of the system setting.
- To revert: run
defaults delete [bundle.id] NSRequiresAquaSystemAppearance, then quit and relaunch.
The override applies to that specific app's process. If an app spawns a separate helper or renderer process with a different bundle ID, those child processes may not pick up the override and could still render in the system appearance.
How do you find an app's bundle identifier on Mac?
Before you can write the defaults key, you need the app's bundle identifier - a reverse-domain string like com.apple.mail or com.tinyspeck.slackmacgap. There are two easy ways to find it.
Method 1: Use osascript in Terminal
This is the fastest method. Open Terminal and run:
osascript -e 'id of app "AppName"'
Replace AppName with the exact name of the app as it appears in Finder (for example, "Mail", "Slack", or "Finder"). Terminal will print the bundle identifier immediately. For example:
osascript -e 'id of app "Mail"'
# Output: com.apple.mail
osascript -e 'id of app "Slack"'
# Output: com.tinyspeck.slackmacgap
Method 2: Read the Info.plist directly
Every app bundle contains an Info.plist file that declares its bundle identifier. You can read it with this command, replacing /Applications/AppName.app with the actual path to the app:
defaults read /Applications/AppName.app/Contents/Info CFBundleIdentifier
For example:
defaults read /Applications/Safari.app/Contents/Info CFBundleIdentifier
# Output: com.apple.Safari
Both methods work reliably. The osascript method is quicker when you know the app's display name; the Info.plist method is useful when an app's display name differs from its folder name.
Common bundle identifiers
Here are bundle identifiers for apps that Mac users commonly want to keep in light mode:
| App | Bundle Identifier |
|---|---|
com.apple.mail |
|
| Safari | com.apple.Safari |
| Finder | com.apple.finder |
| Slack | com.tinyspeck.slackmacgap |
| Notion | notion.id |
| Calendar | com.apple.iCal |
| Notes | com.apple.Notes |
| Preview | com.apple.Preview |
Always verify the bundle identifier yourself using one of the Terminal methods above - bundle IDs can change between app versions, and third-party lists are not always up to date.
Which apps have their own built-in appearance settings?
Some apps bypass the system appearance entirely by implementing their own theme system. For these apps, you do not need the Terminal workaround at all - just open the app's preferences and choose the appearance you want.
- Slack - Settings → Themes → Colors. Offers a separate sidebar colour scheme independent of macOS appearance. You can also set it to always follow or always override the system.
- VS Code - Preferences → Color Theme. Completely independent of macOS dark mode; you pick a theme from a library of thousands.
- Spotify - Always uses its own dark theme regardless of system appearance. No user control over this.
- Discord - Settings → Appearance. Lets you choose Light, Dark, or System default.
- Figma - View → Interface Theme. Independent light/dark control within the app.
- Bear - Preferences → Themes. Offers its own theme picker separate from system appearance.
- Fantastical - Preferences → Appearance. System, Light, or Dark.
For apps that have their own appearance controls, prefer using those controls over the Terminal defaults method. The app-level setting is less likely to break after updates and is supported by the developer.
For scheduling when your whole Mac switches between light and dark mode, see How to Schedule Dark Mode on Mac (3 Methods).
When should you use per-app overrides vs system-wide scheduling?
These two approaches solve different problems. Understanding which one you need - and when to use both together - will save you a lot of configuration time.
Use per-app Terminal overrides when:
- A specific app looks bad in dark mode. Email clients like Outlook and some older versions of Mail render HTML email poorly in dark mode - images with white backgrounds become jarring, and some HTML newsletters invert colours unexpectedly. Pinning Mail to light mode fixes this without affecting the rest of your setup.
- You do colour-accurate work in a specific app. Design and photo-editing apps like Photoshop, Lightroom, and Pixelmator Pro benefit from a calibrated light canvas. If dark mode is activated system-wide, the app's interface can introduce colour adaptation issues. Many professionals override these apps to always use light mode.
- An app has a broken or unpolished dark mode implementation. Some older or less-maintained apps have incomplete dark mode support - unreadable text, invisible icons, or broken contrast. Per-app overrides let you force them into light mode while keeping dark mode active everywhere else.
- You need one or two exceptions to an otherwise dark workflow. If 90% of your apps look and work better in dark mode but two do not, per-app overrides are far less disruptive than switching the whole system.
Use system-wide scheduling (with Solace) when:
- You want the whole Mac to switch at a certain time. Switching at sunset is the most popular pattern. It reduces eye strain in the evening without requiring any manual action.
- You want weather-aware switching. On overcast days, dark mode can be more comfortable even during daytime hours. Solace can switch based on real-time weather conditions, not just the clock.
- You want wallpapers and appearance to change together. Solace syncs wallpaper switching with dark mode so your desktop always looks intentional - a daytime photo in light mode, a night skyline in dark mode.
- You want to set it once and forget it. Manual toggling is tedious. Scheduling automates the whole workflow.
The most effective setup for most people is to use both approaches together: let Solace handle the system-wide schedule, and apply Terminal overrides for the one or two apps that need an exception. You get a fully automated workflow with surgical precision where it matters.
If your Mac is not switching to dark mode when expected, see Dark Mode Not Working on Mac: How to Fix It.
What Solace does and does not do
To be clear: Solace does not provide per-app dark mode overrides. That is not what it is designed for. Solace controls when the whole macOS system switches between light and dark mode - at sunset, at a custom time, or based on local weather. It also handles colour temperature (evening warmth) and wallpaper switching in sync with appearance changes.
If you want to keep individual apps in a different mode from the rest of the system, the Terminal defaults method described in this guide is the right tool. Solace and Terminal overrides are complementary, not competing, approaches.
Learn how to configure sunset-based switching end to end in How to Auto-Switch Dark Mode Based on Sunset on Mac.
Limitations of the Terminal override method
The NSRequiresAquaSystemAppearance trick works well, but it is not universal. There are several situations where it will not work or may behave unexpectedly:
- Sandboxed App Store apps may ignore it. The macOS app sandbox restricts which defaults domains an app can read. Many App Store apps run in a hardened sandbox that prevents them from reading this key from outside their own container. If you apply the override to an App Store app and nothing changes after relaunching, the sandbox is likely blocking it.
- Some apps have their own theme engine. Apps that render their entire UI with a custom drawing framework (Electron apps like VS Code and Notion, or apps with complete custom themes like Spotify) may not respect the system appearance at all, making this override irrelevant.
- macOS updates can reset preferences. Major macOS version upgrades can migrate or reset defaults, removing your overrides. Re-apply them after significant system updates.
- It does not help with widgets or system UI elements. The override only affects the specific app. The Dock, menu bar, Spotlight, and other system UI elements will continue to use the system appearance.
- Helper processes may not inherit the override. Some apps (browsers, for instance) use separate renderer processes. The helper processes may have a different bundle ID and will not pick up the override you wrote for the main app.
Despite these limitations, the method is reliable for a large number of non-sandboxed, single-process applications - which covers most of the cases where people actually want to use it.
Frequently asked questions
Can I set some apps to light mode while keeping the rest of macOS in dark mode?
Yes. Open Terminal and run: defaults write com.bundle.identifier NSRequiresAquaSystemAppearance -bool YES - replace com.bundle.identifier with the app's actual bundle ID. This tells the app to always use the Aqua (light) appearance regardless of the system setting. Quit and relaunch the app to apply the change.
Does the per-app dark mode override work on all apps?
Not all apps. Sandboxed App Store apps may ignore the NSRequiresAquaSystemAppearance preference because the macOS sandbox restricts certain defaults domains. The override works most reliably with non-sandboxed apps distributed outside the App Store, and with some sandboxed apps that still read this key. If an app does not respond after relaunching, it is likely ignoring the preference entirely.
Do I need to restart my Mac after applying the Terminal override?
No. You only need to fully quit and relaunch the specific app you applied the override to. The rest of macOS is unaffected. There is no need to log out or restart.
Will a macOS update reset my per-app settings?
Major macOS version upgrades can reset or migrate defaults preferences in unexpected ways. Point updates within the same version are usually safe. It is worth checking your per-app overrides after any significant macOS update and re-applying them if needed.
Is there an app that does per-app dark mode without Terminal?
Canister and Lungo Touch have limited per-app appearance controls with a GUI. However, most solutions still require Terminal for reliable overrides across all apps. For system-wide dark mode scheduling - automating when the entire Mac switches - Solace is the most capable option. Per-app Terminal overrides and Solace's system scheduling work well together as complementary tools.
Solace - $4.99, yours forever
Dark mode scheduling, colour temperature, wallpaper sync, and weather-aware switching. Automate the system; use Terminal overrides for exceptions.
Buy NowOne-time purchase, no subscription. Learn more