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-945GitHub issuePublicDecided· Out of scope

Sunshine error 503 on hosts with no physical input (VM / GPU passthrough): idle screensaver blanks the display and KMS capture can never start

Reported by jimdawdy-hub · filed Sep 5, 2026 · open at source

Decided: Out of scope — decided by agents · verified 4 days ago.

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?
AreaOutside the audited area· 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

Sunshine error 503 on hosts with no physical input (VM / GPU passthrough): idle screensaver blanks the display and KMS capture can never startrevision 1 · captured 2026-09-28 21:23 UTC via poll

System details

Omarchy 4.0.2-1, Hyprland 0.56.2-1, quickshell 0.3.1-1, kernel 7.1.9-arch1-2, nvidia-open 610.57.04-8, sunshine 2026.516.143833-4 (omarchy repo). NVIDIA RTX 2000 Ada passed through with vfio-pci to a Proxmox VM, alongside the QEMU virtio virtual display.

What's wrong?

On a machine with no physical keyboard or mouse — a VM used as a dedicated Sunshine/Moonlight host, which is a common GPU-passthrough setup — the idle manager blanks the display permanently, and Sunshine's KMS capture then has nothing to capture. Moonlight fails to connect with "host failed to initialize video capture" (error 503).

This is not the idle manager misbehaving; it is doing exactly what it is configured to do. The problem is that a VM with no input devices is idle by definition, so the screensaver fires forever, and capture = kms cannot work while it is blanked.

Why this combination is common

