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

kms hook kept on desktops with an idle iGPU: 139 MB of unused nouveau/amdgpu firmware per UKI, exhausting a 2 GB ESP

Reported by nanstey · filed Sep 26, 2026 · open at source

Decided: Out of scope — decided by agents · verified 3 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

kms hook kept on desktops with an idle iGPU: 139 MB of unused nouveau/amdgpu firmware per UKI, exhausting a 2 GB ESPrevision 1 · captured 2026-09-28 21:23 UTC via poll

Summary

The kms-dropping heuristic in mkinitcpio.conf.d/omarchy_hooks.conf keys off GPU presence rather than whether that GPU drives a display. On a desktop with an NVIDIA card and an idle AMD iGPU, it keeps kms and pulls ~130 MB of firmware for drivers that never load — the exact cost the file's own comment warns about. On a 2 GB ESP that is the difference between a working system and an unbootable one.

Current behaviour

if [[ " ${MODULES[*]:-} " == *" nvidia_drm "* ]]; then
  _omarchy_nvidia_gpu=0
  _omarchy_other_gpu=0
  for _omarchy_pci in "${OMARCHY_PCI_DEVICES_PATH:-/sys/bus/pci/devices}"/*; do
    ...
    [[ $(<"$_omarchy_pci/class") == "0x03"* ]] || continue
    if [[ $(<"$_omarchy_pci/vendor") == "0x10de" ]]; then
      _omarchy_nvidia_gpu=1
    else
      _omarchy_other_gpu=1
    fi
  done
  if ((_omarchy_nvidia_gpu && !_omarchy_other_gpu)); then
    # drop kms

kms is dropped only when NVIDIA is the sole GPU. The accompanying comment explains the intent:

Keeping the kms hook on such a system makes autodetect pull in nouveau — and ~100 MB of its GSP firmware — for a driver that never runs. [...] Hybrid systems keep kms: their iGPU still needs it for early KMS at the LUKS prompt.

That reasoning is sound for laptops, where the panel hangs off the iGPU. It misfires on a desktop where the iGPU exists but nothing is plugged into it.

This machine

Ryzen 9 7950X exposes its Raphael iGPU, so _omarchy_other_gpu=1 and kms stays. But the iGPU drives nothing:

/sys/class/drm/card0 -> amdgpu    card0-Writeback-1   (no real output)
/sys/class/drm/card1 -> nvidia    card1-DP-1 connected
                                  card1-DP-2 connected

Both monitors are on the NVIDIA card, which does its own early KMS via nvidia.conf (nvidia_drm with modeset=1).

Measured cost

Built both variants against the same root, kernel 7.2.3-arch1-3, in a tmpfs overlay:

initramfsfirmware
kms kept (current)273 MB1380 files, incl. 667 amdgpu + nouveau ga102/tu102 GSP
kms dropped134 MB6 nvidia, 14 intel; no amdgpu, no nouveau

Breakdown of the 245 MB of firmware in the current image:

102 MB  nvidia/ga102 + nvidia/tu102 GSP   <- nouveau; nouveau never loads
 80 MB  nvidia/610.57.04/gsp_ga10x.bin    <- needed (AD103)
 28 MB  nvidia/610.57.04/gsp_tu10x.bin    <- Turing, wrong generation
 28 MB  firmware/amdgpu/* (667 files)     <- iGPU drives nothing

Dropping kms removed 139 MB. On-disk UKI went 280 MB -> 141 MB. Boot got faster too, since Limine reads less off the ESP:

loader  27.387s -> 3.480s
kernel  18.101s -> 1.916s
total   1min 46s -> 1min 17s

Early KMS and Plymouth were unaffected — gsp_ga10x.bin is retained and nvidia_drm still comes up in the initramfs:

[drm] [nvidia-drm] [GPU ID 0x00000100] Loading driver
[drm] Initialized nvidia-drm 0.0.0 for 0000:01:00.0 on minor 1
fbcon: nvidia-drmdrmfb (fb0) is primary device

Why this matters beyond disk usage

At 280 MB per UKI, with limine-snapper-sync retaining one copy per snapshot, ESP demand is (kernels + snapshots) x 280 MB. Against a 2 GB ESP and NUMBER_LIMIT=5 that is ~1.7 GB, and a kernel upgrade eventually fails to write its image. The system stops booting, the user ends up stuck on a recovery subvolume, and snapshot sync silently stops. At 141 MB the same configuration needs ~700 MB and the failure mode disappears.

Suggested fix

Refine the scan: treat a non-NVIDIA GPU as "needs kms" only when it has a connected connector. Something along the lines of walking /sys/class/drm/card*/card*-*/status and mapping each card back to its PCI device, counting connected only. Laptops keep kms as today; desktops with an idle iGPU drop it and save ~130 MB. Preserve the existing inconclusive-means-keep-kms bias for unreadable sysfs.

