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.
omarchy-menu-keybindings hangs forever when user Lua config iterates an hl.get_*() result
Reported by KouenNoTen · filed Oct 4, 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?
- 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. So far: in the audited area (menu) — decided by agents · verified; matches no known issue — decided by agents · verified. The outcome (valid, duplicate, not a bug, …) is not decided yet. See the decision.
Original report
Omarchy version: 4.0.4 (Lua Hyprland config)
What happens
SUPER+K never opens the keybindings menu. omarchy-menu-keybindings --print hangs with no output. Each press leaves a lua process spinning at 100% CPU (I had 18), and an empty ~/.cache/omarchy/keybindings.XXXXXX file behind (I had ~70).
Cause
build_lua_bind_cache loads ~/.config/hypr/hyprland.lua against a stub hl. Unknown fields resolve to noop, whose __index and __call both return noop:
local noop
noop = setmetatable({}, {
__index = function() return noop end,
__call = function() return noop end,
})So hl.get_monitors() (or any hl.get_*()) returns noop, and noop[i] is never nil. Any user config that runs at load time like
for _, monitor in ipairs(hl.get_monitors()) do ... endloops forever (ipairs honours __index, Lua 5.5). The bash while read loop around the lua <<'LUA' heredoc then waits forever too.
Minimal repro
Add to ~/.config/hypr/hyprland.lua:
for _ in ipairs(hl.get_monitors()) do endHyprland itself is fine, but omarchy-menu-keybindings --print now never returns.
Suggested fixes
- Make the stub safe to iterate. For example, have
noop's__indexreturnnilfor integer keys, or have stubbedhl.get_*return{}. - Run the Lua scan under a
timeout, so a bad user config degrades the menu (e.g. no Lua binds listed) rather than hanging it. - In
refresh_keybindings_cache, clean uptmp_filewith atrapon EXIT/INT/TERM. Today it is only removed whenoutput_binding_records_uncachedreturns non-zero, so a hung or killed run leaks it.
Workaround
In user config, copy hl.get_*() results with rawget(t, i) before iterating.
View raw text
**Omarchy version:** 4.0.4 (Lua Hyprland config)
## What happens
SUPER+K never opens the keybindings menu. `omarchy-menu-keybindings --print` hangs with no output. Each press leaves a `lua` process spinning at 100% CPU (I had 18), and an empty `~/.cache/omarchy/keybindings.XXXXXX` file behind (I had ~70).
## Cause
`build_lua_bind_cache` loads `~/.config/hypr/hyprland.lua` against a stub `hl`. Unknown fields resolve to `noop`, whose `__index` and `__call` both return `noop`:
```lua
local noop
noop = setmetatable({}, {
__index = function() return noop end,
__call = function() return noop end,
})
```
So `hl.get_monitors()` (or any `hl.get_*()`) returns `noop`, and `noop[i]` is never nil. Any user config that runs at load time like
```lua
for _, monitor in ipairs(hl.get_monitors()) do ... end
```
loops forever (`ipairs` honours `__index`, Lua 5.5). The bash `while read` loop around the `lua <<'LUA'` heredoc then waits forever too.
## Minimal repro
Add to `~/.config/hypr/hyprland.lua`:
```lua
for _ in ipairs(hl.get_monitors()) do end
```
Hyprland itself is fine, but `omarchy-menu-keybindings --print` now never returns.
## Suggested fixes
1. Make the stub safe to iterate. For example, have `noop`'s `__index` return `nil` for integer keys, or have stubbed `hl.get_*` return `{}`.
2. Run the Lua scan under a `timeout`, so a bad user config degrades the menu (e.g. no Lua binds listed) rather than hanging it.
3. In `refresh_keybindings_cache`, clean up `tmp_file` with a `trap` on EXIT/INT/TERM. Today it is only removed when `output_binding_records_uncached` returns non-zero, so a hung or killed run leaks it.
## Workaround
In user config, copy `hl.get_*()` results with `rawget(t, i)` before iterating.
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
- Fixed bypr/12712· confirmed
- Fixed bypr/7564· confirmed
- Fixed bypr/13276· confirmed
- Fixed bypr/11733· confirmed
- Fixed bypr/12155· confirmed
- Related toR-1816omarchy-menu-keybindings hangs forever when a user Lua config iterates hl.get_monitors()· decided by agents · verified
- Related PRpr/14128· confirmed
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.
- Decided by agents · verified: in the audited area (menu)
- Decided by agents · verified: matches no known issue
The outcome (valid, duplicate, not a bug, …) is not decided yet.