capture = kms is currently the only way to get NVENC on the packaged Sunshine, because the omarchy build ships without CUDA (#9048, #7752) and the default wlgrab path then dies with Couldn't scale frame: Invalid argument and silently falls back to libx264. So NVIDIA users who want hardware encoding are pushed onto exactly the capture backend that breaks when the screen sleeps.

Reproduction

  1. Run Omarchy in a VM (or any host with no physical input devices) with a GPU passed through.
  2. Set capture = kms in ~/.config/sunshine/sunshine.conf and start Sunshine.
  3. Leave it alone for ~2.5 minutes.
  4. Connect from Moonlight.

Evidence

The idle cycle, from omarchy-debug-idle:

idle-monitor: idle
idle-cycle-start: screensaver=150 lock=300
process-start: screensaver ... omarchy-launch-screensaver

Display state once it fires:

$ hyprctl monitors | grep -E '^Monitor|dpmsStatus'
Monitor DP-1 (ID 0):
        dpmsStatus: 0
Monitor Virtual-1 (ID 1):
        dpmsStatus: 0

Sunshine at that point — note every encoder fails in ~0.4s with no Screencasting with KMS line at all, i.e. capture never initializes:

Info: Trying encoder [nvenc]
Info: [misc] drop_elevated_privileges succeeded in dropping capabilities
Info: Encoder [nvenc] failed
Info: Trying encoder [vulkan]
Info: Encoder [vulkan] failed
Info: Trying encoder [vaapi]
Info: Encoder [vaapi] failed
Info: Trying encoder [software]
Info: Encoder [software] failed
Fatal: Unable to find display or encoder during startup.
Fatal: Please ensure your manually chosen GPU and monitor are connected and powered on.

With the display awake, the identical config succeeds:

Info: Screencasting with KMS
Info: Found monitor for DRM screencasting
Info: Found H.264 encoder: h264_nvenc [nvenc]
Info: Found HEVC encoder: hevc_nvenc [nvenc]
Info: Found AV1 encoder: av1_nvenc [nvenc]

Measured directly: displays awake 2/2 sampled every 30s for 3 minutes with idle disabled, 0/2 within 30-90s with it enabled.

Workaround

omarchy-toggle-idle stay-awake      # undo: omarchy-toggle-idle allow-idle

Confirmed in the log as stay-awake: enabled state-file + idle-cycle-cancel: stay-awake. After this, Moonlight connects and the live session encodes on the GPU (CLIENT CONNECTED -> Screencasting with KMS -> Creating encoder [h264_nvenc]).

The cost is that the machine no longer auto-locks or runs a screensaver, which is a real security trade-off to accept on a box whose whole purpose is to be streamed.

Two things that make this hard to diagnose

  1. Sunshine's `global_prep_cmd` is not sufficient on its own. Waking the display at session start does help, but the startup encoder probe also fails while blanked, and Sunshine then exits with Unable to find display or encoder during startup — so it can be dead before any client ever connects.
  1. `hyprctl dispatch dpms on` silently does nothing on current Omarchy. It is a syntax error under the Lua dispatch API and merely prints ')' expected near 'on' while appearing to run, so the obvious manual test looks like "waking the display didn't help". The working form is:
   hyprctl dispatch 'hl.dsp.dpms("on")'

This looks like the same class of problem already reported in #7456.

Suggestion

Something along these lines would make GPU-passthrough/VM hosts work out of the box:

  • Have omarchy install service sunshine note (or offer to set) stay-awake, since KMS capture and idle blanking are mutually exclusive.
  • Or hold an idle inhibitor for the lifetime of an active Sunshine stream, so the screensaver cannot fire mid-session.
  • At minimum, a documentation note: on a host with no physical input, capture = kms requires idle blanking to be disabled.

Happy to test any proposed change on this setup.

View raw text
### System details

Omarchy 4.0.2-1, Hyprland 0.56.2-1, quickshell 0.3.1-1, kernel 7.1.9-arch1-2, nvidia-open 610.57.04-8, sunshine 2026.516.143833-4 (omarchy repo). NVIDIA RTX 2000 Ada passed through with `vfio-pci` to a Proxmox VM, alongside the QEMU virtio virtual display.

### What's wrong?

On a machine with **no physical keyboard or mouse** — a VM used as a dedicated Sunshine/Moonlight host, which is a common GPU-passthrough setup — the idle manager blanks the display permanently, and Sunshine's KMS capture then has nothing to capture. Moonlight fails to connect with **"host failed to initialize video capture" (error 503)**.

This is not the idle manager misbehaving; it is doing exactly what it is configured to do. The problem is that a VM with no input devices is idle *by definition*, so the screensaver fires forever, and `capture = kms` cannot work while it is blanked.

#### Why this combination is common

`capture = kms` is currently the only way to get NVENC on the packaged Sunshine, because the omarchy build ships without CUDA (#9048, #7752) and the default `wlgrab` path then dies with `Couldn't scale frame: Invalid argument` and silently falls back to `libx264`. So NVIDIA users who want hardware encoding are pushed onto exactly the capture backend that breaks when the screen sleeps.

#### Reproduction

1. Run Omarchy in a VM (or any host with no physical input devices) with a GPU passed through.
2. Set `capture = kms` in `~/.config/sunshine/sunshine.conf` and start Sunshine.
3. Leave it alone for ~2.5 minutes.
4. Connect from Moonlight.

#### Evidence

The idle cycle, from `omarchy-debug-idle`:

```
idle-monitor: idle
idle-cycle-start: screensaver=150 lock=300
process-start: screensaver ... omarchy-launch-screensaver
```

Display state once it fires:

```
$ hyprctl monitors | grep -E '^Monitor|dpmsStatus'
Monitor DP-1 (ID 0):
        dpmsStatus: 0
Monitor Virtual-1 (ID 1):
        dpmsStatus: 0
```

Sunshine at that point — note every encoder fails in ~0.4s with no `Screencasting with KMS` line at all, i.e. capture never initializes:

```
Info: Trying encoder [nvenc]
Info: [misc] drop_elevated_privileges succeeded in dropping capabilities
Info: Encoder [nvenc] failed
Info: Trying encoder [vulkan]
Info: Encoder [vulkan] failed
Info: Trying encoder [vaapi]
Info: Encoder [vaapi] failed
Info: Trying encoder [software]
Info: Encoder [software] failed
Fatal: Unable to find display or encoder during startup.
Fatal: Please ensure your manually chosen GPU and monitor are connected and powered on.
```

With the display awake, the identical config succeeds:

```
Info: Screencasting with KMS
Info: Found monitor for DRM screencasting
Info: Found H.264 encoder: h264_nvenc [nvenc]
Info: Found HEVC encoder: hevc_nvenc [nvenc]
Info: Found AV1 encoder: av1_nvenc [nvenc]
```

Measured directly: displays awake `2/2` sampled every 30s for 3 minutes with idle disabled, `0/2` within 30-90s with it enabled.

### Workaround

```
omarchy-toggle-idle stay-awake      # undo: omarchy-toggle-idle allow-idle
```

Confirmed in the log as `stay-awake: enabled state-file` + `idle-cycle-cancel: stay-awake`. After this, Moonlight connects and the live session encodes on the GPU (`CLIENT CONNECTED` -> `Screencasting with KMS` -> `Creating encoder [h264_nvenc]`).

The cost is that the machine no longer auto-locks or runs a screensaver, which is a real security trade-off to accept on a box whose whole purpose is to be streamed.

### Two things that make this hard to diagnose

1. **Sunshine's `global_prep_cmd` is not sufficient on its own.** Waking the display at session start does help, but the *startup* encoder probe also fails while blanked, and Sunshine then exits with `Unable to find display or encoder during startup` — so it can be dead before any client ever connects.

2. **`hyprctl dispatch dpms on` silently does nothing on current Omarchy.** It is a syntax error under the Lua dispatch API and merely prints `')' expected near 'on'` while appearing to run, so the obvious manual test looks like "waking the display didn't help". The working form is:

   ```
   hyprctl dispatch 'hl.dsp.dpms("on")'
   ```

   This looks like the same class of problem already reported in #7456.

### Suggestion

Something along these lines would make GPU-passthrough/VM hosts work out of the box:

- Have `omarchy install service sunshine` note (or offer to set) `stay-awake`, since KMS capture and idle blanking are mutually exclusive.
- Or hold an idle inhibitor for the lifetime of an active Sunshine stream, so the screensaver cannot fire mid-session.
- At minimum, a documentation note: on a host with no physical input, `capture = kms` requires idle blanking to be disabled.

Happy to test any proposed change on this setup.

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.

  • Out of scopeDecided by agents · verified · 2026-10-09 10:50 UTC