Super is the Mod key (Windows/Command key) — referred to as $mod below
| $mod + Return | Open terminal (WezTerm) |
| $mod + d | App launcher (Rofi) |
| $mod + Tab | Window switcher (Rofi) |
| $mod + Shift + q | Kill focused window |
| $mod + Escape | Lock screen |
| $mod + h / ← | Focus left |
| $mod + j / ↓ | Focus down |
| $mod + k / ↑ | Focus up |
| $mod + l / → | Focus right |
| $mod + a | Focus parent container |
| $mod + z | Focus child container |
| $mod + space | Toggle focus tiling/floating |
| $mod + Shift + h / ← | Move left |
| $mod + Shift + j / ↓ | Move down |
| $mod + Shift + k / ↑ | Move up |
| $mod + Shift + l / → | Move right |
| $mod + Shift + 1-0 | Move to workspace 1-10 |
| $mod + 1 – 0 | Switch to workspace 1-10 |
| $mod + Ctrl + ← / h | Previous workspace (same monitor) |
| $mod + Ctrl + → / l | Next workspace (same monitor) |
| $mod + b | Next new window opens to the right (no visual change) |
| $mod + v | Next new window opens below (no visual change) |
| $mod + f | Toggle fullscreen |
| $mod + s | Stacking layout |
| $mod + w | Tabbed layout |
| $mod + e | Toggle H/V — also untabs/unstacks |
| $mod + Shift + space | Toggle floating |
| $mod + Shift + f | Flatten workspace (fix nesting) |
| $mod + r | Enter resize mode |
| h / ← | Shrink width |
| l / → | Grow width |
| k / ↑ | Shrink height |
| j / ↓ | Grow height |
| Escape / Return | Exit resize mode |
| $mod + g | Increase inner gaps |
| $mod + Shift + g | Decrease inner gaps |
| $mod + Ctrl + g | Remove all gaps |
Layout commands change how a container arranges its children. If a command doesn't work, press $mod+a first to select the parent container.
$mod+Return — open terminal for Claude Code$mod+Return — second terminal opens right$mod+v on right terminal — set vertical split$mod+Return × 2 — two more terminals below$mod+a, $mod+w — tabs$mod+w then $mod+e) adds a container level. Repeat a few times and $mod+a needs many presses.$mod+Shift+f flattens the workspace — resets all nesting.
| $mod+a | Focus parent (zoom out) |
| $mod+z | Focus child (zoom in) |
| Change existing layout (focus a window, press directly) | |
| $mod+e | Toggle H/V — also untabs/unstacks |
| $mod+w | Tab siblings |
| $mod+s | Stack siblings |
| Set direction for next new window | |
| $mod+b | Next new window → right |
| $mod+v | Next new window → below |
| Fix | |
| $mod+Shift+f | Flatten workspace (fix nesting) |
| $mod+o | Move workspace to other monitor |
| $mod+Shift+o | Gather all workspaces here |
i3 represents your entire screen as a single tree. Every node in that tree is called a container. Containers with children arrange those children on screen according to a layout rule. Containers without children — the leaves — hold actual application windows. That's the whole model.
The top of the tree is always the same fixed structure. The root node sits at the very top. Below it, one node per physical monitor (i3 calls these outputs). Below each output, the workspaces you switch between with $mod+1, $mod+2, and so on. Below the active workspace is where you work.
A container's only job is to declare a layout — a rule that controls how its children are positioned and sized. There are four layouts in i3:
$mod+v before opening.$mod+w.$mod+s.The layout attribute lives on the container, not on the windows inside it. When you press $mod+w to switch to tabbed, you are changing the layout property of whichever container is the parent of the focused window. Every sibling in that container immediately becomes a tab. Switch back to $mod+e (splith/splitv toggle) and they tile again — the same tree, different rendering.
Pressing $mod+v or $mod+b does not immediately change anything visible. It marks the focused window so that the next window you open will land inside a newly created container that wraps the current one. Split and open are two separate actions.
Suppose Terminal is the only window in your workspace. You press $mod+v, then open Neovim. i3 creates a new splitv container, moves Terminal inside it, then places Neovim as a sibling in that container.
This is why trees can grow arbitrarily deep. Every split adds exactly one level of nesting. You can have a splitv container inside a splith container inside a tabbed container — each with its own independent layout.
The focused window is always a leaf. i3 tracks a focused path — a chain of nodes from the root down to exactly one leaf. Every container along this path also has focus, in the sense that it knows which of its children is in the focused chain.
When you navigate with $mod+h/j/k/l or $mod+Arrow, you move focus to an adjacent leaf within the same parent container. If you reach the edge of the container, focus crosses into the nearest container in that direction. This is why navigation in i3 feels spatial: the tree's structure determines the neighborhood of any given window.
For tabbed and stacked containers, focus controls more than highlighting — it determines which child is rendered. All other children are hidden. Changing focus within a tabbed container is equivalent to switching tabs.
Each internal container remembers which of its children was last focused. If focus moves into a container from outside, i3 restores that container's remembered focus rather than defaulting to the first child. This makes workspace switching and tab navigation feel consistent — returning to a workspace always lands you on the window you were last using.
Every time you tab ($mod+w) then untab ($mod+e), i3 creates a new container level. Repeat this a few times and your windows are buried many levels deep. Then $mod+a needs many presses to reach the right parent.
Avoid toggling tab/split repeatedly. Set up your layout once and leave it. If nesting gets out of hand, press $mod+Shift+f to flatten the workspace — it moves all windows out and back to reset the tree to a single level.
To change a group's layout: focus a window inside the group, press $mod+w/e/s directly.
Don't press $mod+a before layout commands — it moves focus up, so the command operates one level higher than intended.
You start with a blank workspace: one container. Every window you open becomes a child of the container that currently holds focus. $mod+v or $mod+b followed by opening a window inserts a new container node, creating a sub-region with its own layout.
acvc-openvpn process active means connected.When confused, run i3tree to see the tree, and $mod+Shift+f to reset. Every action is a tree operation.
| External monitor is managed by autorandr — plug/unplug is automatic. | |
| $mod + Shift + ↑ | Move window to monitor above |
| $mod + Shift + ↓ | Move window to monitor below |
mobile (laptop only) • docked (external + laptop)autorandr --save <name> --force
| Screenshot selection (Flameshot) | |
| $mod + Print | Full screenshot |
| $mod + Shift + Print | Current screen screenshot |
| Volume Up key | Raise volume +5% |
| Volume Down key | Lower volume -5% |
| Mute key | Toggle mute |
| Mic Mute key | Toggle mic mute |
| Alt + Shift | Toggle BR / US layout |
dunstctl close | Close one notification |
dunstctl close-all | Close all notifications |
dunstctl set-paused toggle | Do not disturb toggle |
| Right-click notification | Close all |
| $mod + Shift + - | Send window to scratchpad |
| $mod + - | Show/cycle scratchpad windows |
| $mod + Shift + c | Reload config |
| $mod + Shift + r | Restart i3 in-place |
| $mod + Shift + p | Relaunch polybar (fix missing bar) |
| $mod + Ctrl + k | Re-apply keyboard layout (fix Alt+Shift) |
| $mod + Shift + e | Exit i3 (logout) |
feh --bg-fill ~/Pictures/Wallpapers/<name>pkill xcompmgr && xcompmgr -c -r 6 -o 0.4 -l -5 -t -5 &