Separately worth considering: gsp_tu10x.bin (28 MB, Turing) ships in the initramfs on an Ada card. If the firmware set can be narrowed to the installed GPU generation, that is another easy saving.

Workaround in use

A drop-in sorting after Omarchy's, so package updates re-add kms upstream and it gets removed again:

# /etc/mkinitcpio.conf.d/zzz-drop-kms.conf
_nokms_hooks=()
for _nokms_hook in "${HOOKS[@]}"; do
  [[ $_nokms_hook == "kms" ]] || _nokms_hooks+=("$_nokms_hook")
done
HOOKS=("${_nokms_hooks[@]}")
unset _nokms_hooks _nokms_hook

Environment

Omarchy   4.0.3 -> 4.0.4
kernel    7.2.3-arch1-3, linux-omarchy 7.2.5-3
GPU       RTX 4080 SUPER (AD103), driver 610.57.04, both monitors on DP
iGPU      AMD Raphael (0d:00.0), amdgpu bound, no connected outputs
boot      Limine 12.8.0, UKI, ESP 2.0 GB
root      btrfs @ on LUKS2, TPM2 auto-unlock (sd-encrypt)
View raw text
### Summary

The `kms`-dropping heuristic in `mkinitcpio.conf.d/omarchy_hooks.conf` keys off *GPU presence* rather than *whether that GPU drives a display*. On a desktop with an NVIDIA card and an idle AMD iGPU, it keeps `kms` and pulls ~130 MB of firmware for drivers that never load — the exact cost the file's own comment warns about. On a 2 GB ESP that is the difference between a working system and an unbootable one.

### Current behaviour

```bash
if [[ " ${MODULES[*]:-} " == *" nvidia_drm "* ]]; then
  _omarchy_nvidia_gpu=0
  _omarchy_other_gpu=0
  for _omarchy_pci in "${OMARCHY_PCI_DEVICES_PATH:-/sys/bus/pci/devices}"/*; do
    ...
    [[ $(<"$_omarchy_pci/class") == "0x03"* ]] || continue
    if [[ $(<"$_omarchy_pci/vendor") == "0x10de" ]]; then
      _omarchy_nvidia_gpu=1
    else
      _omarchy_other_gpu=1
    fi
  done
  if ((_omarchy_nvidia_gpu && !_omarchy_other_gpu)); then
    # drop kms
```

`kms` is dropped only when NVIDIA is the **sole** GPU. The accompanying comment explains the intent:

> Keeping the kms hook on such a system makes autodetect pull in nouveau — and ~100 MB of its GSP firmware — for a driver that never runs. [...] Hybrid systems keep kms: their iGPU still needs it for early KMS at the LUKS prompt.

That reasoning is sound for laptops, where the panel hangs off the iGPU. It misfires on a desktop where the iGPU exists but nothing is plugged into it.

### This machine

Ryzen 9 7950X exposes its Raphael iGPU, so `_omarchy_other_gpu=1` and `kms` stays. But the iGPU drives nothing:

