AeroSpace
AeroSpace is an i3-like tiling window manager for macOS. It replaces my previous yabai + skhd setup.
Config
Config lives at ~/.config/aerospace/aerospace.toml (also reads ~/.aerospace.toml).
It’s a direct translation of my old yabai + skhd bindings.
config-version = 2
start-at-login = true
# Keep my labeled workspaces alive (yabai spaces 1-6, 9 had labels)
persistent-workspaces = ["1", "2", "3", "4", "5", "6", "9"]
# Sane bsp-like defaults
enable-normalization-flatten-containers = true
enable-normalization-opposite-orientation-for-nested-containers = true
default-root-container-layout = 'tiles'
default-root-container-orientation = 'auto'
# window_gap 0
[gaps]
inner.horizontal = 0
inner.vertical = 0
outer.left = 0
outer.bottom = 0
outer.top = 0
outer.right = 0
# ── Key bindings (was skhd; ctrl / ctrl+shift) ──
[mode.main.binding]
ctrl-shift-f = 'fullscreen' # toggle zoom-fullscreen
ctrl-shift-p = 'layout floating tiling' # toggle float
# Move (warp) windows
ctrl-shift-h = 'move left'
ctrl-shift-j = 'move down'
ctrl-shift-k = 'move up'
ctrl-shift-l = 'move right'
# Focus windows
ctrl-h = 'focus left'
ctrl-j = 'focus down'
ctrl-k = 'focus up'
ctrl-l = 'focus right'
# Switch to workspace (ctrl - 1..8)
ctrl-1 = 'workspace 1'
ctrl-2 = 'workspace 2'
# ... 3..8
# Move focused window to workspace (ctrl+shift - 1..8)
ctrl-shift-1 = 'move-node-to-workspace 1'
ctrl-shift-2 = 'move-node-to-workspace 2'
# ... 3..8
# ── Window rules (was yabai -m rule) ──
[[on-window-detected]]
if.app-name-regex-substring = 'System Settings'
run = 'layout floating'
# Godot floating dialogs
[[on-window-detected]]
if.window-title-regex-substring = '\(DEBUG\)$'
run = 'layout floating'
# Assign apps to workspaces (yabai: rule --add app=... space=N)
[[on-window-detected]]
if.app-name-regex-substring = 'iTerm2'
run = 'move-node-to-workspace 1'
[[on-window-detected]]
if.app-name-regex-substring = 'Firefox'
run = 'move-node-to-workspace 2'
[[on-window-detected]]
if.app-name-regex-substring = 'Brave'
run = 'move-node-to-workspace 3'
[[on-window-detected]]
if.app-name-regex-substring = 'Chrome'
run = 'move-node-to-workspace 4'
[[on-window-detected]]
if.app-name-regex-substring = 'Discord'
run = 'move-node-to-workspace 5'Install
brew install --cask nikitabobko/tap/aerospaceMapping cheatsheet (yabai/skhd → AeroSpace)
| yabai / skhd | AeroSpace |
|---|---|
yabai -m rule --add app=X space=N | [[on-window-detected]] + move-node-to-workspace N |
manage=off (float) | run = 'layout floating' |
window --focus <dir> | focus <dir> |
window --warp <dir> | move <dir> |
window --space N | move-node-to-workspace N |
window --toggle zoom-fullscreen | fullscreen |
window --toggle float | layout floating tiling |
mouse_modifier ctrl + follow | on-focus-changed = ['move-mouse window-lazy-center'] |