Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A 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.

Inbox
ReportR-499GitHub issuePublicDecided· Out of scope

[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.

Decided: Out of scope — decided by agents · verified 3 days ago.

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

[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)revision 1 · captured 2026-09-28 21:23 UTC via poll

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: TEST

Compare 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: 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)
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