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

Lock screen blanking crashes the shell on single-monitor setups, causing a lock/relaunch loop

Reported by ContentAid · filed Sep 16, 2026 · open at source

Decided: Duplicate — decided by agents · verified 3 days ago.

R-1659 is the earliest report of this defect — filed Aug 19, 2026, open upstream. This report (filed Sep 16, 2026) describes the same defect, so it is folded under it in the inbox.

Decided by agents · verified· Oct 9, 2026

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?
AreaIn 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?
Decided by agents and verified by a second, independent agent — see the decision.

Original report

Lock screen blanking crashes the shell on single-monitor setups, causing a lock/relaunch looprevision 1 · captured 2026-09-28 21:23 UTC via poll

Summary

On a single-monitor setup, omarchy-brightness-display off DPMS-disables the only output. Quickshell cannot survive the output count reaching zero while an ext-session-lock is held, so the shell crashes and relaunches. The relaunched shell recovers a lock it does not own, re-locks, and blanks again five seconds later. This loops for as long as the session stays locked, and each relaunch repaints the bar and panels — which looks like the display flashing.

Environment

  • Omarchy 4.0.0.alpha
  • Hyprland 0.56.2
  • Single DisplayPort monitor (Samsung LS24AG32x), NVIDIA RTX 5060 Ti, driver 610.57.04
  • Lock plugin: omarchy.lock (the third-party lock-explorer fork is affected identically — it is a clone of omarchy.lock and inherits the same call)

The loop

plugins/lock/Service.qml:411 runs:

command: ["bash", "-c", "omarchy-brightness-keyboard off; omarchy-brightness-display off"]

omarchy-brightness-display off dispatches hl.dsp.dpms({ action = "disable" }), which takes the only output down. Journal from one cycle:

13:24:44  qt.qpa.wayland: There are no outputs - creating placeholder screen
13:24:46  quickshell.hyprland.ipc: Got removal for monitor "FALLBACK" which was not previously tracked.
13:24:46  WARN: The Wayland connection experienced a fatal error: Invalid argument
13:24:46  Omarchy shell exited with status 255; relaunching.
13:24:48  omarchy lock ... lock-stranded: recovering
13:24:48  omarchy lock ... lock-requested
13:24:48  omarchy lock ... secure=true

Five seconds after secure=true the blank timer fires again and the cycle repeats, roughly every 67 seconds.

Measured impact

One locked session, 13:16 to 13:34 (18 minutes):

  • 13 shell relaunches (exited with status 255)
  • 12 lock-stranded: recovering events
  • 49 drm: Connector DP-1 disconnected in the Hyprland log
  • 52 modesets

The lock is the variable, not the blank

Running the same omarchy-brightness-display off, waiting, then on, with the session unlocked:

  • 3-second blank: shell PID unchanged, no fatal error
  • 12-second blank: shell PID unchanged, no fatal error

The crash only reproduces while a session lock is held.

Steps to reproduce

  1. Single monitor, no second output.
  2. Lock the session (omarchy-system-lock).
  3. Wait past the blank timer and leave it locked for two minutes.
  4. journalctl --user -b | grep -cE 'lock-stranded|exited with status 255' — non-zero.

Suggested fix

Do not cut the output while the session is locked. On a DDC-capable external monitor, dimming the backlight to its minimum gives a dark panel while keeping the output alive, so the shell survives. omarchy-hyprland-session-locked and omarchy-brightness-display-ddc already exist and are enough to build this inside omarchy-brightness-display's off/on branches, saving and restoring the user's brightness level around the blank.

Locally this took the same four-minute locked session from 3-4 crashes to zero crashes, zero stranded recoveries, and zero new connector disconnects.

I am happy to open a PR if that approach looks right, or if you would rather keep DPMS and guard elsewhere, I can adapt.

View raw text
## Summary

On a single-monitor setup, `omarchy-brightness-display off` DPMS-disables the only output. Quickshell cannot survive the output count reaching zero while an `ext-session-lock` is held, so the shell crashes and relaunches. The relaunched shell recovers a lock it does not own, re-locks, and blanks again five seconds later. This loops for as long as the session stays locked, and each relaunch repaints the bar and panels — which looks like the display flashing.

## Environment

- Omarchy 4.0.0.alpha
- Hyprland 0.56.2
- Single DisplayPort monitor (Samsung LS24AG32x), NVIDIA RTX 5060 Ti, driver 610.57.04
- Lock plugin: `omarchy.lock` (the third-party `lock-explorer` fork is affected identically — it is a clone of `omarchy.lock` and inherits the same call)

## The loop

`plugins/lock/Service.qml:411` runs:

```qml
command: ["bash", "-c", "omarchy-brightness-keyboard off; omarchy-brightness-display off"]
```

`omarchy-brightness-display off` dispatches `hl.dsp.dpms({ action = "disable" })`, which takes the only output down. Journal from one cycle:

```
13:24:44  qt.qpa.wayland: There are no outputs - creating placeholder screen
13:24:46  quickshell.hyprland.ipc: Got removal for monitor "FALLBACK" which was not previously tracked.
13:24:46  WARN: The Wayland connection experienced a fatal error: Invalid argument
13:24:46  Omarchy shell exited with status 255; relaunching.
13:24:48  omarchy lock ... lock-stranded: recovering
13:24:48  omarchy lock ... lock-requested
13:24:48  omarchy lock ... secure=true
```

Five seconds after `secure=true` the blank timer fires again and the cycle repeats, roughly every 67 seconds.

## Measured impact

One locked session, 13:16 to 13:34 (18 minutes):

- 13 shell relaunches (`exited with status 255`)
- 12 `lock-stranded: recovering` events
- 49 `drm: Connector DP-1 disconnected` in the Hyprland log
- 52 modesets

## The lock is the variable, not the blank

Running the same `omarchy-brightness-display off`, waiting, then `on`, with the session **unlocked**:

- 3-second blank: shell PID unchanged, no fatal error
- 12-second blank: shell PID unchanged, no fatal error

The crash only reproduces while a session lock is held.

## Steps to reproduce

1. Single monitor, no second output.
2. Lock the session (`omarchy-system-lock`).
3. Wait past the blank timer and leave it locked for two minutes.
4. `journalctl --user -b | grep -cE 'lock-stranded|exited with status 255'` — non-zero.

## Suggested fix

Do not cut the output while the session is locked. On a DDC-capable external monitor, dimming the backlight to its minimum gives a dark panel while keeping the output alive, so the shell survives. `omarchy-hyprland-session-locked` and `omarchy-brightness-display-ddc` already exist and are enough to build this inside `omarchy-brightness-display`'s `off`/`on` branches, saving and restoring the user's brightness level around the blank.

Locally this took the same four-minute locked session from 3-4 crashes to zero crashes, zero stranded recoveries, and zero new connector disconnects.

I am happy to open a PR if that approach looks right, or if you would rather keep DPMS and guard elsewhere, I can adapt.

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

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.

  • DuplicateR-1659Decided by agents · verified · 2026-10-09 10:08 UTC