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-3705GitHub issuePublicReceived

Kernel panic after update: /boot/EFI/Limine/limine.conf not synced with /boot/limine.conf

Reported by tsurelad · filed Nov 11, 2025Closed upstream on 2025-11-21 by ryanrhughes. GitHub close reason: completed. No closing PR or commit is recorded — "completed" alone is not evidence of a fix.

Received and recorded verbatim. Nothing has been checked yet.

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?
Not yet mapped to any requirement or component.
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?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.

Original report

Kernel panic after update: /boot/EFI/Limine/limine.conf not synced with /boot/limine.confrevision 1 · captured 2026-10-04 11:42 UTC via poll

System details

Omarchy Version: 3.1.7, Kernel: 6.17.3-arch2-1 → 6.17.7-arch1-1, limine: 10.1.1 → 10.3.0

What's wrong?

## Problem Description

After updating Omarchy today (kernel 6.17.3-arch2-1 → 6.17.7-arch1-1, limine 10.1.1 → 10.3.0), booting via the "Limine" BIOS entry resulted in a kernel panic. The system booted successfully via the "Omarchy" direct UKI BIOS entry.

## Root Cause

Limine EFI bootloader searches for configuration in a specific order:

When the BIOS loads the Limine bootloader at /boot/EFI/Limine/limine_x64.efi, Limine searches for its config in this order:
1. First: <EFI app path>/limine.conf → /boot/EFI/Limine/limine.conf
2. Fallback: /boot/limine/limine.conf, /boot/limine.conf, etc.

The issue: Only /boot/limine.conf gets updated by the limine-mkinitcpio-hook package during kernel updates. If /boot/EFI/Limine/limine.conf exists, it takes precedence but never gets updated, causing a stale config to be used.

## How This Happens

Looking at Omarchy's installation script ~/.local/share/omarchy/install/login/limine-snapper.sh:

  # Lines 8-20: Check if old config exists from archinstall
  [[ -f /boot/EFI/limine/limine.conf ]] || [[ -f /boot/EFI/BOOT/limine.conf ]] && EFI=true

  # Lines 59-79: Create new /boot/limine.conf with Omarchy branding
  sudo tee /boot/limine.conf <<EOF >/dev/null
  ...
  EOF

  # Lines 82-84: Attempt to remove old config
  if [[ "$limine_config" != "/boot/limine.conf" ]] && [[ -f "$limine_config" ]]; then
    sudo rm "$limine_config"
  fi

The problem: The deletion at line 83 doesn't always succeed or the file gets recreated. Since /boot is FAT32 (case-insensitive), /boot/EFI/limine/ and /boot/EFI/Limine/ are the same directory, which can cause confusion.

## Evidence

File timestamps after kernel update:
$ stat /boot/limine.conf -c "Modified: %y"
Modified: 2025-11-11 10:15:44 ✅ Updated by mkinitcpio hook

$ stat /boot/EFI/Limine/limine.conf -c "Modified: %y"
Birth: 2025-10-17 13:53:03 ❌ NOT updated, stale since installation

Stale config references non-existent files:
$ cat /boot/EFI/Limine/limine.conf
timeout: 2
/Arch Linux (linux)
protocol: linux
path: boot():/vmlinuz-linux # ❌ Doesn't exist
module_path: boot():/initramfs-linux.img # ❌ Doesn't exist

$ ls /boot/vmlinuz-linux
ls: /boot/vmlinuz-linux: No such file or directory

After the update, the system uses UKI (Unified Kernel Images), but the stale config still references the old split kernel/initramfs files.

## Impact

  • ❌ Kernel panic when booting via "Limine" BIOS entry
  • ❌ No snapshot menu available for btrfs rollbacks
  • ✅ Direct "Omarchy" UKI boot still works (bypasses the issue)

This particularly affects users who:
- Installed Arch with archinstall + Limine, then installed Omarchy
- Rely on Limine's menu for accessing btrfs snapshots via Snapper
- Have both "Limine" and "Omarchy" BIOS entries

## Reproduction Steps

  1. Install Arch Linux using archinstall with Limine bootloader
  2. Install/update Omarchy (which creates /boot/limine.conf)
  3. Check if /boot/EFI/Limine/limine.conf still exists
  4. Perform a kernel update (e.g., via yay -Syu)
  5. Reboot via the "Limine" BIOS entry → kernel panic

