BetterCmdTab

Per-shortcut overrides

Give each shortcut its own layout, filters, sorting and appearance — plus scoped shortcuts.

Every switcher shortcut normally uses the global settings. shortcutOverrides lets a shortcut disagree: a compact alphabetical list for one hotkey, full-size window previews for another, from the same install.

This pairs with scopedShortcutList, which creates additional hotkeys that open the switcher pre-filtered to a subset of windows. Together: one hotkey for "all my windows as previews", another for "just this app's windows, as a list".

Targets

An override names the shortcut it applies to in its target field:

targetShortcut
switchAppsThe main switcher (⌘Tab by default)
switchWindowsThe window switcher (⌘` by default)
scoped.<id>A scoped shortcut, where <id> is its id in scopedShortcutList
config.json
{
  "shortcutOverrides": [
    {
      "target": "switchWindows",
      "layoutMode": "windowPreview",
      "panelScalePercent": "140",
      "sortOrder": "mruWindows"
    },
    {
      "target": "scoped.0",
      "layoutMode": "list",
      "listWidthPercent": "60",
      "showMinimized": "false"
    }
  ]
}

Override values are strings

Overrides are stored as string dictionaries, so every value is written as a JSON string — "140" not 140, "false" not false. The global keys they mirror use their natural types. The generated schema.json enforces this, so your editor will flag it.

Any field you omit inherits the global setting. An override with nothing but a target is the same as having no override at all, and is dropped when the file is next written.

Fields

Field names mostly match the global key of the same name — see the config reference for what each one does. Three are shortened: showMinimized, showHidden and showWindowless map to showMinimizedWindows, showHiddenApps and showWindowlessApps.

spaceScope takes an extra value here, "inherit", which follows the global setting.

Per-shortcut overrides of the global settings. Each entry names its shortcut in "target"; every other field is optional and inherits the global value when absent.

FieldTypeDescription
target requiredstringWhich shortcut this entry overrides.
applicationsOnlystringOverride: Show one entry per app instead of one per window.
  • "true"
  • "false"
backdropMaterialstringOverride: Blur material behind the rows. Ignored by the macOS 26 glass backdrop.
  • "hud"HUD (default)
  • "sidebar"Sidebar
  • "menu"Menu
  • "popover"Popover
  • "fullScreen"Full Screen
  • "underWindow"Under Window
boldSelectedLabelstringOverride: Show the highlighted entry's title in bold.
  • "true"
  • "false"
expandBrowserTabsAsWindowsstringOverride: List browser tabs (Safari, Chromium) as separate entries.
  • "true"
  • "false"
fontFacestringOverride: Typeface used for names and titles.
  • "system"System
  • "rounded"Rounded
  • "serif"Serif
  • "monospaced"Monospaced
fontScalestringOverride: Size of the name/title text, independent of the panel scale.
  • "extraSmall"Extra small
  • "small"Small
  • "standard"Default
  • "large"Large
  • "extraLarge"Extra large
gridMaxColumnsstringOverride: Column cap for the grid layout. 0 = automatic (as many as fit). Accepted: 0…12. Written as a decimal string.
layoutModestringOverride: Switcher layout: list rows, an icon grid, or window previews.
  • "list"List
  • "iconDock"Grid View
  • "windowPreview"Previews
letterHintsEnabledstringOverride: Show the letter that jumps to each entry.
  • "true"
  • "false"
listWidthPercentstringOverride: Width of list rows as a percentage of the automatic, screen-scaled width. Accepted: 30…100. Written as a decimal string.
panelAppearancestringOverride: Light or dark switcher, independent of the rest of macOS.
  • "system"System
  • "light"Light
  • "dark"Dark
panelCornerRadiusstringOverride: Panel corner radius in points. 0 = automatic (follows the panel size), -1 = square corners. Accepted: -1…40. Written as a decimal string.
panelOpacitystringOverride: Opacity of the panel background, in percent. Accepted: 30…100. Written as a decimal string.
panelScalePercentstringOverride: Overall size of the switcher panel, in percent. Accepted: 50…150. Written as a decimal string.
panelSizestringLegacy size preset, read once and migrated to panelScalePercent.
  • "small"
  • "standard"
  • "large"
previewTitleAlignmentstringOverride: Where the title sits under each window-preview tile.
  • "leading"Left
  • "center"Center
  • "trailing"Right
showApplicationNamesstringOverride: Show application names next to the icons.
  • "true"
  • "false"
showHiddenstringOverride: Include apps hidden with ⌘H.
  • "true"
  • "false"
showMinimizedstringOverride: Include minimized windows.
  • "true"
  • "false"
showUnreadBadgesstringOverride: Show each app's Dock unread badge on its entry.
  • "true"
  • "false"
showWindowlessstringOverride: Include running apps that have no open window.
  • "true"
  • "false"
showWindowTitleLabelstringOverride: Show each window's title, not just its app.
  • "true"
  • "false"
sortOrderstringOverride: Order apps and windows are listed in.
  • "mru"Most recent
  • "mruWindows"Most recent (windows)
  • "alphabetical"Alphabetical
  • "launchOrder"Launch order
spaceScopestringOverride: which Spaces windows are pulled from. "inherit" follows the global spaceScope.
  • "inherit"Use global default
  • "currentSpace"This Space only
  • "allSpaces"All Spaces
  • "visibleSpaces"Visible Spaces
stayOpenOnQuickTapstringOverride: Also keep it open after a quick tap of the shortcut.
  • "true"
  • "false"
stayOpenOnReleasestringOverride: Keep the switcher open after the modifier is released.
  • "true"
  • "false"
titleTruncationModestringOverride: Which part of a too-long title is replaced by an ellipsis.
  • "head"Beginning
  • "middle"Middle
  • "tail"End

Unknown fields are preserved as-is rather than dropped, so opening your config with an older version of the app will not strip overrides it doesn't understand yet.

Scoped shortcuts

scopedShortcutList defines extra global hotkeys, each opening the switcher already filtered. Add and remove them under Settings → Profiles.

config.json
{
  "scopedShortcutList": [
    { "id": "0", "scope": "currentAppWindows", "name": "scopedSwitch1" },
    { "id": "1", "scope": "minimizedOnly", "name": "scopedSwitch2" }
  ]
}

Scoped switcher shortcuts — each opens the panel already filtered to one subset of windows.

FieldTypeDescription
id requiredstringStable id of this entry, as a decimal string. Keys its recorded trigger and its shortcutOverrides entry — never reused.
name requiredstringName the trigger chord is recorded under (the chord itself is stored outside this file).
scopestringWhich windows the shortcut shows.
  • "allAppsAllSpaces"All windows
  • "allAppsCurrentSpace"Windows on this Space
  • "currentAppWindows"Current app's windows
  • "minimizedOnly"Minimized windows

The key combination is not in this file

name is the label the chord is recorded under; the chord itself lives outside the Switcher.* namespace and is not synced. Copying your config to another Mac carries the scoped shortcuts and their settings over — you re-record their key combinations there, under Settings → Profiles.

Ids are allocated monotonically and never reused, so an entry keeps its recorded chord and its shortcutOverrides entry across adds, removes and reordering. id is a decimal string, matching how the list is stored.

Do not hand-pick ids that collide with an existing entry, and leave nextScopedShortcutID alone — it is the allocator's counter. Adding entries through the settings window avoids both problems.

Direct app hotkeys

Unrelated to scoped shortcuts, but often wanted alongside them: directActivationBindings assigns a bundle ID to each of nine "focus or launch this app" hotkey slots. It is always exactly nine entries; an empty string leaves a slot unused.

config.json
{
  "directActivationBindings": [
    "com.apple.Safari",
    "com.googlecode.iterm2",
    "",
    "",
    "",
    "",
    "",
    "",
    ""
  ]
}

The chords for these slots are, again, recorded outside this file.

Worked example

A setup with three distinct switchers:

config.json
{
  "layoutMode": "iconDock",
  "sortOrder": "mru",
  "spaceScope": "allSpaces",

  "scopedShortcutList": [
    { "id": "0", "scope": "currentAppWindows", "name": "scopedSwitch1" }
  ],

  "shortcutOverrides": [
    {
      "target": "switchWindows",
      "layoutMode": "windowPreview",
      "sortOrder": "mruWindows",
      "panelScalePercent": "130"
    },
    {
      "target": "scoped.0",
      "layoutMode": "list",
      "listWidthPercent": "50",
      "showWindowTitleLabel": "true",
      "spaceScope": "inherit"
    }
  ]
}
  • ⌘Tab — icon grid of apps, most-recent first, across all Spaces.
  • ⌘` — large window previews of the front app, ordered by most recent window.
  • The scoped hotkey — a narrow list of the current app's windows with full titles.

On this page