← Back to articles

AeroSpace Window Management

Path: Computer Tech/System Configuration/macOS Configuration/AeroSpace Window Management.mdUpdated: 2/3/2026

AeroSpace Window Management

AeroSpace is a tiling window manager for macOS that brings i3/sway-style workspace management to Mac. Unlike traditional window managers, AeroSpace uses persistent workspaces across monitors and keyboard-driven navigation to eliminate the need for mouse-based window juggling.

Core Concepts

Workspaces vs. Monitors

Traditional macOS: Each monitor has its own set of "Spaces" (virtual desktops) that are monitor-specific. Moving between spaces on one monitor doesn't affect the other monitor.

AeroSpace: Workspaces are independent of monitors. You can have workspace 1 on monitor A, then move it to monitor B, and workspace 1 maintains all its window arrangements. This allows for more flexible multi-monitor workflows.

Key difference:

  • macOS Spaces: Monitor-locked (Space 1 on Monitor A β‰  Space 1 on Monitor B)
  • AeroSpace Workspaces: Monitor-independent (Workspace 1 can move between monitors while keeping its windows)

Important Limitations

❌ AeroSpace does NOT:

  • Support predefined layouts per monitor (no "Monitor 1 always has this layout")
  • Save/restore layouts automatically on startup
  • Allow the same app window to exist in multiple workspaces simultaneously
  • Sync layouts between workspaces

βœ… AeroSpace DOES:

  • Persist workspace window arrangements until you change them
  • Allow multiple windows of the same app in different workspaces (Chrome in workspace 1 AND workspace 2)
  • Let you manually set up workspaces once and they'll maintain that arrangement

First Window, Second Window, and Window Panes

In AeroSpace terminology:

  • Window = Individual application window
  • Pane = A tiled position within a workspace (not a window split, but a layout slot)
  • Layout = How windows are arranged (tiles, accordion, floating)

Example:

Workspace 1 (tiles layout, horizontal)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Terminal   β”‚   Browser   β”‚  ← Two windows in horizontal tiles
β”‚  (Window 1) β”‚  (Window 2) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

When you add a third window, AeroSpace automatically adjusts:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚Terminalβ”‚Browser β”‚  Code  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Essential Shortcuts

Navigation (βŒƒβŒ₯ = Ctrl+Option)

ShortcutAction
βŒƒβŒ₯+hFocus left window
βŒƒβŒ₯+jFocus down window
βŒƒβŒ₯+kFocus up window
βŒƒβŒ₯+lFocus right window

Note: These use βŒƒβŒ₯ instead of βŒ₯ alone to avoid conflicts with Zellij terminal multiplexer shortcuts.

Moving Windows (βŒƒβŒ₯⇧ = Ctrl+Option+Shift)

ShortcutAction
βŒƒβŒ₯⇧+hMove window left
βŒƒβŒ₯⇧+jMove window down
βŒƒβŒ₯⇧+kMove window up
βŒƒβŒ₯⇧+lMove window right

Workspace Switching

ShortcutAction
βŒ₯+1 through βŒ₯+9Switch to workspace 1-9
βŒ₯+a through βŒ₯+zSwitch to workspace A-Z
βŒ₯+TabToggle between last two workspaces

Moving Windows to Workspaces

ShortcutAction
βŒ₯⇧+1 through βŒ₯⇧+9Move window to workspace 1-9
βŒ₯⇧+a through βŒ₯⇧+zMove window to workspace A-Z
βŒ₯⇧+TabMove workspace to next monitor (wrap around)

Layout Controls

ShortcutAction
βŒ₯+/Toggle tiles layout (horizontal ↔ vertical)
βŒ₯+,Toggle accordion layout (horizontal ↔ vertical)
βŒ₯+-Decrease focused window size (-50px)
βŒ₯+=Increase focused window size (+50px)

Service Mode (βŒ₯⇧+;)

ShortcutAction
βŒ₯⇧+;Enter service mode
EscReload config & exit to main mode
rFlatten workspace tree & exit
fToggle floating/tiling for window & exit
BackspaceClose all windows except current & exit

Multi-Monitor Workflows

Creating Similar Layouts Across Monitors

Problem: You want workspace 1 on Monitor A and workspace 2 on Monitor B to have similar window layouts.

Reality check: AeroSpace has no "sync layout" or "apply template" feature. You must manually set up each workspace.

Workflow:

  1. Set up workspace 1 (Monitor A):

    bash
    βŒ₯+1              # Switch to workspace 1
    # Open Terminal (⌘+Space, type "terminal")
    # Open Neovim (in Terminal: nvim)
    βŒƒβŒ₯⇧+h/l          # Arrange windows side-by-side
    βŒ₯+/              # Toggle to horizontal tiles if needed
    
  2. Set up workspace 2 (Monitor B):

    bash
    βŒ₯+2              # Switch to workspace 2
    # Open Browser (⌘+Space, type "chrome")
    # Open Obsidian (⌘+Space, type "obsidian")
    βŒƒβŒ₯⇧+h/l          # Arrange identically to workspace 1
    
  3. Move workspace 2 to Monitor B:

    bash
    βŒ₯⇧+Tab           # Move workspace to next monitor (wrap around)
    # May need to press multiple times to reach desired monitor
    

Can you have the SAME app in both workspaces?

No - Same window cannot be in two workspaces.
Yes - Multiple windows of the same app can be in different workspaces.

Example:

bash
# Workspace 1
βŒ₯+1
⌘+Space β†’ "terminal" β†’ Enter    # Terminal window 1
# Inside terminal: nvim project1

# Workspace 2  
βŒ₯+2
⌘+Space β†’ "terminal" β†’ Enter    # Terminal window 2 (NEW window)
# Inside terminal: nvim project2

Now you have Terminal in BOTH workspace 1 and workspace 2, but they're different windows of the same app.

Per-Monitor Workspace Assignment

Goal: Always have workspace 1 on Monitor A, workspace 2 on Monitor B, etc.

Reality: AeroSpace doesn't support automatic monitor-to-workspace binding. Workspaces are monitor-independent by design.

What this means:

  • You CANNOT say "Workspace 1 always lives on Monitor A"
  • Workspaces can move between monitors freely (βŒ₯⇧+Tab)
  • You CANNOT define a layout template that applies to a specific monitor

Workaround - Manual positioning on startup:

After booting your Mac and opening apps:

bash
βŒ₯+1              # Go to workspace 1
βŒ₯⇧+Tab           # Move workspace 1 to Monitor A (press multiple times if needed)

βŒ₯+2              # Go to workspace 2  
βŒ₯⇧+Tab           # Move workspace 2 to Monitor B

Better approach - Use semantic workspace names:

  • Workspace C = "Code" (βŒ₯+c)
  • Workspace D = "Docs" (βŒ₯+d)
  • Workspace M = "Music" (βŒ₯+m)

This way you remember workspaces by purpose, not monitor position.

Example: Two-Monitor Coding Setup

Monitor A (left, 1920x1080): Workspace C (Code)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Terminal   β”‚   Neovim    β”‚
β”‚  (Zellij)   β”‚  (LazyVim)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Monitor B (right, 1920x1080): Workspace D (Docs)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Browser    β”‚  Obsidian   β”‚
β”‚  (Docs)     β”‚  (Notes)    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Setup commands:

bash
# On Monitor A
βŒ₯+c              # Switch to workspace C
# Open Terminal + Neovim, arrange with βŒƒβŒ₯⇧+h/l

# Move to Monitor B
βŒ₯+d              # Switch to workspace D
# Open Browser + Obsidian, arrange with βŒƒβŒ₯⇧+h/l
βŒ₯⇧+Tab           # Move workspace D to Monitor B

Switching:

  • βŒ₯+c = Jump to code workspace (Monitor A)
  • βŒ₯+d = Jump to docs workspace (Monitor B)
  • βŒ₯+Tab = Toggle between last two workspaces

Configuration File Location

~/.config/aerospace/aerospace.toml

Key settings:

  • persistent-workspaces - Keeps workspaces alive even when empty
  • default-root-container-layout - Default layout for new workspaces (tiles/accordion)
  • on-focused-monitor-changed - Mouse follows focus to new monitor

Reload config: βŒ₯⇧+; then Esc

Troubleshooting

Workspace 10 Appears on Second Monitor

Problem: You press βŒ₯+1 to go to workspace 1 on first monitor, but your second monitor shows "workspace 10" instead of a named workspace.

Cause: AeroSpace auto-generates workspace numbers when apps open on monitors without an active workspace. Since your config only defines βŒ₯+1 through βŒ₯+9 (not βŒ₯+0), workspace 10 has no keyboard shortcut.

Solution 1: Move windows to a defined workspace

bash
# Focus the second monitor (click or move mouse there)
βŒ₯+2              # Switch to workspace 2 (this moves to second monitor)
# All windows on "workspace 10" will merge into workspace 2

Solution 2: Add βŒ₯+0 binding for workspace 10

Add to ~/.config/aerospace/aerospace.toml in [mode.main.binding] section:

toml
# Add after the alt-9 line
alt-0 = 'workspace 10'
alt-shift-0 = 'move-node-to-workspace 10'

Then reload config (βŒ₯⇧+; then Esc).

Solution 3: Prevent auto-workspace creation

Use letter workspaces instead of numbers for multi-monitor setups:

  • Monitor 1: Workspace 1 (βŒ₯+1)
  • Monitor 2: Workspace A (βŒ₯+a)
  • Monitor 3: Workspace B (βŒ₯+b)

This way, you avoid the 10/20/30 numbering collision.

Best practice: Explicitly create workspaces before opening apps:

bash
βŒ₯+1              # Go to workspace 1 (monitor 1)
# Open apps here

βŒ₯+2              # Go to workspace 2 (monitor 2)  
# Open apps here

This prevents AeroSpace from auto-creating numbered workspaces.

Comparison to Other Tools

FeatureAeroSpaceMoomRectangleRaycast
Tiling layoutsβœ… Automatic❌ Manual⚠️ Basic⚠️ Basic
Persistent workspacesβœ… Yes❌ No❌ No❌ No
Keyboard-firstβœ… Yes⚠️ Hybridβœ… Yesβœ… Yes
Multi-monitor sync⚠️ Manual setup❌ No❌ No❌ No
Learning curveHighLowMediumMedium

When to use AeroSpace:

  • You want i3/sway-style tiling on macOS
  • You switch between many apps and windows frequently
  • You prefer keyboard navigation over mouse
  • You need workspace persistence across monitors

When to use Moom:

  • You want quick window snapping (quarters, halves)
  • You prefer mouse-driven workflows
  • You don't need persistent workspaces

Links

Official Documentation

GitHub Repository

Related Articles

  • Moom - Alternative window manager with mouse-driven interface
  • Zellij - Terminal multiplexer that pairs well with AeroSpace