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

Lock screen stays on AMD iGPU monitor after unlock (NVIDIA + AMD mixed GPU)

Reported by carbonnumbers · filed Aug 20, 2026Closed upstream on 2026-09-18 by its own reporter carbonnumbers, as not planned. Closed by its own reporter — not by itself evidence of a fix.

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

Lock screen stays on AMD iGPU monitor after unlock (NVIDIA + AMD mixed GPU)revision 1 · captured 2026-10-04 12:03 UTC via poll

System details

  • Omarchy 4.0.0-1
  • Hyprland 0.56.2 (efb50993780079460b0cbed1363e2166a2de1d9f)
  • NVIDIA GeForce RTX 4090 (driver 610.57.04 open) + AMD Raphael iGPU (amdgpu)
  • Two monitors on different GPUs:
  • DP-1 / card1 (NVIDIA): Samsung Odyssey G8, 3840x2160@240, scale 1.6
  • DP-4 / card0 (AMD iGPU): Corsair XENEON EDGE, 2560x720@60, scale 1.6, physically below the G8

What's wrong?

Idle lock works. Typing the password on the G8 authenticates and the G8 shows the desktop. The XENEON EDGE stays on the Quickshell lock field (Enter Password) indefinitely.

The lock plugin itself thinks the session is unlocked:

omarchy-shell lock status
{"locked":false,"requested":false,"pending":false,"sessionLocked":false,"secure":false,"realScreens":2,...,"lastEvent":"unlocked"}

loginctl LockedHint=no. omarchy-hyprland-session-locked exits 1 (unlocked). hyprctl layers on DP-4 shows only omarchy-background and omarchy-bar — no lock overlay. Session-lock surfaces are not layer-shell, so that last point does not prove the leftover is gone, but the IPC/logind state does.

grim -o DP-4 hangs until killed. grim -o DP-1 returns immediately. Capturing a region that sits on the Edge layout (-g "400,1350 20x20") also hangs. So the AMD output is in a bad copy/scanout state after unlock, not just a stale wallpaper.

Journal (idle lock, then unlock on the G8)

15:29:04 lock-requested
15:29:04 lock-pending: screen-stabilizing
15:29:09 secure=true
15:31:34 idle-monitor: idle          # idle cycle starts *while already locked*
15:34:04 lock-system: lock-timeout   # second omarchy-system-lock while already locked
16:05:16 idle-monitor: active        # mouse wake, ~36 min later
16:05:29 PAM omarchy-lock-password authenticated successfully
16:05:29 secure=false
16:05:29 session-locked=false
16:05:29 unlocked

There is no session-locked=true line between lock-requested and secure=true.

omarchy-system-wake then no-ops: omarchy-brightness-display on skips the DPMS enable when every monitor already reports dpmsStatus: true. After the mouse wake, both outputs report on, so unlock never modesets the AMD panel.

Steps to reproduce

  1. Mixed-GPU desktop: one monitor on NVIDIA, one on the AMD iGPU. The iGPU panel here is a 2560x720 XENEON EDGE.
  2. Wait for idle lock (idle.lock 300s). Displays blank ~5s later (idleBlankTimer).
  3. Move the mouse / type the password on the NVIDIA monitor.
  4. NVIDIA monitor unlocks. AMD monitor keeps showing Enter Password.

Related

  • #2449 was the hyprlock-era dual-monitor leftover. This is Quattro / WlSessionLock.
  • #7399 is the DPMS wake skip-guard on a slow-sync panel. Same omarchy-brightness-display on guard, different symptom.

Local workaround that recovered the panel

Recreating only DP-4:

hl.monitor({ output = "DP-4", disabled = true })
-- then
hl.monitor({ output = "DP-4", mode = "2560x720@60", position = "400x1350", scale = 1.6, transform = 0, disabled = false })

plus omarchy restart shell. I also started a Hyprland unlock>> listener that repeats that DP-4 toggle so the next idle unlock does not stick again.

Suggestions

  • Do not start a new idle lock cycle while omarchy-shell lock isLocked is already true (the 15:31/15:34 double lock above).
  • omarchy-brightness-display on should not treat dpmsStatus: true as "this output actually has a fresh frame", at least on a secondary GPU.
  • After finishUnlock(), force a modeset (or hl.dsp.force_renderer_reload()) on outputs that did not render the PAM field, or skip DPMS-off on mixed-GPU outputs.
