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.
Asahi MacBooks: lid handling can never fire — wrong switch name, and lid state read from /proc/acpi which Asahi lacks
Reported by GonzFC · filed Aug 26, 2026Closed upstream on 2026-10-08 by the bot omarchybot, as a duplicate of #8418 (R-1415). GitHub close reason: not_planned.
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
On Asahi MacBooks, Omarchy's lid handling can never fire — for two independent reasons. A closed lid does nothing at all: the panel stays lit indefinitely, and omarchy-system-lid-close never runs.
Tested on two MacBook Air M1s (Asahi, Omarchy 4.0 Quattro, omarchy-dev 4.0.0.r6560).
1. The switch bind targets a device name Apple hardware does not use
default/hypr/bindings/utilities.lua:
o.bind("switch:on:Lid Switch", nil, "omarchy-system-lid-close", { locked = true })
o.bind("switch:off:Lid Switch", nil, "omarchy-hyprland-monitor-clamshell", { locked = true })But hyprctl devices on these machines reports:
Switches:
Switch Device at aaab301e2000:
Apple SMC power/lid eventsLid Switch never matches, so neither bind fires.
2. omarchy-hw-laptop-closed reads a path Asahi does not provide
for state in /proc/acpi/button/lid/*/state; do
[[ -r $state ]] || continue
[[ $(< "$state") == *"closed"* ]] && exit 0
done
exit 1Asahi has no ACPI. /proc/acpi/button/lid/ does not exist, so this always exits 1 — "lid is open", permanently. Even if the bind above fired, omarchy-system-lid-close would take no action, and omarchy-hw-clamshell can never be true.
The kernel does expose the switch, just not through ACPI:
$ cat /sys/class/input/input0/name
Apple SMC power/lid events
$ cat /sys/class/input/input0/capabilities/sw
1 # bit 0 = SW_LIDEffect
With HandleLidSwitch=ignore in logind (as an always-on host wants), closing the lid leaves the internal panel at full backlight until some unrelated idle timer happens to fire — and never at all if anything keeps the session non-idle. Measured on this hardware: 6.61 W lid-closed-but-lit versus 1.66 W with the panel actually off.
Suggested fix
Two small changes, independent of each other:
- Match the lid switch by capability rather than by name — or bind both
Lid Switchand the Apple name. Reading the device offhyprctl devicesat config time also works. - Give
omarchy-hw-laptop-closeda non-ACPI fallback: find the input device whosecapabilities/swhas bit 0 set and readSW_LIDstate from it, rather than assuming/proc/acpi.
Happy to open a PR for either or both if the shape sounds right — I have a working local implementation of the switch-name half.
View raw text
On Asahi MacBooks, Omarchy's lid handling can never fire — for two independent reasons. A closed lid does nothing at all: the panel stays lit indefinitely, and `omarchy-system-lid-close` never runs.
Tested on two MacBook Air M1s (Asahi, Omarchy 4.0 Quattro, `omarchy-dev 4.0.0.r6560`).
### 1. The switch bind targets a device name Apple hardware does not use
`default/hypr/bindings/utilities.lua`:
```lua
o.bind("switch:on:Lid Switch", nil, "omarchy-system-lid-close", { locked = true })
o.bind("switch:off:Lid Switch", nil, "omarchy-hyprland-monitor-clamshell", { locked = true })
```
But `hyprctl devices` on these machines reports:
```
Switches:
Switch Device at aaab301e2000:
Apple SMC power/lid events
```
`Lid Switch` never matches, so neither bind fires.
### 2. `omarchy-hw-laptop-closed` reads a path Asahi does not provide
```bash
for state in /proc/acpi/button/lid/*/state; do
[[ -r $state ]] || continue
[[ $(< "$state") == *"closed"* ]] && exit 0
done
exit 1
```
Asahi has no ACPI. `/proc/acpi/button/lid/` does not exist, so this always exits 1 — "lid is open", permanently. Even if the bind above fired, `omarchy-system-lid-close` would take no action, and `omarchy-hw-clamshell` can never be true.
The kernel does expose the switch, just not through ACPI:
```
$ cat /sys/class/input/input0/name
Apple SMC power/lid events
$ cat /sys/class/input/input0/capabilities/sw
1 # bit 0 = SW_LID
```
### Effect
With `HandleLidSwitch=ignore` in logind (as an always-on host wants), closing the lid leaves the internal panel at full backlight until some unrelated idle timer happens to fire — and never at all if anything keeps the session non-idle. Measured on this hardware: 6.61 W lid-closed-but-lit versus 1.66 W with the panel actually off.
### Suggested fix
Two small changes, independent of each other:
1. Match the lid switch by capability rather than by name — or bind both `Lid Switch` and the Apple name. Reading the device off `hyprctl devices` at config time also works.
2. Give `omarchy-hw-laptop-closed` a non-ACPI fallback: find the input device whose `capabilities/sw` has bit 0 set and read `SW_LID` state from it, rather than assuming `/proc/acpi`.
Happy to open a PR for either or both if the shape sounds right — I have a working local implementation of the switch-name half.
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.