Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.
[hyprland] Lua binds written as "MODS + code:N" don't parse — all binds sharing a modifier fire at once (SUPER+RETURN lands you on workspace 10)
Reported by ryanmoreau-ctrl · filed Sep 16, 2026Closed upstream on 2026-10-12 by the bot omarchybot, as a duplicate of #9335 (R-1172). GitHub close reason: duplicate.
At a glance
- 1 · What is claimed?
- Only the report text below — no validator has restated it as checkable claims yet.
- 2 · What does it affect?
- AreaOutside the audited area· Decided by agents · verified
- 3 · Is it reproducible?
- No validation has been run yet.
- 4 · What remains unclear?
- Not validated yet: no claims, no reproducer.
- 5 · What happens next?
- Decided by agents and verified by a second, independent agent — see the decision.
Original report
Description
Every Omarchy default binding written as MODS + code:N fails to parse in Hyprland's Lua bind API. The code:N token is not resolved: the entire spec string is stored as the key name and keycode stays 0.
The practical effect is that all bindings sharing a modifier set collapse together — pressing that modifier with any key fires all of them, in registration order.
The most visible symptom: `SUPER+RETURN` (or any SUPER chord) fires all ten "Switch to workspace" binds in sequence, 1 → 10, leaving the focused monitor on workspace 10. The terminal you just launched then opens there. From the user's side it looks like "opening a terminal creates workspace 10 on the wrong monitor".
~/.config/hypr/bindings.lua and monitors.lua were stock defaults when this was found.
Steps to reproduce
hyprctl eval 'hl.bind("SUPER + code:10", hl.dsp.exec_cmd("true"), { description = "TEST" })'
hyprctl binds | grep -A4 "description: TEST"Actual:
key: SUPER + code:10 <- whole string stored as the key name
keycode: 0 <- never parsed
catchall: false
description: TESTCompare a plain key name, which parses correctly:
hyprctl eval 'hl.bind("SUPER + 1", hl.dsp.exec_cmd("true"), { description = "TEST2" })' key: 1
keycode: 0
description: TEST2To see it end to end on a stock install: press SUPER+RETURN twice with two monitors connected. The second terminal lands on workspace 10.
Expected
"SUPER + code:10" should register with the keycode resolved (key empty / keycode: 10), matching only that physical key — as the equivalent bind = SUPER, code:10, ... does in the old .conf syntax.
Evidence
I rebound the ten SUPER + code:10..19 workspace keys to a timestamp logger, then pressed a single SUPER chord. All ten fired in ~14 ms:
15:11:40.101 ws1 15:11:40.108 ws5 15:11:40.113 ws9
15:11:40.103 ws2 15:11:40.108 ws6 15:11:40.114 ws10
15:11:40.105 ws3 15:11:40.110 ws7
15:11:40.105 ws4 15:11:40.110 ws8The matching Hyprland event stream shows the resulting walk, ending on workspace 10, with the window opening there afterwards:
workspace>>3
createworkspace>>4 workspace>>4
createworkspace>>5 workspace>>5
... 6, 7, 8, 9 ...
createworkspace>>10 workspace>>10
openwindow>>5cc0a0dd3c60,10,foot,footWith those ten binds rebound to plain digits, the walk stops entirely.
Ruled out first, for what it's worth: the terminal launch path (omarchy-launch-terminal run directly opens on the correct workspace, zero createworkspace events), SUPER+TAB / SUPER+scroll (e+1), config reloads, hooks, the clamshell monitor watcher, and z13ctl. Programmatic focusmonitor / cursor.move to the other monitor also never triggers it — only a real SUPER chord does.
Scope
60 default bindings are affected. hyprctl binds on a stock install shows every one of these with the unparsed key string:
bindings/tiling.lua:20-24— switch / move / move-silently to workspaces 1-10 (30 binds)bindings/tiling.lua:52-65— window resize,code:20/code:21(12 binds)bindings/tiling.lua:91— switch to group window 1-5 (5 binds)bindings/utilities.lua:111— bar panels 1-9 (9 binds)bindings/utilities.lua:39-40— webcam overlay resize,code:34/code:35(2 binds)bindings/utilities.lua:7— Omarchy menu,code:201(1 bind)
So SUPER+SHIFT+<anything> also fires all ten "move window to workspace" binds (window ends up on 10), and SUPER+CTRL+<anything> fires all nine bar-panel toggles.
Workaround
Rebinding with plain key names in ~/.config/hypr/bindings.lua fixes it — SUPER + 1 … SUPER + 0, minus / equal for the resize pairs, bracketleft / bracketright for the webcam overlay. After that hyprctl binds shows key: 1 … key: 0 and the behaviour is correct.
Open question
I confirmed the parse failure and the observable "all binds fire together" behaviour, but not why an unresolvable keysym matches — catchall reports false. So the correct fix may be in Omarchy's bind strings, or upstream in Hyprland's Lua bind parser. Worth a maintainer's call.
System
- Omarchy: 4.0.4-1
- Hyprland: 0.56.2-2
- Kernel: 7.2.5-3-omarchy
- CPU: AMD Ryzen AI MAX+ 395 w/ Radeon 8060S
- GPU: AMD Strix Halo (Radeon 8060S)
- Hardware: ASUS ROG Flow Z13 (GZ302EA)
- Two external monitors (the workspace symptom needs >1 monitor to be obvious; the bind mis-parse itself does not)
View raw text
## Description
Every Omarchy default binding written as `MODS + code:N` fails to parse in Hyprland's Lua bind API. The `code:N` token is not resolved: the **entire spec string** is stored as the key name and `keycode` stays `0`.
The practical effect is that all bindings sharing a modifier set collapse together — pressing that modifier with *any* key fires *all* of them, in registration order.
The most visible symptom: **`SUPER+RETURN` (or any SUPER chord) fires all ten "Switch to workspace" binds in sequence, 1 → 10, leaving the focused monitor on workspace 10.** The terminal you just launched then opens there. From the user's side it looks like "opening a terminal creates workspace 10 on the wrong monitor".
`~/.config/hypr/bindings.lua` and `monitors.lua` were stock defaults when this was found.
## Steps to reproduce
```bash
hyprctl eval 'hl.bind("SUPER + code:10", hl.dsp.exec_cmd("true"), { description = "TEST" })'
hyprctl binds | grep -A4 "description: TEST"
```
Actual:
```
key: SUPER + code:10 <- whole string stored as the key name
keycode: 0 <- never parsed
catchall: false
description: TEST
```
Compare a plain key name, which parses correctly:
```bash
hyprctl eval 'hl.bind("SUPER + 1", hl.dsp.exec_cmd("true"), { description = "TEST2" })'
```
```
key: 1
keycode: 0
description: TEST2
```
To see it end to end on a stock install: press `SUPER+RETURN` twice with two monitors connected. The second terminal lands on workspace 10.
## Expected
`"SUPER + code:10"` should register with the keycode resolved (key empty / `keycode: 10`), matching only that physical key — as the equivalent `bind = SUPER, code:10, ...` does in the old `.conf` syntax.
## Evidence
I rebound the ten `SUPER + code:10..19` workspace keys to a timestamp logger, then pressed a single SUPER chord. All ten fired in ~14 ms:
```
15:11:40.101 ws1 15:11:40.108 ws5 15:11:40.113 ws9
15:11:40.103 ws2 15:11:40.108 ws6 15:11:40.114 ws10
15:11:40.105 ws3 15:11:40.110 ws7
15:11:40.105 ws4 15:11:40.110 ws8
```
The matching Hyprland event stream shows the resulting walk, ending on workspace 10, with the window opening there afterwards:
```
workspace>>3
createworkspace>>4 workspace>>4
createworkspace>>5 workspace>>5
... 6, 7, 8, 9 ...
createworkspace>>10 workspace>>10
openwindow>>5cc0a0dd3c60,10,foot,foot
```
With those ten binds rebound to plain digits, the walk stops entirely.
Ruled out first, for what it's worth: the terminal launch path (`omarchy-launch-terminal` run directly opens on the correct workspace, zero `createworkspace` events), `SUPER+TAB` / `SUPER+scroll` (`e+1`), config reloads, hooks, the clamshell monitor watcher, and `z13ctl`. Programmatic `focusmonitor` / `cursor.move` to the other monitor also never triggers it — only a real SUPER chord does.
## Scope
**60 default bindings** are affected. `hyprctl binds` on a stock install shows every one of these with the unparsed key string:
- `bindings/tiling.lua:20-24` — switch / move / move-silently to workspaces 1-10 (30 binds)
- `bindings/tiling.lua:52-65` — window resize, `code:20` / `code:21` (12 binds)
- `bindings/tiling.lua:91` — switch to group window 1-5 (5 binds)
- `bindings/utilities.lua:111` — bar panels 1-9 (9 binds)
- `bindings/utilities.lua:39-40` — webcam overlay resize, `code:34` / `code:35` (2 binds)
- `bindings/utilities.lua:7` — Omarchy menu, `code:201` (1 bind)
So `SUPER+SHIFT+<anything>` also fires all ten "move window to workspace" binds (window ends up on 10), and `SUPER+CTRL+<anything>` fires all nine bar-panel toggles.
## Workaround
Rebinding with plain key names in `~/.config/hypr/bindings.lua` fixes it — `SUPER + 1` … `SUPER + 0`, `minus` / `equal` for the resize pairs, `bracketleft` / `bracketright` for the webcam overlay. After that `hyprctl binds` shows `key: 1` … `key: 0` and the behaviour is correct.
## Open question
I confirmed the parse failure and the observable "all binds fire together" behaviour, but not *why* an unresolvable keysym matches — `catchall` reports `false`. So the correct fix may be in Omarchy's bind strings, or upstream in Hyprland's Lua bind parser. Worth a maintainer's call.
## System
- Omarchy: 4.0.4-1
- Hyprland: 0.56.2-2
- Kernel: 7.2.5-3-omarchy
- CPU: AMD Ryzen AI MAX+ 395 w/ Radeon 8060S
- GPU: AMD Strix Halo (Radeon 8060S)
- Hardware: ASUS ROG Flow Z13 (GZ302EA)
- Two external monitors (the workspace symptom needs >1 monitor to be obvious; the bind mis-parse itself does not)
Validation
Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.
Linked
Not linked to any known issue, other report or change yet.
Decision
Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.
- Out of scopeDecided by agents · verified · 2026-10-09 14:06 UTC