## Proposed Solutions

Option 1: Force Delete During Installation (Most reliable)
Modify install/login/limine-snapper.sh to explicitly remove both case variants:

  # After line 84, add:
  sudo rm -f /boot/EFI/limine/limine.conf /boot/EFI/Limine/limine.conf /boot/EFI/BOOT/limine.conf

Option 2: Add Sync Hook (More user-friendly)
Create an Omarchy pacman hook to sync the config after updates:

  # /etc/pacman.d/hooks/99-omarchy-limine-sync.hook
  [Trigger]
  Operation = Install
  Operation = Upgrade
  Type = Package
  Target = linux
  Target = linux-lts
  Target = limine
  Target = limine-mkinitcpio-hook

  [Action]
  Description = Syncing Limine config to EFI directory...
  When = PostTransaction
  Exec = /bin/sh -c "[ -f /boot/EFI/Limine/limine.conf ] && cp -f /boot/limine.conf /boot/EFI/Limine/limine.conf || true"

Option 3: Document the Issue (Minimal)
Add to Omarchy docs/troubleshooting:
> If you experience boot issues after updates, check if /boot/EFI/Limine/limine.conf exists and remove it, or sync it with /boot/limine.conf.

## Workaround

Users can manually sync the configs after updates:
sudo cp /boot/limine.conf /boot/EFI/Limine/limine.conf

Or permanently fix by removing the EFI directory config:
sudo rm /boot/EFI/Limine/limine.conf # Forces fallback to /boot/limine.conf

## System Details

  • Omarchy Version: 3.1.7
  • Kernel: 6.17.3-arch2-1 → 6.17.7-arch1-1
  • limine: 10.1.1 → 10.3.0
  • limine-mkinitcpio-hook: 1.24.0-3 → 1.25.3-1
  • Boot method: UKI (Unified Kernel Images)
  • Filesystem: Btrfs with LUKS encryption + Snapper

## Related

  • #2431 - Issues with limine.conf location finding
  • #1068 - Limine + Snapper documentation request

## Additional Notes

The case-insensitivity of FAT32 means /boot/EFI/Limine/ and /boot/EFI/limine/ are the same directory, but Linux tools may reference them inconsistently. This can cause the deletion logic in limine-snapper.sh to fail silently.

View raw text
### System details

Omarchy Version: 3.1.7, Kernel: 6.17.3-arch2-1 → 6.17.7-arch1-1, limine: 10.1.1 → 10.3.0

