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/aerospace

Mapping cheatsheet (yabai/skhd → AeroSpace)

yabai / skhdAeroSpace
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 Nmove-node-to-workspace N
window --toggle zoom-fullscreenfullscreen
window --toggle floatlayout floating tiling
mouse_modifier ctrl + followon-focus-changed = ['move-mouse window-lazy-center']