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.
NVIDIA env vars (NVD_BACKEND, LIBVA_DRIVER_NAME, __GLX_VENDOR_LIBRARY_NAME) never set: os.execute() broken inside Hyprland Lua config
Reported by seanymc85 · filed Aug 22, 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 system with a discrete NVIDIA GPU, the hardware-specific env vars that default/hypr/nvidia.lua is supposed to set (NVD_BACKEND, LIBVA_DRIVER_NAME, __GLX_VENDOR_LIBRARY_NAME) never actually reach the environment — not for Hyprland's own env, not for anything it launches, and not for the systemd/dbus activation environment that omarchy-launch-shell and other autostart apps get their env from.
Root cause
default/hypr/nvidia.lua gates each hl.env() call on o.shell_succeeds(...) (in default/hypr/helpers.lua), which wraps os.execute(). Called from inside Hyprland's own Lua config, os.execute() cannot retrieve the exit status of the process it spawns — it always returns (nil, "No child processes", 10), even for a trivially-true command like os.execute("true"). This is the classic ECHILD/"ignored SIGCHLD" symptom: Hyprland reaps/ignores SIGCHLD for its own children, so the wait() call inside Lua's os.execute() can never find the child it just forked.
Because o.shell_succeeds() always returns false in this context, every branch in nvidia.lua that depends on it (omarchy-hw-nvidia, omarchy-hw-nvidia-gsp, omarchy-hw-nvidia-without-gsp) is always skipped, regardless of what GPU is actually installed. The three env vars are silently never set.
I confirmed this is not specific to the nvidia detector scripts — a bare os.execute("true") called from a require()'d module inside hyprland.lua reproduces the same nil, "No child processes", 10 result. By contrast, io.open() and io.popen() (for reading output, not exit status) work fine from the same context, so any Lua-config code that needs to shell out and check success/failure is affected, not just this one file.
Steps to reproduce
- On a machine with a discrete NVIDIA GPU, add this to
~/.config/hypr/hyprland.lua(in arequire()'d module, or inline) andhyprctl reload:
local ok, kind, code = os.execute("true")
hl.env("DEBUG_TRUE", tostring(ok) .. "|" .. tostring(kind) .. "|" .. tostring(code))- Spawn a fresh process via Hyprland and inspect its environment, e.g.:
hyprctl dispatch "hl.dsp.exec_cmd(\"env > /tmp/envtest.txt\")"DEBUG_TRUEin/tmp/envtest.txtreadsnil|No child processes|10instead oftrue|exit|0.- Separately, confirm
NVD_BACKEND,LIBVA_DRIVER_NAME, and__GLX_VENDOR_LIBRARY_NAMEare absent fromsystemctl --user show-environmentafter a full session restart, even though/usr/share/omarchy/bin/omarchy-hw-nvidiaandomarchy-hw-nvidia-gspboth exit 0 when run directly from a shell.
Expected
NVD_BACKEND, LIBVA_DRIVER_NAME, and __GLX_VENDOR_LIBRARY_NAME should be set for any system with a detectable NVIDIA GPU, and should reach the systemd/dbus activation environment that autostart apps use.
Workaround
Reimplemented the same PCI vendor/class/device detection in pure Lua using io.open/io.popen (reading sysfs files and directory listings directly) instead of shelling out and checking an exit code. That works correctly and sets the three vars as expected. Happy to turn this into a PR against nvidia.lua and/or helpers.lua if that approach (avoiding os.execute()'s exit-status path entirely) is the right general fix, rather than something Hyprland-side.
System details
- Omarchy version: 4.0.0-1 (stable channel)
- Hyprland: 0.56.2, commit
efb50993780079460b0cbed1363e2166a2de1d9f - Kernel: 7.1.8-arch1-3
- GPU: NVIDIA GeForce RTX 5070 (GB205, Blackwell, well above the GSP device-ID threshold), alongside an AMD Ryzen "Granite Ridge" iGPU (
amdgpu) —omarchy hw hybrid gpureports this as a hybrid GPU configuration - NVIDIA driver: 610.57.04, kernel modules
nvidia,nvidia_drm,nvidia_modeset,nvidia_uvmall loaded and bound correctly - Session: uwsm-managed Hyprland session (
uwsm start -g -1 -e -D Hyprland hyprland.desktop)
View raw text
## What happened
On a system with a discrete NVIDIA GPU, the hardware-specific env vars that `default/hypr/nvidia.lua` is supposed to set (`NVD_BACKEND`, `LIBVA_DRIVER_NAME`, `__GLX_VENDOR_LIBRARY_NAME`) never actually reach the environment — not for Hyprland's own env, not for anything it launches, and not for the systemd/dbus activation environment that `omarchy-launch-shell` and other autostart apps get their env from.
## Root cause
`default/hypr/nvidia.lua` gates each `hl.env()` call on `o.shell_succeeds(...)` (in `default/hypr/helpers.lua`), which wraps `os.execute()`. Called from inside Hyprland's own Lua config, `os.execute()` cannot retrieve the exit status of the process it spawns — it always returns `(nil, "No child processes", 10)`, even for a trivially-true command like `os.execute("true")`. This is the classic `ECHILD`/"ignored SIGCHLD" symptom: Hyprland reaps/ignores `SIGCHLD` for its own children, so the `wait()` call inside Lua's `os.execute()` can never find the child it just forked.
Because `o.shell_succeeds()` always returns `false` in this context, every branch in `nvidia.lua` that depends on it (`omarchy-hw-nvidia`, `omarchy-hw-nvidia-gsp`, `omarchy-hw-nvidia-without-gsp`) is always skipped, regardless of what GPU is actually installed. The three env vars are silently never set.
I confirmed this is not specific to the nvidia detector scripts — a bare `os.execute("true")` called from a `require()`'d module inside `hyprland.lua` reproduces the same `nil, "No child processes", 10` result. By contrast, `io.open()` and `io.popen()` (for reading output, not exit status) work fine from the same context, so any Lua-config code that needs to shell out and check success/failure is affected, not just this one file.
## Steps to reproduce
1. On a machine with a discrete NVIDIA GPU, add this to `~/.config/hypr/hyprland.lua` (in a `require()`'d module, or inline) and `hyprctl reload`:
```lua
local ok, kind, code = os.execute("true")
hl.env("DEBUG_TRUE", tostring(ok) .. "|" .. tostring(kind) .. "|" .. tostring(code))
```
2. Spawn a fresh process via Hyprland and inspect its environment, e.g.:
```
hyprctl dispatch "hl.dsp.exec_cmd(\"env > /tmp/envtest.txt\")"
```
3. `DEBUG_TRUE` in `/tmp/envtest.txt` reads `nil|No child processes|10` instead of `true|exit|0`.
4. Separately, confirm `NVD_BACKEND`, `LIBVA_DRIVER_NAME`, and `__GLX_VENDOR_LIBRARY_NAME` are absent from `systemctl --user show-environment` after a full session restart, even though `/usr/share/omarchy/bin/omarchy-hw-nvidia` and `omarchy-hw-nvidia-gsp` both exit 0 when run directly from a shell.
## Expected
`NVD_BACKEND`, `LIBVA_DRIVER_NAME`, and `__GLX_VENDOR_LIBRARY_NAME` should be set for any system with a detectable NVIDIA GPU, and should reach the systemd/dbus activation environment that autostart apps use.
## Workaround
Reimplemented the same PCI vendor/class/device detection in pure Lua using `io.open`/`io.popen` (reading sysfs files and directory listings directly) instead of shelling out and checking an exit code. That works correctly and sets the three vars as expected. Happy to turn this into a PR against `nvidia.lua` and/or `helpers.lua` if that approach (avoiding `os.execute()`'s exit-status path entirely) is the right general fix, rather than something Hyprland-side.
## System details
- Omarchy version: 4.0.0-1 (stable channel)
- Hyprland: 0.56.2, commit `efb50993780079460b0cbed1363e2166a2de1d9f`
- Kernel: 7.1.8-arch1-3
- GPU: NVIDIA GeForce RTX 5070 (GB205, Blackwell, well above the GSP device-ID threshold), alongside an AMD Ryzen "Granite Ridge" iGPU (`amdgpu`) — `omarchy hw hybrid gpu` reports this as a hybrid GPU configuration
- NVIDIA driver: 610.57.04, kernel modules `nvidia`, `nvidia_drm`, `nvidia_modeset`, `nvidia_uvm` all loaded and bound correctly
- Session: uwsm-managed Hyprland session (`uwsm start -g -1 -e -D Hyprland hyprland.desktop`)
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 08:22 UTC