### What's wrong?

  ## Problem Description

  After updating Omarchy today (kernel 6.17.3-arch2-1 → 6.17.7-arch1-1, limine 10.1.1 → 10.3.0), booting via the "Limine" BIOS entry resulted in a **kernel panic**. The system booted successfully via the "Omarchy" direct UKI BIOS entry.

  ## Root Cause

  **Limine EFI bootloader searches for configuration in a specific order:**

  When the BIOS loads the Limine bootloader at `/boot/EFI/Limine/limine_x64.efi`, Limine [searches for its config](https://github.com/limine-bootloader/limine/blob/trunk/CONFIG.md) in this order:
  1. **First**: `<EFI app path>/limine.conf` → `/boot/EFI/Limine/limine.conf`
  2. **Fallback**: `/boot/limine/limine.conf`, `/boot/limine.conf`, etc.

  **The issue:** Only `/boot/limine.conf` gets updated by the `limine-mkinitcpio-hook` package during kernel updates. If `/boot/EFI/Limine/limine.conf` exists, it takes precedence but never gets updated, causing a stale config to be used.

  ## How This Happens

  Looking at Omarchy's installation script `~/.local/share/omarchy/install/login/limine-snapper.sh`:

  ```bash
  # Lines 8-20: Check if old config exists from archinstall
  [[ -f /boot/EFI/limine/limine.conf ]] || [[ -f /boot/EFI/BOOT/limine.conf ]] && EFI=true

  # Lines 59-79: Create new /boot/limine.conf with Omarchy branding
  sudo tee /boot/limine.conf <<EOF >/dev/null
  ...
  EOF

  # Lines 82-84: Attempt to remove old config
  if [[ "$limine_config" != "/boot/limine.conf" ]] && [[ -f "$limine_config" ]]; then
    sudo rm "$limine_config"
  fi
  ```

  The problem: The deletion at line 83 doesn't always succeed or the file gets recreated. Since /boot is FAT32 (case-insensitive), /boot/EFI/limine/ and /boot/EFI/Limine/ are the same directory, which can cause confusion.

  ## Evidence

  File timestamps after kernel update:
  $ stat /boot/limine.conf -c "Modified: %y"
  Modified: 2025-11-11 10:15:44  ✅ Updated by mkinitcpio hook

  $ stat /boot/EFI/Limine/limine.conf -c "Modified: %y"
  Birth: 2025-10-17 13:53:03  ❌ NOT updated, stale since installation

  Stale config references non-existent files:
  $ cat /boot/EFI/Limine/limine.conf
  timeout: 2
  /Arch Linux (linux)
      protocol: linux
      path: boot():/vmlinuz-linux              # ❌ Doesn't exist
      module_path: boot():/initramfs-linux.img  # ❌ Doesn't exist

  $ ls /boot/vmlinuz-linux
  ls: /boot/vmlinuz-linux: No such file or directory

  After the update, the system uses UKI (Unified Kernel Images), but the stale config still references the old split kernel/initramfs files.

  ## Impact

  - ❌ Kernel panic when booting via "Limine" BIOS entry
  - ❌ No snapshot menu available for btrfs rollbacks
  - ✅ Direct "Omarchy" UKI boot still works (bypasses the issue)

  This particularly affects users who:
  - Installed Arch with archinstall + Limine, then installed Omarchy
  - Rely on Limine's menu for accessing btrfs snapshots via Snapper
  - Have both "Limine" and "Omarchy" BIOS entries

  ## Reproduction Steps

  1. Install Arch Linux using archinstall with Limine bootloader
  2. Install/update Omarchy (which creates /boot/limine.conf)
  3. Check if /boot/EFI/Limine/limine.conf still exists
  4. Perform a kernel update (e.g., via yay -Syu)
  5. Reboot via the "Limine" BIOS entry → kernel panic

  ## Proposed Solutions

  Option 1: Force Delete During Installation (Most reliable)
  Modify install/login/limine-snapper.sh to explicitly remove both case variants:
  ```bash
  # After line 84, add:
  sudo rm -f /boot/EFI/limine/limine.conf /boot/EFI/Limine/limine.conf /boot/EFI/BOOT/limine.conf
  ```

  Option 2: Add Sync Hook (More user-friendly)
  Create an Omarchy pacman hook to sync the config after updates:
  ```bash
  # /etc/pacman.d/hooks/99-omarchy-limine-sync.hook
  [Trigger]
  Operation = Install
  Operation = Upgrade
  Type = Package
  Target = linux
  Target = linux-lts
  Target = limine
  Target = limine-mkinitcpio-hook

  [Action]
  Description = Syncing Limine config to EFI directory...
  When = PostTransaction
  Exec = /bin/sh -c "[ -f /boot/EFI/Limine/limine.conf ] && cp -f /boot/limine.conf /boot/EFI/Limine/limine.conf || true"
  ```

  Option 3: Document the Issue (Minimal)
  Add to Omarchy docs/troubleshooting:
  > If you experience boot issues after updates, check if /boot/EFI/Limine/limine.conf exists and remove it, or sync it with /boot/limine.conf.

  ## Workaround

  Users can manually sync the configs after updates:
  `sudo cp /boot/limine.conf /boot/EFI/Limine/limine.conf`

  Or permanently fix by removing the EFI directory config:
  `sudo rm /boot/EFI/Limine/limine.conf  # Forces fallback to /boot/limine.conf`

  ## System Details

  - Omarchy Version: 3.1.7
  - Kernel: 6.17.3-arch2-1 → 6.17.7-arch1-1
  - limine: 10.1.1 → 10.3.0
  - limine-mkinitcpio-hook: 1.24.0-3 → 1.25.3-1
  - Boot method: UKI (Unified Kernel Images)
  - Filesystem: Btrfs with LUKS encryption + Snapper

  ## Related

  - #2431 - Issues with limine.conf location finding
  - #1068 - Limine + Snapper documentation request

  ## Additional Notes

  The case-insensitivity of FAT32 means /boot/EFI/Limine/ and /boot/EFI/limine/ are the same directory, but Linux tools may reference them inconsistently. This can cause the deletion logic in limine-snapper.sh to fail silently.

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.

No decision has been recorded yet.