Window Tree
Jump to any window from a searchable tree of every monitor, workspace, and window on the machine.

On several monitors with several tags each, "where did that terminal go" is normally answered by cycling workspaces until it turns up. Here it is one search and one keypress.
The tree is ordered by monitor and tag rather than by match quality, so a window you jump to often keeps roughly the same position between summons.
Install
omarchy plugin add https://github.com/chagel/omarchy-window-tree --enable
Then bind a key in ~/.config/hypr/bindings.lua:
o.bind("SUPER + slash", "Window tree", "omarchy-shell shell toggle chagel.window-tree")
SUPER + / matches the / search prompt the picker opens with, but any free
key works. The plugin does not write your Hyprland config — this line is the
one thing you add by hand.
Keys
| Key | |
|---|---|
| type | filter; every space-separated term must match, in any order |
↑ ↓ / Ctrl+P Ctrl+N |
move |
← |
fold the row, or jump to its parent |
→ |
unfold the row, or step into it |
PgUp PgDn Home End |
move faster |
Enter |
focus the selected row |
Esc |
clear the filter, then close |
Enter on a window focuses it, following it to whatever monitor and workspace it lives on. Enter on a workspace or monitor goes there. Clicking a row does the same as Enter on it.
Folded rows stay folded until the shell restarts, so a monitor you never pick from can be kept out of the way.
Workspace numbering
Workspace ids are shown as the tag its own bar shows. If you partition ids per monitor — 1–9 on the first output, 11–19 on the second, as omarchy-workspace-tags does — then workspace 12 displays as tag 2 under its monitor rather than as 12. An unpartitioned pool is already the identity, so this needs no setting and works either way.
What it touches
Nothing. It reads Hyprland's monitor, workspace, and window state through Quickshell and dispatches focus. It writes no configuration, moves no windows, and closes nothing; there are no destructive keys to mis-press.
Focus is dispatched in the Lua form Hyprland 0.56+ expects
(hl.dsp.focus({ window = "address:0x…" })). The classic
focuswindow address:0x… string is a parse error under a Lua config.
Requirements
Omarchy with the Quickshell-based shell, and Hyprland 0.56+.
Removal
omarchy plugin remove chagel.window-tree
Then delete the keybinding you added.
Development
node test/tree.test.js
TreeModel.js holds the tree building, filtering, flattening, and the focus
dispatches, and is kept free of Qt so it can be exercised outside the shell.
Tree.qml is the overlay around it.
License
MIT