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.
Dual-GPU AMD: PCI by-path in AQ_DRM_DEVICES silently login-loops SDDM autologin
Reported by mowgli42 · filed Aug 28, 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
System details
- Omarchy: 4.0.1-1
- Kernel: 7.1.9-arch1-2
- Session: SDDM autologin →
uwsm start -g -1 -e -D Hyprland hyprland.desktop - Hyprland: 0.56.2 (
efb50993780079460b0cbed1363e2166a2de1d9f) - Aquamarine: 0.14.0-2
- uwsm: 0.26.7-1
- sddm: 0.21.0-7
- GPU: dual AMD (not NVIDIA, not a laptop hybrid)
0000:13:00.0Raphael iGPU[1002:164e](motherboard HDMI/DP,boot_vga=1)0000:03:00.0Navi 48 RX 9070 XT[1002:7550](still installed, used for compute)- Both bind
amdgpu. Monitor is on the motherboard HDMI port.
What's wrong?
On a dual-GPU AMD desktop, a single AQ_DRM_DEVICES line that uses PCI by-path names turns Omarchy's SDDM autologin into a silent login loop.
Password is accepted. There is no SDDM auth error. journalctl -u sddm looks clean (Session started true, then the helper exits and the greeter comes back ~1s later). The compositor is already dead.
Hyprland/Aquamarine exits immediately with:
drm: Explicit device list /dev/dri/by-path/pci-0000:13:00.0-card:/dev/dri/by-path/pci-0000:03:00.0-card
ERR: drm: Failed to canonicalize path /dev/dri/by-path/pci-0000
ERR: drm: Failed to canonicalize path 13
ERR: drm: Failed to canonicalize path 00.0-card
ERR: drm: Found no gpus to use, cannot continue
ERR: DRM Backend failedThat lives in ~/.cache/hyprland/hyprlandCrashReport*.txt, not in the SDDM journal. With autologin enabled this is an unattended boot loop until someone finds a TTY.
Why it happens
Aquamarine splits AQ_DRM_DEVICES on :. PCI by-path names also contain :, so
/dev/dri/by-path/pci-0000:13:00.0-cardis parsed as /dev/dri/by-path/pci-0000 + 13 + 00.0-card. None of those exist, so the backend reports "no gpus" even though both cards are healthy and a monitor is connected.
This is documented upstream:
- Hyprland wiki Multi-GPU ("Creating consistent device paths") —
by-pathis listed first for detecting GPUs, then later says those paths are not usable inAQ_DRM_DEVICES - hyprwm/aquamarine#167 — same crash log
/dev/dri/card0 / card1 / card2 are also a trap on this hardware: they rotate every reboot, so a pin that "works" is wrong after the next boot.
Omarchy does not set AQ_DRM_DEVICES by default. The failure mode is still Omarchy's because:
- The shipped session is SDDM autologin + uwsm + Hyprland. A bad
AQ_*env becomes a greeter loop with no on-screen error. omarchy debugdoes not print or validateAQ_DRM_DEVICES.- The only GPU switcher (
omarchy toggle hybrid gpu) is supergfxd / Asus-style NVIDIA hybrid. Dual AMD desktop (iGPU scanout + dGPU compute) has no first-party helper, so people — and coding agents — copy the wikiby-pathstring intohl.env("AQ_DRM_DEVICES", ...)or~/.config/uwsm/env-hyprland. - uwsm is the right place for
AQ_*(wiki), but nothing in Omarchy warns that PCI paths are illegal there.
This bit a coding agent on this machine while "swapping" display to the iGPU so the 9070 XT could stay for ROCm. The agent did the wiki's detection step (ls /dev/dri/by-path) and wrote those paths into AQ_DRM_DEVICES. Please treat that as a product footgun, not a one-off user error — other agents will repeat it.
Steps to reproduce
- Dual-GPU AMD machine, monitor on the iGPU/motherboard port, SDDM autologin to
omarchy.desktop. - Set either of:
-- ~/.config/hypr/hyprland.lua (too late sometimes, but often still applied)
hl.env("AQ_DRM_DEVICES", "/dev/dri/by-path/pci-0000:13:00.0-card:/dev/dri/by-path/pci-0000:03:00.0-card")# ~/.config/uwsm/env-hyprland (this is what uwsm actually exports)
export AQ_DRM_DEVICES=/dev/dri/by-path/pci-0000:13:00.0-card:/dev/dri/by-path/pci-0000:03:00.0-card- Reboot (or log out). Autologin accepts the user and returns to SDDM within about a second.
- TTY (
Ctrl+Alt+F3) still works.journalctl -u sddmdoes not mention Aquamarine.
Working pin (for anyone hitting this)
Colon-free udev names, then uwsm:
# /etc/udev/rules.d/99-gpu-links.rules
KERNEL=="card*", SUBSYSTEM=="drm", KERNELS=="0000:13:00.0", SYMLINK+="dri/igpu"
KERNEL=="card*", SUBSYSTEM=="drm", KERNELS=="0000:03:00.0", SYMLINK+="dri/dgpu"# ~/.config/uwsm/env-hyprland
export AQ_DRM_DEVICES=/dev/dri/igpuDo not use /dev/dri/cardN. Do not use PCI by-path. Test from a TTY with AQ_DRM_DEVICES=/dev/dri/igpu start-hyprland before relying on autologin.
What Omarchy could do (so the next agent does not brick login)
- `omarchy debug`: dump
AQ_DRM_DEVICES(process + uwsm + hypr env files) and warn if the value containsby-path,pci-0000:, or a hard-coded/dev/dri/cardN. - Docs / setup: a short dual-GPU note — udev short names,
~/.config/uwsm/env-hyprland, neverby-path. The Hyprland wiki's "Detecting GPUs" section is the copy-paste trap. - Helper: something like
omarchy setup gputhat writes colon-free/dev/dri/igpu+/dev/dri/dgpuand the uwsm export.omarchy toggle hybrid gpuis the wrong tool for AMD+AMD desktops. - Agent/docs callout: if you need to pin a GPU on Omarchy, never put a string containing
:inside a path inAQ_DRM_DEVICES.:is only the list separator between already-safe names (/dev/dri/igpu:/dev/dri/dgpu).
Happy to attach the full crash report if useful. I did not upload omarchy debug because this machine is currently on a TTY-recovered session, not a uwsm autologin session.
View raw text
### System details
- **Omarchy:** 4.0.1-1
- **Kernel:** 7.1.9-arch1-2
- **Session:** SDDM autologin → `uwsm start -g -1 -e -D Hyprland hyprland.desktop`
- **Hyprland:** 0.56.2 (`efb50993780079460b0cbed1363e2166a2de1d9f`)
- **Aquamarine:** 0.14.0-2
- **uwsm:** 0.26.7-1
- **sddm:** 0.21.0-7
- **GPU:** dual AMD (not NVIDIA, not a laptop hybrid)
- `0000:13:00.0` Raphael iGPU `[1002:164e]` (motherboard HDMI/DP, `boot_vga=1`)
- `0000:03:00.0` Navi 48 RX 9070 XT `[1002:7550]` (still installed, used for compute)
- Both bind `amdgpu`. Monitor is on the **motherboard** HDMI port.
### What's wrong?
On a dual-GPU AMD desktop, a single `AQ_DRM_DEVICES` line that uses PCI `by-path` names turns Omarchy's SDDM autologin into a **silent login loop**.
Password is accepted. There is no SDDM auth error. `journalctl -u sddm` looks clean (`Session started true`, then the helper exits and the greeter comes back ~1s later). The compositor is already dead.
Hyprland/Aquamarine exits immediately with:
```text
drm: Explicit device list /dev/dri/by-path/pci-0000:13:00.0-card:/dev/dri/by-path/pci-0000:03:00.0-card
ERR: drm: Failed to canonicalize path /dev/dri/by-path/pci-0000
ERR: drm: Failed to canonicalize path 13
ERR: drm: Failed to canonicalize path 00.0-card
ERR: drm: Found no gpus to use, cannot continue
ERR: DRM Backend failed
```
That lives in `~/.cache/hyprland/hyprlandCrashReport*.txt`, not in the SDDM journal. With autologin enabled this is an unattended boot loop until someone finds a TTY.
### Why it happens
Aquamarine splits `AQ_DRM_DEVICES` on `:`. PCI `by-path` names also contain `:`, so
```text
/dev/dri/by-path/pci-0000:13:00.0-card
```
is parsed as `/dev/dri/by-path/pci-0000` + `13` + `00.0-card`. None of those exist, so the backend reports "no gpus" even though both cards are healthy and a monitor is connected.
This is documented upstream:
- Hyprland wiki [Multi-GPU](https://wiki.hypr.land/Configuring/Advanced-and-Cool/Multi-GPU/) ("Creating consistent device paths") — `by-path` is listed first for *detecting* GPUs, then later says those paths are not usable in `AQ_DRM_DEVICES`
- [hyprwm/aquamarine#167](https://github.com/hyprwm/aquamarine/issues/167) — same crash log
`/dev/dri/card0` / `card1` / `card2` are also a trap on this hardware: they **rotate every reboot**, so a pin that "works" is wrong after the next boot.
Omarchy does not set `AQ_DRM_DEVICES` by default. The failure mode is still Omarchy's because:
1. The shipped session is **SDDM autologin + uwsm + Hyprland**. A bad `AQ_*` env becomes a greeter loop with no on-screen error.
2. `omarchy debug` does not print or validate `AQ_DRM_DEVICES`.
3. The only GPU switcher (`omarchy toggle hybrid gpu`) is **supergfxd / Asus-style NVIDIA hybrid**. Dual AMD desktop (iGPU scanout + dGPU compute) has no first-party helper, so people — and coding agents — copy the wiki `by-path` string into `hl.env("AQ_DRM_DEVICES", ...)` or `~/.config/uwsm/env-hyprland`.
4. uwsm is the right place for `AQ_*` ([wiki](https://wiki.hypr.land/Configuring/Advanced-and-Cool/Multi-GPU/)), but nothing in Omarchy warns that PCI paths are illegal there.
This bit a coding agent on this machine while "swapping" display to the iGPU so the 9070 XT could stay for ROCm. The agent did the wiki's detection step (`ls /dev/dri/by-path`) and wrote those paths into `AQ_DRM_DEVICES`. Please treat that as a product footgun, not a one-off user error — other agents will repeat it.
### Steps to reproduce
1. Dual-GPU AMD machine, monitor on the iGPU/motherboard port, SDDM autologin to `omarchy.desktop`.
2. Set either of:
```lua
-- ~/.config/hypr/hyprland.lua (too late sometimes, but often still applied)
hl.env("AQ_DRM_DEVICES", "/dev/dri/by-path/pci-0000:13:00.0-card:/dev/dri/by-path/pci-0000:03:00.0-card")
```
```bash
# ~/.config/uwsm/env-hyprland (this is what uwsm actually exports)
export AQ_DRM_DEVICES=/dev/dri/by-path/pci-0000:13:00.0-card:/dev/dri/by-path/pci-0000:03:00.0-card
```
3. Reboot (or log out). Autologin accepts the user and returns to SDDM within about a second.
4. TTY (`Ctrl+Alt+F3`) still works. `journalctl -u sddm` does not mention Aquamarine.
### Working pin (for anyone hitting this)
Colon-free udev names, then uwsm:
```udev
# /etc/udev/rules.d/99-gpu-links.rules
KERNEL=="card*", SUBSYSTEM=="drm", KERNELS=="0000:13:00.0", SYMLINK+="dri/igpu"
KERNEL=="card*", SUBSYSTEM=="drm", KERNELS=="0000:03:00.0", SYMLINK+="dri/dgpu"
```
```bash
# ~/.config/uwsm/env-hyprland
export AQ_DRM_DEVICES=/dev/dri/igpu
```
Do **not** use `/dev/dri/cardN`. Do **not** use PCI `by-path`. Test from a TTY with `AQ_DRM_DEVICES=/dev/dri/igpu start-hyprland` before relying on autologin.
### What Omarchy could do (so the next agent does not brick login)
1. **`omarchy debug`:** dump `AQ_DRM_DEVICES` (process + uwsm + hypr env files) and **warn** if the value contains `by-path`, `pci-0000:`, or a hard-coded `/dev/dri/cardN`.
2. **Docs / setup:** a short dual-GPU note — udev short names, `~/.config/uwsm/env-hyprland`, never `by-path`. The Hyprland wiki's "Detecting GPUs" section is the copy-paste trap.
3. **Helper:** something like `omarchy setup gpu` that writes colon-free `/dev/dri/igpu` + `/dev/dri/dgpu` and the uwsm export. `omarchy toggle hybrid gpu` is the wrong tool for AMD+AMD desktops.
4. **Agent/docs callout:** if you need to pin a GPU on Omarchy, never put a string containing `:` inside a path in `AQ_DRM_DEVICES`. `:` is only the list separator between already-safe names (`/dev/dri/igpu:/dev/dri/dgpu`).
Happy to attach the full crash report if useful. I did not upload `omarchy debug` because this machine is currently on a TTY-recovered session, not a uwsm autologin session.
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 09:46 UTC