A Hyprland workspace overview — your workspaces laid out on a circle, each a live thumbnail of what's actually running.
A radial overlay that covers the focused monitor when you summon it.
Workspaces arranged around a circle. The focused one shows at full size; the rest scale down so the whole layout always fits.
Every window is captured via hyprland-toplevel-export-v1 — even windows on non-visible workspaces — and composed at real geometry.
The focused preview is re-captured continuously, and Hyprland events (open/close/move) refresh the overview as it happens.
Scratchpads appear as a numbered column on the left edge. Click one or press its number to toggle.
Scale falloff, focus width, ring spread, center pull and margins are all configurable via a small TOML file.
Run it with a single nix run, or wire it in as a flake input for NixOS / home-manager.
Try it without installing anything:
nix run github:Uliboooo/hyprPanopticon
Then bind it in your Hyprland config:
bind = SUPER, Tab, exec, hyprpanopticon
# optional: blur the overlay backdrop
layerrule = blur, hyprPanopticon
layerrule = ignorealpha 0.2, hyprPanopticon
Supported systems: x86_64-linux, aarch64-linux. Developed against Hyprland 0.55.
Launch the overlay, then:
| Input | Action |
|---|---|
| ← ↑ / h k | rotate focus counter-clockwise |
| → ↓ / l j | rotate focus clockwise |
| mouse wheel | rotate focus |
| Enter / Space | switch to the focused workspace and close |
| click a preview | switch to that workspace and close |
| 1–9 | toggle the numbered special workspace |
| Esc / q | close without switching |
Optional, at ~/.config/hyprpanopticon/config.toml. All keys optional; out-of-range values are clamped.
min_scale = 0.6 # scale of the preview opposite the focus (0.05..1.0)
falloff = 1.2 # how fast previews shrink away from focus (0.1..10)
focus_width = 0.32 # focused preview width as a fraction of screen (0.1..0.8)
margin = 24 # screen-edge margin in px (0..200)
spread = 0.25 # angular density (0..1)
center_pull = 0.0 # pull small side previews toward center (0..1)
per_monitor_workspaces = false # only the focused monitor's workspaces
show_workspace_index = false # badge each preview with its index