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.
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
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
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 kmskms 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 connectedBoth 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 nothingDropping 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 17sEarly 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 deviceWhy 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_hookEnvironment
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