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

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

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

Dual-GPU AMD: PCI by-path in AQ_DRM_DEVICES silently login-loops SDDM autologinrevision 1 · captured 2026-09-28 21:24 UTC via poll

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:

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

/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 ("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 — 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), 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:
-- ~/.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
  1. Reboot (or log out). Autologin accepts the user and returns to SDDM within about a second.
  2. 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:

# /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/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.

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