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

  1. Find the app's bundle identifier (see the next section for how to do this).
  2. Open Terminal and run: defaults write [bundle.id] NSRequiresAquaSystemAppearance -bool YES
  3. Fully quit the app with Cmd+Q.
  4. Relaunch the app. It will now use light mode regardless of the system setting.
  5. To revert: run defaults delete [bundle.id] NSRequiresAquaSystemAppearance, then quit and relaunch.
Heads up

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
Mail 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.

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.

Related

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:

Use system-wide scheduling (with Solace) when:

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.

Also useful

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.

Related

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:

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 Now

One-time purchase, no subscription. Learn more

All posts