Layouts🔗

Every workspace in Triad picks its own layout. Switch one without touching the others. Change layout mid-session with a binding or triad msg.

Selecting a Layout🔗

Define the cycle for switch-layout and add per-layout bindings in your config:

layout {
  layout-cycle "scroller" "tile" "monocle"
}

bindings {
  bind "Super+n"       "switch-layout"
  bind "Super+d"       "layout-tile"
  bind "Super+g"       "layout-grid"
  bind "Super+Ctrl+x"  "layout-monocle"
}

Or switch at any time via IPC:

triad msg layout-scroller
triad msg layout-tile
triad msg switch-layout

Scrolling🔗

If you've used Niri or PaperWM, this will feel familiar. Windows sit on an infinite horizontal (or vertical) strip. Navigation is scrolling, not switching.

LayoutDescriptionYou might know it from
scrollerInfinite horizontal strip. Windows scroll left and right past the screen edge.Niri, PaperWM, Hyprland, Mango
vertical-scrollerSame as scroller, oriented vertically.Mango

Algorithmic🔗

The layout algorithm places all windows automatically. Windows reflow when others open or close. No manual splitting required.

LayoutDescriptionYou might know it from
tileOne master window takes a fixed portion; the rest stack on the other side.dwm, awesome, qtile
vertical-tileMaster on top, stack below. Portrait orientation of tile.Mango
right-tileMaster on right, stack on left.Mango
center-tileMaster centered; stack windows flank left and right.Mango
gridWindows fill equal-area cells. Adapts as windows open and close.awesome, qtile
vertical-gridGrid oriented vertically.Mango
monocleOne window fills the screen. Cycle through the rest.dwm, xmonad
deckMaster visible; others stacked behind as layers.dwm (patch)
vertical-deckDeck oriented vertically.Mango
spiralEach new window takes a ratio of the remaining space, spiraling inward.xmonad, qtile
masterSingle master with a configurable number of stack windows.Hyprland
tgmixShows windows from multiple tags under one layout.Mango

BSP🔗

Each new window bisects the focused region. The tree grows automatically as windows open; you resize and rebalance after the fact.

LayoutDescriptionYou might know it from
bspNew windows split the focused leaf automatically. Janet drives the geometry policy.bspwm, Hyprland
bsp-treePersistent binary partition tree. Triad owns insertion, preselection, directional focus, resize, and balance.bspwm
dwindleNew windows split the focused container and spiral inward.Hyprland, Mango

Frame-tree🔗

Persistent named frames exist independently of their contents. Build the frame structure first; windows fill it. Frames survive when empty. If you've used Notion or StumpWM, this model will feel familiar.

LayoutDescriptionYou might know it from
notionJanet geometry policy over Triad-owned persistent frames and tabs.Notion
frame-treePersistent leaf frames hold tabs. Split nodes divide space. Empty frames survive.Notion, Ion, StumpWM

Split-tree🔗

You build the layout manually by splitting containers. Each container runs in split, tabbed, or stacked mode independently. The tree persists across window changes.

LayoutDescriptionYou might know it from
i3Persistent i3-style container tree. Triad owns splits, insertion, movement, resize, and restore.i3, Sway
tabbedWindows stacked as tabs inside a split-tree container.i3, Sway
stackedWindows stacked vertically with visible titlebars inside a split-tree container.i3, Sway

Custom Layouts🔗

Need something Triad doesn't ship? Write it in Janet. Any layout you define becomes a first-class layout ID — usable in layout-cycle, workspace rules, and IPC commands. See Janet Scripting to get started.