What It Does

macOS gives you as many spaces as you like and then hides which one you are on. ActiveSpace puts a numbered bubble in the menu bar that always tells you, and updates the moment the space changes, however you changed it.

Click the bubble to go somewhere else. With two spaces a click toggles between them; with three or more you get a popover with a button per space. Arriving somewhere brings forward an app that actually lives on that space, so you are never left on a desk with nothing selected.

Optionally, ActiveSpace can also replace the system cmdtab switcher with one that only shows apps with windows on your current space — including minimised windows and windows of hidden apps. Off by default; enable it in Settings if you want it.

How It Works

ActiveSpace does not switch spaces itself. It sends the keyboard shortcut macOS already has for the space you picked, and macOS does the rest. One mechanism on every display configuration, and nothing that breaks the next time Apple changes how Mission Control works.

Those shortcuts live in System Settings, under Keyboard Shortcuts and Mission Control, as Switch to Desktop 1, Switch to Desktop 2 and so on. They are switched off by default on a new Mac, so ActiveSpace’s Settings lists one row per space showing the key macOS has for it, or saying plainly that it has none. One button turns on every missing one.

Left-click ├── 1 space → no-op ├── 2 spaces → toggle between them └── 3+ spaces → popover with numbered buttons Each button → sends that space's Mission Control shortcut Cmd-Tab (when Switcher is enabled) └── HUD shows apps with windows on this space, MRU-ordered Right-click → About, Settings, Check for Updates, Quit

Earlier versions did switch spaces themselves, with synthetic trackpad gestures and an invisible virtual display to make that work on a single-monitor Mac. macOS 27 ended all of it. Deferring to macOS turned out to be simpler, steadier, and about a thousand lines lighter.

Grid Layout

If you keep more than a handful of spaces and think of them as a grid — for example: 8 spaces as a 4×2 — tell ActiveSpace your row width in Settings. The popover reflows into rows of that width, and two extra hotkeys become available which navigate up/down a row, with optional column-wrap (where navigating down from the bottom of a column lands at the top of the same column and vice versa).

Navigate up/down are ActiveSpace’s own shortcuts, because macOS has no equivalent: moving a row at a time through a grid is not something Mission Control knows about. Set row width to 0 to keep the original linear strip.

Space-Aware Cmd-Tab Switcher

Enable the Switcher in Settings and cmdtab shows only the apps with windows on your current space. Cycle with tab or arrow keys, reverse with shifttab, commit by releasing cmd or pressing return, cancel with esc. Click any icon in the HUD to commit directly.

Apps that are completely hidden (cmdH) or have only minimised windows on the current space still appear in the HUD with a small badge. Selecting one unminimises or unhides as needed before bringing it forward.

When the Switcher is off, native cmdtab behaviour is completely untouched.

Follow App Across Spaces

Some apps you want everywhere: a terminal, a notes window, whatever is playing music. Bind a shortcut in Settings and it pins the frontmost app’s windows to every Mission Control space, the same thing you get from the Dock icon’s right-click menu under Options → Assign To → All Desktops.

The difference is getting back. Press the same shortcut again and the app stops following you and returns to the space it was on when you first turned it on, which saves hunting for where you left it.

Space Detection

ActiveSpace queries the private CoreGraphics CGSCopyManagedDisplaySpaces API to enumerate all spaces across all displays and identify which is current. It stays up to date via three mechanisms:

  1. Space change notification — fires on every space switch
  2. Screen parameters notification — fires when spaces are added or removed via Mission Control
  3. 2-second poll timer — backstop for edge cases where notifications don't fire

Installation

Two formats on every release — both signed and notarised, pick whichever suits:

Or install it with Homebrew: brew install --cask perpetualbeta/jorvik/activespace

Launch ActiveSpace from /Applications and grant Accessibility when prompted. Input Monitoring is only asked for if you use the keyboard features.

Settings

Right-click the icon and choose Settings… to configure:

Auto-updates are handled by Sparkle. Use the “Check for Updates…” menu item to check on demand; Sparkle’s prompt offers an “Automatically download and install updates in the future” checkbox the first time an update is available. ActiveSpace checks for new versions automatically once a day in the background.

Permissions

Both are manageable from the Settings panel:

There is nothing to disable in System Settings. ActiveSpace no longer competes with the built-in Mission Control shortcuts, it uses them.

Building from Source

Open the Xcode project and build:

  1. Clone the repo: git clone https://github.com/PerpetualBeta/ActiveSpace.git
  2. Open ActiveSpace.xcodeproj in Xcode
  3. Build with commandB or run with commandR

Requirements

macOS 14 (Sonoma) or later. Universal binary (Apple Silicon and Intel).

Read about ActiveSpace