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-4869GitHub issuePublicReceived

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.

Received and recorded verbatim. Nothing has been checked yet.

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

Display panel cannot toggle monitors: uses `hyprctl keyword`, which the Lua parser rejects (exit 0)revision 1 · captured 2026-10-04 12:10 UTC via poll

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 $?
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.

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.