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.
LIBVA_DRIVER_NAME=nvidia breaks all video playback on muxless hybrid laptops where the iGPU drives the display
Reported by DavidEvansDev · filed Sep 20, 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?
- 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
What happened
On a muxless hybrid laptop where the panel is wired to the AMD iGPU and the NVIDIA dGPU has no connected outputs, Omarchy sets LIBVA_DRIVER_NAME=nvidia. This silently breaks all hardware video decode in Chromium/Electron apps: audio plays but video never renders, and tabs visibly flicker.
It is not a soft failure. Because vaInitialize succeeds, Chromium never falls back to software decode, so there is no recovery path and nothing useful in the logs.
Root cause
default/hypr/nvidia.lua gates on the mere presence of a GSP-capable NVIDIA GPU:
if o.shell_succeeds(o.shell_quote(nvidia)) then
if o.shell_succeeds(o.shell_quote(nvidia_gsp)) then
hl.env("NVD_BACKEND", "direct")
hl.env("LIBVA_DRIVER_NAME", "nvidia")
hl.env("__GLX_VENDOR_LIBRARY_NAME", "nvidia")It never checks which GPU drives the display. On this machine only card2-eDP-2 (amdgpu) is connected; every NVIDIA connector is disconnected and nvidia-smi reports display_active: Disabled.
Chromium deliberately refuses NVIDIA render nodes for VA-API:
WARNING:media/gpu/vaapi/vaapi_wrapper.cc:130] Should skip nVidia device named: nvidia-drmso it decodes on /dev/dri/renderD129 (amdgpu) — while LIBVA_DRIVER_NAME=nvidia forces libva to load the NVDEC driver there. With NVD_BACKEND=direct, nvidia-vaapi-driver reaches the dGPU over CUDA and ignores the DRM fd it was handed, so initialisation reports success against the wrong GPU. Decoded frames land in NVIDIA memory that the AMD-driven display cannot import.
Demonstrated by initialising libva directly against the AMD render node:
AMD node (renderD129) + LIBVA_DRIVER_NAME=nvidia
OK va 1.24 vendor=VA-API NVDEC driver [direct backend] <-- wrong GPU, still "succeeds"
AMD node (renderD129) + LIBVA_DRIVER_NAME=radeonsi
OK va 1.24 vendor=Mesa Gallium driver 26.2.2-arch1.1 for AMD Radeon 860M Graphics (radeonsi, krackan1)
AMD node (renderD129) + LIBVA_DRIVER_NAME unset (autodetect)
OK va 1.24 vendor=Mesa Gallium driver 26.2.2-arch1.1 for AMD Radeon 860M Graphics (radeonsi, krackan1)libva's own autodetection picks the correct driver. Omarchy's override is what breaks it.
Steps to reproduce
- Use a muxless hybrid laptop whose internal panel is driven by the AMD/Intel iGPU (NVIDIA dGPU has no connected connector).
- Boot Omarchy;
default/hypr/nvidia.luaexportsLIBVA_DRIVER_NAME=nvidia. - Open any YouTube video in Chromium.
- Audio plays; the video area stays blank and the tab flickers.
Expected
Hardware decode works, or at minimum falls back to software decode rather than failing silently against a GPU that cannot present.
Suggested fix
Only claim the NVIDIA VA-API driver when NVIDIA actually drives a connected output. Everything else in the block (__GLX_VENDOR_LIBRARY_NAME, PRIME offload) can stay as-is — it is specifically LIBVA_DRIVER_NAME/NVD_BACKEND that must follow the display, since VA-API surfaces have to be importable by whichever GPU scans out.
A sysfs-only detector, consistent with the existing "don't shell out to lspci" note in that file:
# omarchy-hw-nvidia-drives-display
for conn in /sys/class/drm/card*-*/status; do
[ "$(cat "$conn" 2>/dev/null)" = "connected" ] || continue
card="${conn%-*}"; card="${card%/status}"
drv=$(basename "$(readlink -f "$(dirname "$conn")/../device/driver")" 2>/dev/null)
[ "$drv" = "nvidia" ] && exit 0
done
exit 1then in nvidia.lua:
if o.shell_succeeds(o.shell_quote(nvidia_gsp)) and o.shell_succeeds(o.shell_quote(nvidia_drives_display)) then
hl.env("NVD_BACKEND", "direct")
hl.env("LIBVA_DRIVER_NAME", "nvidia")
end
hl.env("__GLX_VENDOR_LIBRARY_NAME", "nvidia")Simply leaving LIBVA_DRIVER_NAME unset on iGPU-driven systems would also be correct — libva autodetects radeonsi properly, as shown above.
Note this must also hold for hotplug: an external monitor on an NVIDIA-wired HDMI/DP port changes the answer at runtime. Gating on boot-time state is still a strict improvement over gating on nothing.
Workaround
Append to ~/.config/hypr/hyprland.lua (loads after the defaults):
hl.env("LIBVA_DRIVER_NAME", "radeonsi")System details
- Omarchy: 4.0.4-1
- CPU: AMD Ryzen AI 7 350 w/ Radeon 860M
- GPUs: NVIDIA GB206M RTX 5070 Max-Q
[10de:2d18](card1, renderD128) + AMD Krackan Radeon 860M[1002:1114](card2, renderD129) - Connected outputs:
card2-eDP-2only — all NVIDIA connectors disconnected - Kernel: 7.2.5-3-omarchy
- Hyprland: 0.56.2 / Aquamarine 0.15.0
- Driver: nvidia-open-dkms 610.57.04, mesa 26.2.2, libva 2.24.1, libva-nvidia-driver 0.0.18
- Chromium: 152.0.7977.82
View raw text
## What happened
On a muxless hybrid laptop where the panel is wired to the **AMD iGPU** and the NVIDIA dGPU has **no connected outputs**, Omarchy sets `LIBVA_DRIVER_NAME=nvidia`. This silently breaks all hardware video decode in Chromium/Electron apps: **audio plays but video never renders**, and tabs visibly flicker.
It is not a soft failure. Because `vaInitialize` *succeeds*, Chromium never falls back to software decode, so there is no recovery path and nothing useful in the logs.
## Root cause
`default/hypr/nvidia.lua` gates on the mere *presence* of a GSP-capable NVIDIA GPU:
```lua
if o.shell_succeeds(o.shell_quote(nvidia)) then
if o.shell_succeeds(o.shell_quote(nvidia_gsp)) then
hl.env("NVD_BACKEND", "direct")
hl.env("LIBVA_DRIVER_NAME", "nvidia")
hl.env("__GLX_VENDOR_LIBRARY_NAME", "nvidia")
```
It never checks **which GPU drives the display**. On this machine only `card2-eDP-2` (amdgpu) is connected; every NVIDIA connector is disconnected and `nvidia-smi` reports `display_active: Disabled`.
Chromium deliberately refuses NVIDIA render nodes for VA-API:
```
WARNING:media/gpu/vaapi/vaapi_wrapper.cc:130] Should skip nVidia device named: nvidia-drm
```
so it decodes on `/dev/dri/renderD129` (amdgpu) — while `LIBVA_DRIVER_NAME=nvidia` forces libva to load the NVDEC driver there. With `NVD_BACKEND=direct`, nvidia-vaapi-driver reaches the dGPU over CUDA and **ignores the DRM fd it was handed**, so initialisation reports success against the wrong GPU. Decoded frames land in NVIDIA memory that the AMD-driven display cannot import.
Demonstrated by initialising libva directly against the AMD render node:
```
AMD node (renderD129) + LIBVA_DRIVER_NAME=nvidia
OK va 1.24 vendor=VA-API NVDEC driver [direct backend] <-- wrong GPU, still "succeeds"
AMD node (renderD129) + LIBVA_DRIVER_NAME=radeonsi
OK va 1.24 vendor=Mesa Gallium driver 26.2.2-arch1.1 for AMD Radeon 860M Graphics (radeonsi, krackan1)
AMD node (renderD129) + LIBVA_DRIVER_NAME unset (autodetect)
OK va 1.24 vendor=Mesa Gallium driver 26.2.2-arch1.1 for AMD Radeon 860M Graphics (radeonsi, krackan1)
```
libva's own autodetection picks the correct driver. Omarchy's override is what breaks it.
## Steps to reproduce
1. Use a muxless hybrid laptop whose internal panel is driven by the AMD/Intel iGPU (NVIDIA dGPU has no connected connector).
2. Boot Omarchy; `default/hypr/nvidia.lua` exports `LIBVA_DRIVER_NAME=nvidia`.
3. Open any YouTube video in Chromium.
4. Audio plays; the video area stays blank and the tab flickers.
## Expected
Hardware decode works, or at minimum falls back to software decode rather than failing silently against a GPU that cannot present.
## Suggested fix
Only claim the NVIDIA VA-API driver when NVIDIA actually drives a connected output. Everything else in the block (`__GLX_VENDOR_LIBRARY_NAME`, PRIME offload) can stay as-is — it is specifically `LIBVA_DRIVER_NAME`/`NVD_BACKEND` that must follow the display, since VA-API surfaces have to be importable by whichever GPU scans out.
A sysfs-only detector, consistent with the existing "don't shell out to lspci" note in that file:
```sh
# omarchy-hw-nvidia-drives-display
for conn in /sys/class/drm/card*-*/status; do
[ "$(cat "$conn" 2>/dev/null)" = "connected" ] || continue
card="${conn%-*}"; card="${card%/status}"
drv=$(basename "$(readlink -f "$(dirname "$conn")/../device/driver")" 2>/dev/null)
[ "$drv" = "nvidia" ] && exit 0
done
exit 1
```
then in `nvidia.lua`:
```lua
if o.shell_succeeds(o.shell_quote(nvidia_gsp)) and o.shell_succeeds(o.shell_quote(nvidia_drives_display)) then
hl.env("NVD_BACKEND", "direct")
hl.env("LIBVA_DRIVER_NAME", "nvidia")
end
hl.env("__GLX_VENDOR_LIBRARY_NAME", "nvidia")
```
Simply leaving `LIBVA_DRIVER_NAME` unset on iGPU-driven systems would also be correct — libva autodetects `radeonsi` properly, as shown above.
Note this must also hold for hotplug: an external monitor on an NVIDIA-wired HDMI/DP port changes the answer at runtime. Gating on boot-time state is still a strict improvement over gating on nothing.
## Workaround
Append to `~/.config/hypr/hyprland.lua` (loads after the defaults):
```lua
hl.env("LIBVA_DRIVER_NAME", "radeonsi")
```
## System details
- **Omarchy:** 4.0.4-1
- **CPU:** AMD Ryzen AI 7 350 w/ Radeon 860M
- **GPUs:** NVIDIA GB206M RTX 5070 Max-Q `[10de:2d18]` (card1, renderD128) + AMD Krackan Radeon 860M `[1002:1114]` (card2, renderD129)
- **Connected outputs:** `card2-eDP-2` only — all NVIDIA connectors disconnected
- **Kernel:** 7.2.5-3-omarchy
- **Hyprland:** 0.56.2 / Aquamarine 0.15.0
- **Driver:** nvidia-open-dkms 610.57.04, mesa 26.2.2, libva 2.24.1, libva-nvidia-driver 0.0.18
- **Chromium:** 152.0.7977.82
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/9483· 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.
- Out of scopeDecided by agents · verified · 2026-10-09 19:19 UTC