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.
Lock's unconditional DPMS blank drops both HDMI outputs on NVIDIA 610.57.04 — session stranded at `no-real-screen` until reboot
Reported by aishag80g-stack · filed Oct 6, 2026 · open at source
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?
- 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. So far: partly in the audited area (lock) — decided by agents · verified. The outcome (valid, duplicate, not a bug, …) is not decided yet. See the decision.
Original report
What happened
Idle → screensaver → lock. On wake the session is alive (network, audio, services) but both HDMI panels stay black, and only a reboot recovers. Three times in three days.
Host: Omarchy 4.0.0.alpha (/usr/share/omarchy/version; package omarchy 4.0.4-1), Arch, Hyprland 4.0.0.alpha, NVIDIA RTX 4060 Ti, driver 610.57.04 (open kernel module, nvidia_drm.modeset=1, NVreg_PreserveVideoMemoryAllocations=1), two HDMI monitors (Gigabyte GS27QC on HDMI-A-1, ViewSonic VX3218C-QHD on HDMI-A-2).
Timeline (boot 2026-10-06, local time)
11:38:15 omarchy idle: idle-cycle-start screensaver=360 lock=1800
12:02:15 omarchy idle: lock-system: lock-timeout → process-start: lock omarchy-system-lock
12:02:15 omarchy lock: lock-requested → lock-pending: screen-stabilizing
12:02:16 omarchy lock: secure=true (lock up; blank step ~5 s later)
12:15:46 omarchy idle: idle-monitor: active → process-start: wake omarchy-system-wake (exit 0)
12:15:47 hyprmoncfgd: monitor event received: monitorremoved connector=HDMI-A-2
12:15:47 hyprmoncfgd: monitor event received: monitorremoved connector=HDMI-A-1
12:15:47 hyprmoncfgd: monitor event received: monitoradded connector=FALLBACK
12:15:47 omarchy-shell: INFO qt.qpa.wayland: There are no outputs - creating placeholder screen
12:15:47 omarchy-shell: WARN: Layershell screen does not correspond to a real screen.
12:15:47 omarchy-shell: DEBUG: Not creating lock surface for screen QScreen(..., name="")
as it is not backed by a valid wayland output.
12:15:55 omarchy lock: lock-stranded: recovering → lock-requested → lock-pending: screen-stabilizing
12:15:56 omarchy lock: lock-pending: no-real-screen ← stuck here until rebootSame two lines (lock-stranded: recovering → lock-pending: no-real-screen) on 2026-10-04 14:54 and 2026-10-05 12:10.
Suspend/resume itself is healthy (12:20:38 suspend requested → PM: suspend entry (deep) → 12:21:08 Waking up from S3 → 12:21:10 System returned from sleep → 12:21:31 unlocked), and the NVIDIA sleep hooks (nvidia-suspend.service, nvidia-resume.service) are enabled. The failure is specific to the DPMS blank taken by the lock path. No NVRM/DRM errors in the kernel ring at that moment — the connectors disappear at the nvidia-drm/HPD level without a kernel message.
Mechanism
shell/plugins/lock/Service.qml blanks the displays unconditionally 5 s after a lock:
Process {
id: blankProcess
command: ["bash", "-c", "omarchy-brightness-keyboard off; omarchy-brightness-display off"]
}omarchy-brightness-display off → hyprctl dispatch 'hl.dsp.dpms({ action = "disable" })'. On this GPU/monitor pair the DPMS re-enable does not re-train the HDMI links: Hyprland removes both connectors and creates a headless FALLBACK output, so the lock surface has no output to draw on and nothing recovers it.
Controlled reproduction (2026-10-06 12:48)
Running the same blank by hand, with nothing locked:
12:48:31 omarchy-brightness-display off (real script → hl.dsp.dpms disable)
hyprctl monitors -j → HDMI-A-1 dpms=false, HDMI-A-2 dpms=false
12:48:45 hyprctl monitors -j → HDMI-A-2 missing from the list entirely
12:48:47 hyprmoncfgd: triggered: monitoradded:1,HDMI-A-2,ViewSonic VX3218C-QHD
12:48:51 both monitors back, dpms=1So the blank really does drop and re-add the connectors. In the lock case the re-add lands on FALLBACK and the lock surface is stranded; unlocked, the layout recovers on its own.
Skipping the blank fixes it — verified
A local override of omarchy-brightness-display that returns 0 for off (everything else passes through) and logs the skip:
12:56:14 lock-requested → lock-pending: screen-stabilizing
12:56:15 secure=true
12:56:20 omarchy-brightness-display[32238]: DPMS blank skipped
(local override; caller=quickshell args=off)
12:56:17 … 12:57:00 sampling: HDMI-A-1 + HDMI-A-2 both dpms=true, realScreens=2
zero monitorremoved/monitoradded, no FALLBACK,
no lock-stranded / lock-pending: no-real-screen
12:56:25 unlocked (PAM omarchy-lock-password)What I'm asking for
- A setting to skip the display-blank step of the lock cycle. I found none:
grep -rn blank /usr/share/omarchy/shell/shows only the unconditionalblankProcess/idleBlankTimer, and this Hyprland build has nomisc:no_dpms(hyprctl getoption misc:no_dpms→ "no such option"; onlymisc:key_press_enables_dpms/misc:mouse_move_enables_dpms). A driver bug in DPMS re-training should not have to take the whole session down. For mains-powered monitors, never blanking at lock costs nothing.
- *A supported location to shadow `omarchy-` scripts.** This is the part that made the workaround hard, and I think it is worth documenting regardless of (1):
default/bash/env-bootstrapappends~/.local/binlast on purpose ("so system binaries keep precedence"), so a shim there can never shadowomarchy-brightness-display. My first attempt (2026-10-05) was inert for exactly this reason and the failure recurred.- Prepending a directory from
~/.config/uwsm/env.d/*.also does not work:default/hypr/envs.luastrips$OMARCHY_PATH/binfromPATHand re-inserts it at position 1 viahl.env("PATH", …)for everything the compositor spawns, so anything set earlier always ends up second:
/usr/share/omarchy/bin ← wins
~/.local/share/omarchy-overrides/bin ← inert- What does work is a user Hyprland module loaded after the defaults (
~/.config/hypr/env.lua+require("hypr.env")in~/.config/hypr/hyprland.lua) that re-prepends the directory withhl.env("PATH", …). That is a documented-in-my-head trick, not a supported interface — it depends on load order insidedefault/hypr/.
Related
- #14227 — same
idleBlankTimer/runBlank()path, different failure mode (re-blanks a slow-resyncing panel so the lock is unreadable). Worth fixing together: both are the unconditional blank meeting a display that does not behave instantly. - #14237 — external monitor blacks out after wake on a different NVIDIA card.
Workaround now in place
~/.local/share/omarchy-overrides/bin/omarchy-brightness-display (skips off, logs the skip to the journal) + ~/.config/hypr/env.lua prepending that dir to PATH. omarchy restart shell re-spawns the shell from Hyprland, so it took effect without a reboot.
View raw text
## What happened
Idle → screensaver → lock. On wake the session is alive (network, audio, services) but **both HDMI panels stay black**, and only a reboot recovers. Three times in three days.
Host: Omarchy 4.0.0.alpha (`/usr/share/omarchy/version`; package `omarchy 4.0.4-1`), Arch, Hyprland 4.0.0.alpha, NVIDIA RTX 4060 Ti, driver **610.57.04** (open kernel module, `nvidia_drm.modeset=1`, `NVreg_PreserveVideoMemoryAllocations=1`), two HDMI monitors (Gigabyte GS27QC on `HDMI-A-1`, ViewSonic VX3218C-QHD on `HDMI-A-2`).
## Timeline (boot 2026-10-06, local time)
```
11:38:15 omarchy idle: idle-cycle-start screensaver=360 lock=1800
12:02:15 omarchy idle: lock-system: lock-timeout → process-start: lock omarchy-system-lock
12:02:15 omarchy lock: lock-requested → lock-pending: screen-stabilizing
12:02:16 omarchy lock: secure=true (lock up; blank step ~5 s later)
12:15:46 omarchy idle: idle-monitor: active → process-start: wake omarchy-system-wake (exit 0)
12:15:47 hyprmoncfgd: monitor event received: monitorremoved connector=HDMI-A-2
12:15:47 hyprmoncfgd: monitor event received: monitorremoved connector=HDMI-A-1
12:15:47 hyprmoncfgd: monitor event received: monitoradded connector=FALLBACK
12:15:47 omarchy-shell: INFO qt.qpa.wayland: There are no outputs - creating placeholder screen
12:15:47 omarchy-shell: WARN: Layershell screen does not correspond to a real screen.
12:15:47 omarchy-shell: DEBUG: Not creating lock surface for screen QScreen(..., name="")
as it is not backed by a valid wayland output.
12:15:55 omarchy lock: lock-stranded: recovering → lock-requested → lock-pending: screen-stabilizing
12:15:56 omarchy lock: lock-pending: no-real-screen ← stuck here until reboot
```
Same two lines (`lock-stranded: recovering` → `lock-pending: no-real-screen`) on 2026-10-04 14:54 and 2026-10-05 12:10.
Suspend/resume itself is healthy (`12:20:38 suspend requested → PM: suspend entry (deep) → 12:21:08 Waking up from S3 → 12:21:10 System returned from sleep → 12:21:31 unlocked`), and the NVIDIA sleep hooks (`nvidia-suspend.service`, `nvidia-resume.service`) are enabled. **The failure is specific to the DPMS blank taken by the lock path.** No NVRM/DRM errors in the kernel ring at that moment — the connectors disappear at the nvidia-drm/HPD level without a kernel message.
## Mechanism
`shell/plugins/lock/Service.qml` blanks the displays unconditionally 5 s after a lock:
```qml
Process {
id: blankProcess
command: ["bash", "-c", "omarchy-brightness-keyboard off; omarchy-brightness-display off"]
}
```
`omarchy-brightness-display off` → `hyprctl dispatch 'hl.dsp.dpms({ action = "disable" })'`. On this GPU/monitor pair the DPMS re-enable does not re-train the HDMI links: Hyprland removes both connectors and creates a headless `FALLBACK` output, so the lock surface has no output to draw on and nothing recovers it.
### Controlled reproduction (2026-10-06 12:48)
Running the same blank by hand, with nothing locked:
```
12:48:31 omarchy-brightness-display off (real script → hl.dsp.dpms disable)
hyprctl monitors -j → HDMI-A-1 dpms=false, HDMI-A-2 dpms=false
12:48:45 hyprctl monitors -j → HDMI-A-2 missing from the list entirely
12:48:47 hyprmoncfgd: triggered: monitoradded:1,HDMI-A-2,ViewSonic VX3218C-QHD
12:48:51 both monitors back, dpms=1
```
So the blank really does drop and re-add the connectors. In the lock case the re-add lands on `FALLBACK` and the lock surface is stranded; unlocked, the layout recovers on its own.
## Skipping the blank fixes it — verified
A local override of `omarchy-brightness-display` that returns 0 for `off` (everything else passes through) and logs the skip:
```
12:56:14 lock-requested → lock-pending: screen-stabilizing
12:56:15 secure=true
12:56:20 omarchy-brightness-display[32238]: DPMS blank skipped
(local override; caller=quickshell args=off)
12:56:17 … 12:57:00 sampling: HDMI-A-1 + HDMI-A-2 both dpms=true, realScreens=2
zero monitorremoved/monitoradded, no FALLBACK,
no lock-stranded / lock-pending: no-real-screen
12:56:25 unlocked (PAM omarchy-lock-password)
```
## What I'm asking for
1. **A setting to skip the display-blank step of the lock cycle.** I found none: `grep -rn blank /usr/share/omarchy/shell/` shows only the unconditional `blankProcess` / `idleBlankTimer`, and this Hyprland build has no `misc:no_dpms` (`hyprctl getoption misc:no_dpms` → "no such option"; only `misc:key_press_enables_dpms` / `misc:mouse_move_enables_dpms`). A driver bug in DPMS re-training should not have to take the whole session down. For mains-powered monitors, never blanking at lock costs nothing.
2. **A supported location to shadow `omarchy-*` scripts.** This is the part that made the workaround hard, and I think it is worth documenting regardless of (1):
- `default/bash/env-bootstrap` appends `~/.local/bin` **last** on purpose ("so system binaries keep precedence"), so a shim there can never shadow `omarchy-brightness-display`. My first attempt (2026-10-05) was inert for exactly this reason and the failure recurred.
- Prepending a directory from `~/.config/uwsm/env.d/*.` also does not work: `default/hypr/envs.lua` strips `$OMARCHY_PATH/bin` from `PATH` and re-inserts it at **position 1** via `hl.env("PATH", …)` for everything the compositor spawns, so anything set earlier always ends up second:
```
/usr/share/omarchy/bin ← wins
~/.local/share/omarchy-overrides/bin ← inert
```
- What does work is a user Hyprland module loaded after the defaults (`~/.config/hypr/env.lua` + `require("hypr.env")` in `~/.config/hypr/hyprland.lua`) that re-prepends the directory with `hl.env("PATH", …)`. That is a documented-in-my-head trick, not a supported interface — it depends on load order inside `default/hypr/`.
## Related
- #14227 — same `idleBlankTimer` / `runBlank()` path, different failure mode (re-blanks a slow-resyncing panel so the lock is unreadable). Worth fixing together: both are the unconditional blank meeting a display that does not behave instantly.
- #14237 — external monitor blacks out after wake on a different NVIDIA card.
## Workaround now in place
`~/.local/share/omarchy-overrides/bin/omarchy-brightness-display` (skips `off`, logs the skip to the journal) + `~/.config/hypr/env.lua` prepending that dir to `PATH`. `omarchy restart shell` re-spawns the shell from Hyprland, so it took effect without a reboot.
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
- Fixed bypr/6642· confirmed
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.
- Decided by agents · verified: partly in the audited area (lock)
The outcome (valid, duplicate, not a bug, …) is not decided yet.