View raw text
## System details

- Omarchy 4.0.0-1
- Hyprland 0.56.2 (`efb50993780079460b0cbed1363e2166a2de1d9f`)
- NVIDIA GeForce RTX 4090 (driver 610.57.04 open) + AMD Raphael iGPU (`amdgpu`)
- Two monitors on **different GPUs**:
  - DP-1 / `card1` (NVIDIA): Samsung Odyssey G8, 3840x2160@240, scale 1.6
  - DP-4 / `card0` (AMD iGPU): Corsair XENEON EDGE, 2560x720@60, scale 1.6, physically below the G8

## What's wrong?

Idle lock works. Typing the password on the G8 authenticates and the G8 shows the desktop. The XENEON EDGE stays on the Quickshell lock field (`Enter Password`) indefinitely.

The lock plugin itself thinks the session is unlocked:

```
omarchy-shell lock status
{"locked":false,"requested":false,"pending":false,"sessionLocked":false,"secure":false,"realScreens":2,...,"lastEvent":"unlocked"}
```

`loginctl` `LockedHint=no`. `omarchy-hyprland-session-locked` exits 1 (unlocked). `hyprctl layers` on DP-4 shows only `omarchy-background` and `omarchy-bar` — no lock overlay. Session-lock surfaces are not layer-shell, so that last point does not prove the leftover is gone, but the IPC/logind state does.

`grim -o DP-4` hangs until killed. `grim -o DP-1` returns immediately. Capturing a region that sits on the Edge layout (`-g "400,1350 20x20"`) also hangs. So the AMD output is in a bad copy/scanout state after unlock, not just a stale wallpaper.

## Journal (idle lock, then unlock on the G8)

```
15:29:04 lock-requested
15:29:04 lock-pending: screen-stabilizing
15:29:09 secure=true
15:31:34 idle-monitor: idle          # idle cycle starts *while already locked*
15:34:04 lock-system: lock-timeout   # second omarchy-system-lock while already locked
16:05:16 idle-monitor: active        # mouse wake, ~36 min later
16:05:29 PAM omarchy-lock-password authenticated successfully
16:05:29 secure=false
16:05:29 session-locked=false
16:05:29 unlocked
```

There is no `session-locked=true` line between `lock-requested` and `secure=true`.

`omarchy-system-wake` then no-ops: `omarchy-brightness-display on` skips the DPMS enable when every monitor already reports `dpmsStatus: true`. After the mouse wake, both outputs report on, so unlock never modesets the AMD panel.

## Steps to reproduce

1. Mixed-GPU desktop: one monitor on NVIDIA, one on the AMD iGPU. The iGPU panel here is a 2560x720 XENEON EDGE.
2. Wait for idle lock (`idle.lock` 300s). Displays blank ~5s later (`idleBlankTimer`).
3. Move the mouse / type the password on the NVIDIA monitor.
4. NVIDIA monitor unlocks. AMD monitor keeps showing `Enter Password`.

## Related

- #2449 was the hyprlock-era dual-monitor leftover. This is Quattro / `WlSessionLock`.
- #7399 is the DPMS wake skip-guard on a slow-sync panel. Same `omarchy-brightness-display on` guard, different symptom.

## Local workaround that recovered the panel

Recreating only DP-4:

```lua
hl.monitor({ output = "DP-4", disabled = true })
-- then
hl.monitor({ output = "DP-4", mode = "2560x720@60", position = "400x1350", scale = 1.6, transform = 0, disabled = false })
```

plus `omarchy restart shell`. I also started a Hyprland `unlock>>` listener that repeats that DP-4 toggle so the next idle unlock does not stick again.

## Suggestions

- Do not start a new idle lock cycle while `omarchy-shell lock isLocked` is already true (the 15:31/15:34 double lock above).
- `omarchy-brightness-display on` should not treat `dpmsStatus: true` as "this output actually has a fresh frame", at least on a secondary GPU.
- After `finishUnlock()`, force a modeset (or `hl.dsp.force_renderer_reload()`) on outputs that did not render the PAM field, or skip DPMS-off on mixed-GPU outputs.

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.