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

Super+K keybindings menu hangs forever when user config iterates hl.get_monitors() with ipairs

Reported by RodriMora · filed Sep 9, 2026Closed upstream on 2026-09-20 by bjarneo via an automated message, as a duplicate of #7025 (R-1816). GitHub close reason: completed.

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

Super+K keybindings menu hangs forever when user config iterates hl.get_monitors() with ipairsrevision 1 · captured 2026-10-04 12:10 UTC via poll

What happened

Pressing SUPER + K (keybindings menu, omarchy-menu-keybindings) does nothing: the menu never appears. The process silently spins at ~100% CPU forever.

Root cause

omarchy-menu-keybindings scans the user's config by dofile-ing ~/.config/hypr/hyprland.lua under a stub environment in which every hl.* call returns a shared "noop" proxy table (with __index returning another noop).

Any user config that iterates monitors with ipairs(hl.get_monitors()) at load time hangs forever in that environment, because ipairs resolves every index through __index, which always returns the noop table — the loop never reaches nil.

Steps to reproduce

  1. In ~/.config/hypr/monitors.lua add at load time:
local function workspace_monitors()
  local external, laptop
  for _, monitor in ipairs(hl.get_monitors()) do
    if monitor.name == "DP-1" then external = monitor end
    if monitor.name == "eDP-1" then laptop = monitor end
  end
  return external, laptop
end
workspace_monitors()
  1. Press SUPER + K — the menu never opens; omarchy-menu-keybindings spins at 100% CPU.
  2. Confirm with omarchy-menu-keybindings --print — it produces no output and never exits.

Expected

The mock hl environment used by the bindings scanner should behave like an empty monitor list so ipairs terminates (e.g. have get_monitors() return a real empty table, or give the noop proxy a __len/__index that returns nil for numeric keys). User configs shouldn't hard-hang the menu scanner.

Workaround (user-side)

Iterate with a numeric for instead of ipairs:

local monitors = hl.get_monitors() or {}
for i = 1, #monitors do
  local monitor = monitors[i]
  ...
end

(#noop is 0 since the proxy has no array part, so the loop terminates.)

System details

  • Omarchy: 4.0.3-1
  • CPU: Intel Core Ultra X7 358H
  • GPU: Intel Arc B390 (Panther Lake)
  • Kernel: 7.2.3-arch1-1-ptl
View raw text
### What happened

Pressing `SUPER + K` (keybindings menu, `omarchy-menu-keybindings`) does nothing: the menu never appears. The process silently spins at ~100% CPU forever.

### Root cause

`omarchy-menu-keybindings` scans the user's config by `dofile`-ing `~/.config/hypr/hyprland.lua` under a stub environment in which every `hl.*` call returns a shared "noop" proxy table (with `__index` returning another noop).

Any user config that iterates monitors with `ipairs(hl.get_monitors())` at load time hangs forever in that environment, because `ipairs` resolves every index through `__index`, which always returns the noop table — the loop never reaches `nil`.

### Steps to reproduce

1. In `~/.config/hypr/monitors.lua` add at load time:

```lua
local function workspace_monitors()
  local external, laptop
  for _, monitor in ipairs(hl.get_monitors()) do
    if monitor.name == "DP-1" then external = monitor end
    if monitor.name == "eDP-1" then laptop = monitor end
  end
  return external, laptop
end
workspace_monitors()
```

2. Press `SUPER + K` — the menu never opens; `omarchy-menu-keybindings` spins at 100% CPU.
3. Confirm with `omarchy-menu-keybindings --print` — it produces no output and never exits.

### Expected

The mock `hl` environment used by the bindings scanner should behave like an empty monitor list so `ipairs` terminates (e.g. have `get_monitors()` return a real empty table, or give the noop proxy a `__len`/`__index` that returns `nil` for numeric keys). User configs shouldn't hard-hang the menu scanner.

### Workaround (user-side)

Iterate with a numeric for instead of ipairs:

```lua
local monitors = hl.get_monitors() or {}
for i = 1, #monitors do
  local monitor = monitors[i]
  ...
end
```

(`#noop` is 0 since the proxy has no array part, so the loop terminates.)

### System details

- Omarchy: 4.0.3-1
- CPU: Intel Core Ultra X7 358H
- GPU: Intel Arc B390 (Panther Lake)
- Kernel: 7.2.3-arch1-1-ptl

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/11733· confirmed
  • Fixed bypr/12155· 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.

No decision has been recorded yet.