BetterCmdTab

App rules

Hide individual apps from the switcher, or pass Command-Tab straight through to them.

Most filtering settings are global. appExceptions is the escape hatch for the one app that needs to behave differently — a menu-bar utility you never want listed, or a game that needs ⌘Tab for itself.

In the settings window this is the Apps pane. In config.json it is an array of objects, one per app:

config.json
{
  "appExceptions": [
    { "bundleID": "com.apple.ActivityMonitor", "hide": "whenNoWindows" },
    { "bundleID": "com.valvesoftware.steam", "ignore": "whenFullscreen" },
    { "bundleID": "com.some.menubarapp", "hide": "always" }
  ]
}

An app with no entry follows the global settings. Both hide and ignore are optional — an entry can set either or both.

Finder is seeded for you

On a first launch with no rules yet, BetterCmdTab writes one entry itself: com.apple.finder with hide: "whenNoWindows". Finder never really quits, so without it every switcher would carry a permanent Finder row. Delete or change the entry freely — it is only a starting default, not re-applied afterwards.

Fields

Per-app rules. An app with no entry follows the global settings.

FieldTypeDescription
bundleID requiredstringBundle identifier of the app this rule applies to.
hidestringWhether this app is hidden from the switcher.
  • "dontHide"Don't hide
  • "always"Always
  • "whenNoWindows"When no open windows
ignorestringWhether the switcher shortcut is passed through to this app instead of opening the panel.
  • "never"Never
  • "always"Always
  • "whenFullscreen"When fullscreen

Finding a bundle ID

osascript -e 'id of app "Safari"'
# com.apple.Safari

Or read it straight out of the bundle:

mdls -name kMDItemCFBundleIdentifier -r /Applications/Safari.app

hide vs. the global filters

hide is evaluated on top of the global contents settings, and it only ever removes entries. If showWindowlessApps is already off, an app with no windows is absent whether or not it has a whenNoWindows rule.

  • "dontHide" — the default. The app is listed like any other.
  • "whenNoWindows" — listed while it has an open window, hidden when it doesn't. Good for apps that keep running in the background with nothing on screen.
  • "always" — never listed. Use it for helpers and menu-bar-only apps that show up as switchable but aren't.

Hiding an app does not stop it from running, and does not remove it from search results if it is installed and searchIncludesLaunchableApps is on.

ignore: passing ⌘Tab through

ignore decides what happens when the switcher shortcut is pressed while that app is frontmost. Instead of opening the panel, the keystroke is handed to the app.

  • "never" — the default. The switcher always opens.
  • "whenFullscreen" — the app gets ⌘Tab only while it is fullscreen. This is the setting you want for games and remote-desktop clients: normal windowed use keeps the switcher, fullscreen sessions get the raw keystroke.
  • "always" — the app always gets ⌘Tab. Reserve this for a virtual machine or remote session that has its own task switcher.

With "always" there is no way to switch away using ⌘Tab while that app is focused — that is the point of the setting, but it means you need another route out (a scoped shortcut, an app hotkey, or Mission Control). Prefer "whenFullscreen" unless you are sure.

Two other lists take bare bundle IDs and are simpler than appExceptions:

config.json
{
  "pinnedBundleIDs": ["com.apple.Safari", "com.googlecode.iterm2"],
  "hideAllExcludedBundleIDs": ["com.spotify.client"]
}

excludedBundleIDs is the superseded predecessor of appExceptions. It is read only on a launch that has no appExceptions key at all, where its bundle IDs become hide: "always" entries. On any install that already has appExceptions — which is every install after the first launch — it is ignored, and it is never deleted from the file. Set appExceptions directly.

On this page