This document describes the tiling window manager experience I am targeting.
- Required: daily-driver behavior.
- Important: expected for parity, but a rough first version is acceptable.
- Nice: useful polish or compatibility.
Priority describes the target experience, not implementation order. A first usable implementation may ship a smaller daily-driver subset as long as it does not choose designs that block required behavior later.
Phase 1 should establish the core daily-driver loop:
- Global numbered workspaces across monitors.
- Dynamic equal-width columns and tabbed/fullscreen-style layout.
- Directional window focus, directional movement, and directional monitor focus.
- Direct numbered workspace move/follow bindings.
- Focus-follows-mouse and mouse-follows-focus.
- Basic rofi launcher, terminal, close, reload, and session-exit bindings.
- Basic status-bar workspace and focused-window state.
Phase 2 should restore high-frequency workflow parity:
- Per-monitor workspace history and history cycling.
- Scratchpads.
- Minimization.
- Go-to-window, bring-window, and replace-window pickers.
- Browser raise-or-spawn and class-aware gather workflows.
- Status-bar window lists, class/title/icon metadata, and special-workspace filtering.
Phase 3 should add visual discovery and polish:
- Visual window overview.
- Visual workspace expose.
- Overview go/bring/replace actions.
- Smart gaps, smart borders, dimming, wallpaper, lock, screenshot, clipboard, DDC/input switching, and other session utilities.
- First-class operation means the action has a direct command or binding. It does not require opening a picker, manually moving focus, or chaining multiple unrelated commands.
- Preserving useful focus means the operation leaves keyboard focus in a predictable place. Non-following moves keep focus on the source monitor or source workspace. Following moves focus the moved window on its destination.
- Directional focus uses visible window geometry when windows have distinct rectangles. In tabbed or fullscreen-style layouts where geometry overlaps, directional focus may use a stable logical order instead, but repeated directional actions must cycle predictably through the windows.
- Near-fullscreen scratchpads are centered floating windows large enough to dominate the current monitor without taking compositor fullscreen state.
- Robust scratchpad behavior means toggling a named scratchpad finds or launches the intended app even when the app starts slowly, changes class or title after launch, is minimized, or is currently on another workspace.
- Approximate window position means enough geometry or ordering information for status-bar window strips and expose-like previews. Pixel-perfect compositor geometry is useful but not required.
- Normal workspaces are the bounded user-facing workspaces. Special, scratchpad, minimized, hidden, internal, and out-of-range workspaces are not normal workspaces.
Supernames the physical modifier key often labeled Windows, Command, GUI, or OS depending on the keyboard.Hypermeans a higher-order logical modifier layer used for monitor, workspace, utility, and cross-context operations.- Prefer implementing
Hyperas its own virtual modifier or equivalent logical mask when the environment supports that. - If a dedicated virtual
Hypermask is not practical,Ctrl+Alt+Superis the fallback chord. - The fallback
Hyperchord intentionally does not includeShift; portableHyperbindings only use the plainHyperlayer and theHyper+Shiftlayer. - Do not require
Hyper+Ctrl,Hyper+Alt, orHyper+Superbindings. Those modifiers may already be part of the fallbackHyperchord. - Binding descriptions should use
SuperandHyperrather than hardware-vendor names.
Required behavior:
- Workspaces are a shared global set, not independent per-monitor namespaces.
- Focusing workspace
Nshows workspaceNon the currently focused monitor. - Moving a window to workspace
Ndoes not require caring which monitor currently owns that workspace. - Sending the focused window to workspace
Nwithout following it is a first-class operation. - Moving the focused window to workspace
Nand following it is a first-class operation. - Sending the focused window to the next empty workspace without following it is a first-class operation.
- Moving the focused window to the next empty workspace and following it is a first-class operation.
- Normal workspaces are bounded to
1..9.
Important behavior:
- Workspace history is tracked per monitor.
- Last-workspace toggle uses the current monitor's workspace history.
- Workspace history cycling works on the current monitor within the bounded workspace set.
- Swapping the current workspace contents with another workspace is available.
- Moving a window to an empty workspace on another monitor is available.
- Moving the focused window to another monitor without following keeps keyboard focus on the original monitor.
- Moving the focused window to another monitor and following it moves keyboard focus to the destination monitor.
- Hidden/special workspaces exist for scratchpad state.
- Hidden/special workspaces exist for minimized state.
- Hidden/special workspaces are excluded from ordinary workspace cycling.
- Hidden/special workspaces are excluded from the status bar's normal workspace list.
Important behavior:
- The model is most-recently-used workspace switching, scoped to the monitor where the action starts.
- Each monitor has its own ordered workspace history. The focused monitor's history is not shared with other monitors.
- Only ordinary bounded workspaces are candidates. Special, scratchpad, minimized, hidden, and out-of-range workspaces are excluded.
- Starting a cycle freezes the candidate list for that cycle. Previewing workspaces while the cycle is active must not rewrite the history order.
- Starting a cycle previews the previous workspace for the current monitor.
- Repeating the forward cycle action continues farther back through that monitor's frozen history.
- A reverse cycle action moves through the same frozen history in the opposite direction.
- Releasing the initiating modifier key commits the currently previewed workspace and updates history exactly once.
- A cancel path may return to the workspace where the cycle started.
This behavior is important for workflow continuity, but it is not a hard requirement for a minimal daily-driver window manager.
Required behavior:
- Directional window focus is available.
- Directional window swapping or movement is available.
- Directional move-to-monitor is available while preserving useful focus.
- Directional monitor focus is available.
- Directional window movement between monitors is available.
- Moving the focused window to an empty workspace on the monitor in a direction is available.
- Directional bindings are defined in the Binding Appendix. Required
directional actions must not depend on
Hyper+Ctrl, becauseCtrlmay already be part of the fallbackHyperchord.
Important behavior:
- Keyboard resize remains available, but it should not displace the directional move-to-monitor binding.
Required behavior:
- Focus-follows-mouse, or an equivalent pointer-driven focus model, is enabled.
- Moving the pointer over a managed window focuses that window without requiring a click.
- Mouse-follows-focus is also enabled: keyboard or programmatic focus changes move the pointer into the newly focused window.
Required behavior:
- Tiling is dynamic.
- Primary layout is equal-width vertical columns.
- Scrolling layouts are not acceptable.
- All ordinary splits are vertical.
- Adding windows dynamically redistributes all tiled windows evenly.
- Newly tiled windows are inserted near the currently focused tile, not appended to the far end of the workspace.
- Removing windows dynamically redistributes all tiled windows evenly.
- Ordinary use should not require manually managing a split tree.
- Tabbed/fullscreen-style monocle layout is available.
- Directional window navigation bindings continue to switch windows in tabbed/fullscreen mode.
- The important layouts are columns and tabbed/fullscreen.
- Dialogs float.
- Dialogs are centered.
- There is a command to jump directly to the columns layout and one to jump directly to the tabbed/fullscreen layout.
Super+Ctrl+Spacejumps directly to the tabbed/fullscreen layout.- Direct fullscreen or floating-fullscreen behavior should not have a keybinding.
- Layout state is per workspace when the compositor supports it.
Important behavior:
- One-window workspaces should have no visible gaps or use smart gaps.
Nice behavior:
- Gaps can be toggled.
- Smart borders can be toggled.
- Layout-related modifiers remain available for experiments.
- Inactive windows are slightly dimmed when supported.
Required behavior:
- There is a visual window overview for inspecting open windows before jumping.
- There is a visual workspace expose for inspecting normal workspaces before jumping.
- There is a rofi-style window picker.
- Window picker entries show icons.
- Window picker entries show titles.
- Window picker entries show workspace labels.
- Go-to-window focuses the selected window wherever it currently lives.
- Bring-window moves a selected non-visible window to the current workspace and focuses it.
- Replace-window swaps the focused window with a selected window where feasible.
Important behavior:
- Overview supports both "go" and "bring" workflows.
- Window overview and workspace expose are distinct surfaces, because window selection and workspace selection are different navigation tasks.
- Window overview supports directional keyboard selection with the same
w/a/s/dspatial model as ordinary window focus. - Window overview supports direct go, bring, and replace-window actions from the selection UI.
- Workspace expose shows bounded normal workspaces, including empty workspaces, with visible workspace numbers.
- Workspace expose can be opened in a bring-window-oriented mode when supported.
- Window switchers hide scratchpad windows unless the user is explicitly using a scratchpad picker.
- Window switchers hide minimized windows unless the user is explicitly using a minimized picker.
- Window switchers hide internal windows.
- Go/bring actions unminimize selected windows when needed.
Required behavior:
- A named scratchpad exists for codex.
- A named scratchpad exists for element.
- A named scratchpad exists for htop.
- A named scratchpad exists for slack.
- A named scratchpad exists for spotify.
- A named scratchpad exists for transmission.
- A named scratchpad exists for volume.
- Scratchpads appear near-fullscreen and centered by default.
- Toggling a scratchpad deactivates fullscreen/tabbed state first.
- Scratchpads are hidden from normal workspace and window listings.
Important behavior:
- A dropdown terminal scratchpad exists.
- Scratchpad matching handles delayed class/title assignment.
- Scratchpad behavior is robust when the app is already running.
- Scratchpad behavior is robust when the app is minimized.
- Scratchpad behavior is robust when the app is on another workspace.
Required behavior:
- Focused window can be minimized.
- Last minimized window can be restored to the current workspace and focused.
- Minimized windows are excluded from normal layout.
- Minimized windows are excluded from ordinary go/bring lists.
Important behavior:
- A minimized picker mode exists.
- Restore-all-minimized exists.
- Other classes in the current workspace can be minimized.
- Windows of the focused class can be restored.
- All minimized windows can be restored.
Important behavior:
- Gather all windows of the focused class onto the current workspace.
- Raise-or-spawn exists for the browser.
- Window menus show class.
- Window menus show title.
- Window menus show workspace.
- Window menus show icon.
Required behavior:
- The status bar can list normal workspaces.
- The status bar can identify the active workspace per monitor.
- The status bar can list windows per workspace.
- The status bar can expose class hints for each listed window.
- The status bar can expose title for each listed window.
- The status bar can expose active state for each listed window.
- The status bar can expose minimized state when available.
- The status bar can expose urgency when available.
- The status bar can expose approximate window position when available.
- Scratchpad workspaces are marked as special or filtered out.
- Minimized workspaces are marked as special or filtered out.
- Internal workspaces are marked as special or filtered out.
Important behavior:
- Workspace labels are stable.
- Workspace icons are stable.
- Window positioning information is available enough for workspace icon strips and future expose-like views.
- Layout information is available enough for workspace icon strips and future expose-like views.
- Layout name is exposed if practical.
- Layout state is exposed if practical.
Important behavior:
- Terminal is
ghostty --gtk-single-instance=false. - Launcher is
rofi -show drun -show-icons. - Run menu is
rofi -show run. - Browser raise/spawn behavior exists.
- Border width is effectively zero.
- The status bar can be toggled per monitor.
- Session startup integrates with the normal graphical-session target.
- Session startup integrates with any required session-specific user target.
Nice behavior:
- Wallpaper behavior remains consistent.
- Wallpaper selection uses
Hyper+comma;Hyper+w/a/s/dare reserved for directional monitor focus. - Idle behavior remains consistent.
- Lock behavior remains consistent.
- Clipboard history behavior remains consistent.
- Screenshot behavior remains consistent.
- Monitor DDC/input switching remains consistent.
- Rofi utility bindings remain consistent.
- Media keys remain consistent.
Required behavior:
Hyperbindings should remain available from a single physical key where practical, even if that key emits the fallback chord internally.- Extra modifiers on
Hyperare limited toShiftfor portable bindings.
Important behavior:
Hyperutility bindings must not displace required directional monitor bindings onHyper+w/a/s/d.
Required behavior:
Super+popens the application launcher.Super+Shift+popens the run menu.Super+Shift+Returnopens a terminal.Super+qreloads the window manager config.Super+Shift+ccloses the focused window.Super+Shift+qexits the window manager session.Super+xopens the command picker withrofi_command.sh.Super+gopens the go-to-window picker.Super+bopens the bring-window picker.Super+Shift+bopens the replace-window picker.Super+Shift+emoves the focused window to the next empty workspace and follows it.Hyper+efocuses the next empty workspace.Hyper+1toggles inactive-window opacity reduction for the focused window.Hyper+5swaps the current workspace with a selected workspace.Hyper+ggathers windows of the focused class onto the current workspace.
Important behavior:
Super+Tabopens the visual window overview.Super+Shift+Tabopens the visual window overview scoped to non-visible windows or bring-window mode when supported.Alt+Tabopens the visual workspace expose.Alt+Shift+Tabopens the visual workspace expose in bring-window mode when supported.- Within visual window overview,
w/a/s/d,h/j/k/l, and arrow keys move the selection directionally. - Within visual window overview,
Return,Space,g, orfactivates the selected window. - Within visual window overview,
b,Shift+Return, orShift+Spacebrings the selected window to the current workspace. - Within visual window overview,
Shift+breplaces the focused window with the selected window when supported. - Within visual window overview,
Escapeorqcloses the overview. Super+\starts or advances current-monitor workspace history cycling.Super+/reverses current-monitor workspace history cycling while the initiatingSuperkey is held.- Releasing the initiating
Superkey commits the workspace history cycle.
Required behavior:
Super+w/a/s/dfocuses windows directionally.Super+Shift+w/a/s/dswaps or moves the focused window directionally.Super+Ctrl+w/a/s/dmoves the focused window to the monitor in that direction while preserving useful focus.Super+Ctrl+Shift+w/a/s/dmoves the focused window to an empty workspace on the monitor in that direction.Hyper+w/a/s/dfocuses monitors directionally.Hyper+Shift+w/a/s/dswaps or moves windows between monitors directionally.Super+zfocuses the next monitor.Super+Shift+zmoves the focused window to the next monitor.
Required behavior:
Super+1..9focuses workspace1..9on the current monitor.Super+Shift+1..9sends the focused window to workspace1..9without following it.Super+Ctrl+1..9sends the focused window to workspace1..9and follows it.
Required behavior:
Super+Alt+ctoggles the codex scratchpad.Super+Alt+etoggles the element scratchpad.Super+Alt+htoggles the htop scratchpad.Super+Alt+ktoggles the slack scratchpad.Super+Alt+stoggles the spotify scratchpad.Super+Alt+ttoggles the transmission scratchpad.Super+Alt+vtoggles the volume scratchpad.
Important behavior:
Super+Alt+gravetoggles the dropdown terminal scratchpad.Super+Alt+Returnenters the minimized-window picker or restores minimized windows, depending on environment support.Super+Altis reserved for app-specific raise/spawn, scratchpad, and scratchpad-adjacent bindings.
Required behavior:
Hyper+vopens clipboard history with a rofi-backed clipboard command such asgreenclip printorcliphist.Hyper+popens the password picker withrofi-pass.Hyper+hopens the screenshot tool with the compositor/session-appropriate screenshot command.Hyper+copens the Codex launcher withrofi_tmcodex.sh.Hyper+Shift+copens the Codex launcher withtmcodex resume.Hyper+kopens the process killer withrofi_kill_process.sh.Hyper+Shift+kopens the kill-all/process-tree killer withrofi_kill_all.sh.Hyper+ropens the systemd/service menu withrofi-systemd.Hyper+slashtoggles the status bar with the status-bar-appropriate command.Hyper+backslashtoggles the monitor input withmpg341cx_input toggle.Hyper+iopens the audio input selector withrofi_select_input.hs.Hyper+oopens the audio output selector withrofi_paswitch.Hyper+yopens the agentic skill picker withrofi_agentic_skill.Hyper+Shift+llocks the session with the compositor/session-appropriate locker.
Important behavior:
- Wallpaper selection is available under
Hyperviarofi_wallpaper.sh, but its exact key must avoid the requiredHyper+w/a/s/ddirectional monitor bindings. - Expose-style overview remains available as a utility binding using the compositor-appropriate implementation.
- Session-destructive operations use shifted or otherwise harder-to-hit variants.
Super+Shift+eis the target replacement for the olderSuper+Shift+hmove-to-next-empty-workspace-and-follow binding.