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-5173GitHub issuePublicFixed

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

Partly in the audited area (lock) — decided by agents · verified. Not validated 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?
AreaPartly in the audited arealock· 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?
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

Lock's unconditional DPMS blank drops both HDMI outputs on NVIDIA 610.57.04 — session stranded at `no-real-screen` until rebootrevision 1 · captured 2026-10-06 16:06 UTC via poll

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:

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.
  1. *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.

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.