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-5137GitHub issuePublicFixed

omarchy-menu-keybindings hangs forever when user Lua config iterates an hl.get_*() result

Reported by KouenNoTen · filed Oct 4, 2026 · open at source

In the audited area (menu) — decided by agents · verified. Not validated 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?
AreaIn the audited areamenu· 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?
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-menu-keybindings hangs forever when user Lua config iterates an hl.get_*() resultrevision 1 · captured 2026-10-04 14:22 UTC via poll

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 ... 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:

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.

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

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.