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.
Display panel cannot toggle monitors: uses `hyprctl keyword`, which the Lua parser rejects (exit 0)
Reported by kidskript3 · filed Sep 3, 2026Closed upstream on 2026-09-04 by spencerbull, as a duplicate of #9622 (R-4815). GitHub close reason: not_planned.
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?
- Not yet mapped to any requirement or component.
- 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?
- Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.
Original report
What happened
The display panel (omarchy.monitor, SUPER + CTRL + D) lists every connected
output under DISPLAYS with a clickable row to enable/disable it. Clicking a
row does nothing. No monitor is switched, no error is shown, and the checkmark
stays as it was.
The rows are not dead code — toggleDisplay() runs, and it runs this:
// shell/plugins/panels/monitor/Panel.qml:303
actionProc.command = ["hyprctl", "keyword", "monitor", name + (enabled ? ",disable" : ",preferred,auto,auto")]Omarchy configures Hyprland in Lua, so the non-legacy parser is active, and it
rejects hyprctl keyword outright:
$ hyprctl keyword monitor eDP-1,disable
keyword can't work with non-legacy parsers. Use eval.
$ echo $?
0The exit code is 0. actionProc has no way to notice the failure, so the
panel silently reports success and the UI never diverges from what the user
sees on screen.
The same call in the Lua form works:
$ hyprctl eval 'hl.monitor({ output = "eDP-1", disabled = true })'
okExpected
Clicking a display row enables or disables that output.
Steps to reproduce
- Connect a second monitor (any two enabled outputs).
- Press
SUPER + CTRL + D. - Click either row under DISPLAYS.
- Nothing happens.
hyprctl monitors all -jshows both outputs unchanged.
Notes toward a fix
Elsewhere in the tree this is already done correctly — omarchy-hyprland-monitor-clamshell
uses hyprctl eval "hl.monitor({ ... })". The panel appears to be the last
caller still on the legacy syntax.
Two details that cost me time when patching this locally, in case they help:
- Re-enabling needs an explicit `disabled = false`. A rule that merely
restates mode/position/scale returns ok and leaves an already-disabled
output off. Only hl.monitor({ output = "X", disabled = false, ... }) brings
it back.
- `,preferred,auto,auto` does not round-trip. An output switched off forgets
its scale and position, so auto returns it at Hyprland's computed scale and
auto placement rather than what monitors.lua configured. Here a 5120x1440
ultrawide configured at scale = 1.25 came back at scale = 1, and the two
monitors swapped sides. Remembering scale and position while the output is
still on, and restoring them explicitly, avoids this.
System
- Omarchy 4.0.2-1
- Hyprland 0.56.2
- Intel Core i7-12700H / NVIDIA RTX 3070 Ti Laptop GPU
- Outputs: internal laptop panel (2560x1440) + external ultrawide (5120x1440@144), both at scale 1.25
No debug log attached — the failure is fully contained in the four lines of
shell output above, and omarchy debug carries considerably more about this
machine than the bug needs.
View raw text
### What happened
The display panel (`omarchy.monitor`, `SUPER + CTRL + D`) lists every connected
output under **DISPLAYS** with a clickable row to enable/disable it. Clicking a
row does nothing. No monitor is switched, no error is shown, and the checkmark
stays as it was.
The rows are not dead code — `toggleDisplay()` runs, and it runs this:
```qml
// shell/plugins/panels/monitor/Panel.qml:303
actionProc.command = ["hyprctl", "keyword", "monitor", name + (enabled ? ",disable" : ",preferred,auto,auto")]
```
Omarchy configures Hyprland in Lua, so the non-legacy parser is active, and it
rejects `hyprctl keyword` outright:
```
$ hyprctl keyword monitor eDP-1,disable
keyword can't work with non-legacy parsers. Use eval.
$ echo $?
0
```
The exit code is **0**. `actionProc` has no way to notice the failure, so the
panel silently reports success and the UI never diverges from what the user
sees on screen.
The same call in the Lua form works:
```
$ hyprctl eval 'hl.monitor({ output = "eDP-1", disabled = true })'
ok
```
### Expected
Clicking a display row enables or disables that output.
### Steps to reproduce
1. Connect a second monitor (any two enabled outputs).
2. Press `SUPER + CTRL + D`.
3. Click either row under DISPLAYS.
4. Nothing happens. `hyprctl monitors all -j` shows both outputs unchanged.
### Notes toward a fix
Elsewhere in the tree this is already done correctly — `omarchy-hyprland-monitor-clamshell`
uses `hyprctl eval "hl.monitor({ ... })"`. The panel appears to be the last
caller still on the legacy syntax.
Two details that cost me time when patching this locally, in case they help:
- **Re-enabling needs an explicit `disabled = false`.** A rule that merely
restates `mode`/`position`/`scale` returns `ok` and leaves an already-disabled
output off. Only `hl.monitor({ output = "X", disabled = false, ... })` brings
it back.
- **`,preferred,auto,auto` does not round-trip.** An output switched off forgets
its scale and position, so `auto` returns it at Hyprland's computed scale and
auto placement rather than what `monitors.lua` configured. Here a 5120x1440
ultrawide configured at `scale = 1.25` came back at `scale = 1`, and the two
monitors swapped sides. Remembering scale and position while the output is
still on, and restoring them explicitly, avoids this.
### System
- Omarchy 4.0.2-1
- Hyprland 0.56.2
- Intel Core i7-12700H / NVIDIA RTX 3070 Ti Laptop GPU
- Outputs: internal laptop panel (2560x1440) + external ultrawide (5120x1440@144), both at scale 1.25
No debug log attached — the failure is fully contained in the four lines of
shell output above, and `omarchy debug` carries considerably more about this
machine than the bug needs.
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.
No decision has been recorded yet.