```
/sys/class/drm/card0 -> amdgpu    card0-Writeback-1   (no real output)
/sys/class/drm/card1 -> nvidia    card1-DP-1 connected
                                  card1-DP-2 connected
```

Both monitors are on the NVIDIA card, which does its own early KMS via `nvidia.conf` (`nvidia_drm` with `modeset=1`).

### Measured cost

Built both variants against the same root, kernel `7.2.3-arch1-3`, in a tmpfs overlay:

| | initramfs | firmware |
|---|---|---|
| `kms` kept (current) | **273 MB** | 1380 files, incl. 667 amdgpu + nouveau `ga102`/`tu102` GSP |
| `kms` dropped | **134 MB** | 6 nvidia, 14 intel; no amdgpu, no nouveau |

Breakdown of the 245 MB of firmware in the current image:

```
102 MB  nvidia/ga102 + nvidia/tu102 GSP   <- nouveau; nouveau never loads
 80 MB  nvidia/610.57.04/gsp_ga10x.bin    <- needed (AD103)
 28 MB  nvidia/610.57.04/gsp_tu10x.bin    <- Turing, wrong generation
 28 MB  firmware/amdgpu/* (667 files)     <- iGPU drives nothing
```

Dropping `kms` removed 139 MB. On-disk UKI went 280 MB -> 141 MB. Boot got faster too, since Limine reads less off the ESP:

```
loader  27.387s -> 3.480s
kernel  18.101s -> 1.916s
total   1min 46s -> 1min 17s
```

Early KMS and Plymouth were unaffected — `gsp_ga10x.bin` is retained and `nvidia_drm` still comes up in the initramfs:

```
[drm] [nvidia-drm] [GPU ID 0x00000100] Loading driver
[drm] Initialized nvidia-drm 0.0.0 for 0000:01:00.0 on minor 1
fbcon: nvidia-drmdrmfb (fb0) is primary device
```

### Why this matters beyond disk usage

At 280 MB per UKI, with `limine-snapper-sync` retaining one copy per snapshot, ESP demand is `(kernels + snapshots) x 280 MB`. Against a 2 GB ESP and `NUMBER_LIMIT=5` that is ~1.7 GB, and a kernel upgrade eventually fails to write its image. The system stops booting, the user ends up stuck on a recovery subvolume, and snapshot sync silently stops. At 141 MB the same configuration needs ~700 MB and the failure mode disappears.

### Suggested fix

Refine the scan: treat a non-NVIDIA GPU as "needs kms" only when it has a **connected** connector. Something along the lines of walking `/sys/class/drm/card*/card*-*/status` and mapping each card back to its PCI device, counting `connected` only. Laptops keep `kms` as today; desktops with an idle iGPU drop it and save ~130 MB. Preserve the existing inconclusive-means-keep-kms bias for unreadable sysfs.

Separately worth considering: `gsp_tu10x.bin` (28 MB, Turing) ships in the initramfs on an Ada card. If the firmware set can be narrowed to the installed GPU generation, that is another easy saving.

### Workaround in use

A drop-in sorting after Omarchy's, so package updates re-add `kms` upstream and it gets removed again:

```bash
# /etc/mkinitcpio.conf.d/zzz-drop-kms.conf
_nokms_hooks=()
for _nokms_hook in "${HOOKS[@]}"; do
  [[ $_nokms_hook == "kms" ]] || _nokms_hooks+=("$_nokms_hook")
done
HOOKS=("${_nokms_hooks[@]}")
unset _nokms_hooks _nokms_hook
```

### Environment

```
Omarchy   4.0.3 -> 4.0.4
kernel    7.2.3-arch1-3, linux-omarchy 7.2.5-3
GPU       RTX 4080 SUPER (AD103), driver 610.57.04, both monitors on DP
iGPU      AMD Raphael (0d:00.0), amdgpu bound, no connected outputs
boot      Limine 12.8.0, UKI, ESP 2.0 GB
root      btrfs @ on LUKS2, TPM2 auto-unlock (sd-encrypt)
```

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 19:55 UTC