AeroSpace Window Management
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)
| Shortcut | Action |
|---|---|
| ββ₯+h | Focus left window |
| ββ₯+j | Focus down window |
| ββ₯+k | Focus up window |
| ββ₯+l | Focus right window |
Note: These use ββ₯ instead of β₯ alone to avoid conflicts with Zellij terminal multiplexer shortcuts.
Moving Windows (ββ₯β§ = Ctrl+Option+Shift)
| Shortcut | Action |
|---|---|
| ββ₯β§+h | Move window left |
| ββ₯β§+j | Move window down |
| ββ₯β§+k | Move window up |
| ββ₯β§+l | Move window right |
Workspace Switching
| Shortcut | Action |
|---|---|
| β₯+1 through β₯+9 | Switch to workspace 1-9 |
| β₯+a through β₯+z | Switch to workspace A-Z |
| β₯+Tab | Toggle between last two workspaces |
Moving Windows to Workspaces
| Shortcut | Action |
|---|---|
| β₯β§+1 through β₯β§+9 | Move window to workspace 1-9 |
| β₯β§+a through β₯β§+z | Move window to workspace A-Z |
| β₯β§+Tab | Move workspace to next monitor (wrap around) |
Layout Controls
| Shortcut | Action |
|---|---|
| β₯+/ | Toggle tiles layout (horizontal β vertical) |
| β₯+, | Toggle accordion layout (horizontal β vertical) |
| β₯+- | Decrease focused window size (-50px) |
| β₯+= | Increase focused window size (+50px) |
Service Mode (β₯β§+;)
| Shortcut | Action |
|---|---|
| β₯β§+; | Enter service mode |
| Esc | Reload config & exit to main mode |
| r | Flatten workspace tree & exit |
| f | Toggle floating/tiling for window & exit |
| Backspace | Close 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:
-
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 -
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 -
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 emptydefault-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
| Feature | AeroSpace | Moom | Rectangle | Raycast |
|---|---|---|---|---|
| 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 curve | High | Low | Medium | Medium |
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
- URL: https://nikitabobko.github.io/AeroSpace/guide
- Summary: Complete guide to AeroSpace configuration, commands, and concepts
GitHub Repository
- URL: https://github.com/nikitabobko/AeroSpace
- Summary: Source code, issue tracker, and community discussions
Related Articles
- Moom - Alternative window manager with mouse-driven interface
- Zellij - Terminal multiplexer that pairs well with AeroSpace