Two screens, two desks, ten workspaces — isolated per screen.
A multi-monitor Omarchy setup usually behaves like one big screen: the same workspace strip on every bar, the same highlight, the same scale. Z-Desks breaks it apart and turns each monitor into a desk of its own.
| Workspaces | Scale | |
|---|---|---|
| Screen A | 1 2 3 4 5 | the scale that fits it |
| Screen B | 6 7 8 9 10 | the scale that fits it |
| 10 workspaces total | per screen |
- Isolated workspaces. Each screen owns its own range, so two displays give you 10 workspaces total. A bar lists only the workspaces of the monitor it is drawn on, and highlights the one that screen is focused on — never the other screen's. Switching desks on one screen never disturbs the other.
- Independent scale. Because each screen is its own desk, each one keeps the scale that fits it (a hi-DPI 4K next to a lower-DPI panel, or any pair of monitors), so text and UI feel right on both.
Built-in omarchy.workspaces Z-Desks
Screen A ● 1 2 3 4 5 6 7 8 9 10 Screen A ● 1 2 3 4 5
Screen B ● 1 2 3 4 5 6 7 8 9 10 Screen B ● 6 7 8 9 10
└── same strip on both ──┘ └── one desk per screen ──┘
The built-in workspaces widget lists workspaces globally and highlights the globally focused one, so every bar displays the same numbers and the same focus. Z-Desks resolves the output its own bar is drawn on and lists only the workspaces Hyprland assigned to that output. Each screen gets an independent strip, which is what makes a 5 + 5 layout actually feel like two desks instead of one 10-workspace strip duplicated twice.
- Each bar is self-scoped to its monitor — no shared strip, no wrong highlight.
- Two screens isolate into two desks: 10 workspaces, 5 per screen, no overlap.
- Click a workspace to focus it.
- Occupied workspaces are full-opacity, empty ones are dimmed.
- Horizontal or vertical bars (
root.verticalaware). - Pure
bar-widget: lightweight, no service, no panel, no extra process.
- Omarchy (Quattro shell)
- Hyprland
- Per-screen workspace rules (below) — without them there is no isolation to show
- Per-screen scale is set on the Hyprland side (Display panel, or
scale-screen); Z-Desks reads the desks, it does not change the scale itself
omarchy plugin add https://github.com/zantak/z-desks.git --enableThen turn off the built-in Workspaces widget (omarchy.workspaces) so you don't end up with a
duplicate strip in the same bar.
Pin the workspaces to a monitor with persistent workspace rules in
~/.config/hypr/workspaces.lua, so each desk stays visible even when empty. Use your own
monitor names (hyprctl monitors lists them):
local desks = {
{ monitor = "<monitor-1>", from = 1, to = 5 },
{ monitor = "<monitor-2>", from = 6, to = 10 },
}
for _, desk in ipairs(desks) do
for n = desk.from, desk.to do
hl.workspace_rule({ workspace = tostring(n), monitor = desk.monitor, persistent = true })
end
endRequire it from ~/.config/hypr/hyprland.lua (require("hypr.workspaces")), then reload:
hyprctl reloadWithout persistent rules the widget still works — it just shows the workspaces that currently exist on each output.
The two desks don't have to share a scale. Set it per monitor in the Display panel, or from the
CLI — a higher scale on a hi-DPI display, a lower one on the other — and each desk will feel
right. (Hyprland's monitor scale; Z-Desks doesn't touch it.)
omarchy plugin remove ztk.z-desks- Hyprland has a single global numbering space, so ranges must not overlap between screens.
Z-Desks does not (yet) duplicate numbers across monitors — that's what
hyprsplitis for. - The shell's text size is global (one
Stylesingleton); only the monitor scale is per screen.
MIT — see LICENSE.