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.
Third-party menu clones get null appLibrary in 4.0.3, Apps submenu empty
Reported by crueber · filed Sep 9, 2026Closed upstream on 2026-09-20 by bjarneo via an automated message, as a duplicate of #10908 (R-4970). GitHub close reason: completed.
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
What happened
After updating to omarchy 4.0.3-1, any third-party plugin with "menu" kind (e.g. a clone of omarchy.menu) opens fine but its Apps submenu is permanently empty ("Nothing here yet"). The stock omarchy.menu still lists apps correctly.
Root cause (validated)
The 4.0.2 -> 4.0.3 update introduced capability-scoped shells (pluginShellFor / createScopedPluginShell in shell.qml). A third-party menu's panel item receives a scoped PluginShellApi whose appLibrary property is null, so mergeAppRows() early-returns and providersLoaded["apps"] is still marked loaded, leaving the submenu empty forever.
Introspection on the live object (via a temporary IPC method, since removed):
{"hasShell":true,"hasAppLibrary":false,"rows":-1,"itemsCount":334,"appsLoaded":true,
"manifestId":"crueber.omarchy-compact-docked-menu","manifestKinds":"[\"menu\",\"bar-widget\"]",
"hasBar":true,"shellPluginId":"crueber.omarchy-compact-docked-menu"}So: scoped shell present, manifest kinds intact (["menu","bar-widget"]), bar proxy set — but appLibrary null. Same result with a from-scratch minimal plugin (kinds: ["menu"]), ruling out anything specific to the cloned code:
{"hasShell":true,"hasAppLibrary":false,"pluginId":"crueber.ccdtest-menu"}Since shell.qml sets appLibrary: shell.manifestHasKind(manifest, "menu") ? shell.pluginAppLibraryFor(cacheKey, key) : null, either manifestHasKind is false for third-party manifests at creation time, or pluginAppLibraryFor returns null (no errors logged in either case).
Likely related: third-party overlays (e.g. min-launcher, kinds: ["overlay"]) also use shell.appLibrary but can never receive it under the current manifestHasKind(manifest, "menu") gate.
Steps to reproduce
- On omarchy 4.0.3-1:
omarchy plugin clone omarchy.menu(enables the clone, disables stock) omarchy restart shell(required —keepLoaded: truepanels do not pick up file edits via hot-reload/rescan)omarchy menu summon apps(resolves to the clone) — empty; stock showed ~100 entries- Fresh minimal repro: manifest
{"id":"...","kinds":["menu"],"entryPoints":{"menu":"Menu.qml"}}with aMenu.qmlreporting!!root.shell.appLibraryvia acallmethod — returns false
Expected
A third-party plugin declaring "menu" kind receives a working appLibrary proxy (like bar), so Apps lists installed desktop entries.
System
- omarchy 4.0.3-1 (also verified stock Menu.qml/MenuModel.js/BarWidget.qml/AppLibrary.qml unchanged 4.0.2 -> 4.0.3; only shell.qml scoping is new)
- Hyprland, XDG_CURRENT_DESKTOP=Hyprland, single quickshell instance
- Workaround: re-enable stock
omarchy.menu(first-party gets the full shell, unaffected)
Notes
keepLoaded: truemenu panels do not reload edited QML on save/rescan (LoadersourceURL unchanged); onlyomarchy restart shellpicks up changes. That cost several debug cycles — may be worth documenting.
View raw text
## What happened
After updating to omarchy 4.0.3-1, any third-party plugin with `"menu"` kind (e.g. a clone of `omarchy.menu`) opens fine but its **Apps** submenu is permanently empty ("Nothing here yet"). The stock `omarchy.menu` still lists apps correctly.
## Root cause (validated)
The 4.0.2 -> 4.0.3 update introduced capability-scoped shells (`pluginShellFor` / `createScopedPluginShell` in `shell.qml`). A third-party menu's panel item receives a scoped `PluginShellApi` whose `appLibrary` property is `null`, so `mergeAppRows()` early-returns and `providersLoaded["apps"]` is still marked loaded, leaving the submenu empty forever.
Introspection on the live object (via a temporary IPC method, since removed):
```json
{"hasShell":true,"hasAppLibrary":false,"rows":-1,"itemsCount":334,"appsLoaded":true,
"manifestId":"crueber.omarchy-compact-docked-menu","manifestKinds":"[\"menu\",\"bar-widget\"]",
"hasBar":true,"shellPluginId":"crueber.omarchy-compact-docked-menu"}
```
So: scoped shell present, manifest `kinds` intact (`["menu","bar-widget"]`), `bar` proxy set — but `appLibrary` null. Same result with a from-scratch minimal plugin (`kinds: ["menu"]`), ruling out anything specific to the cloned code:
```json
{"hasShell":true,"hasAppLibrary":false,"pluginId":"crueber.ccdtest-menu"}
```
Since `shell.qml` sets `appLibrary: shell.manifestHasKind(manifest, "menu") ? shell.pluginAppLibraryFor(cacheKey, key) : null`, either `manifestHasKind` is false for third-party manifests at creation time, or `pluginAppLibraryFor` returns null (no errors logged in either case).
Likely related: third-party **overlays** (e.g. min-launcher, `kinds: ["overlay"]`) also use `shell.appLibrary` but can never receive it under the current `manifestHasKind(manifest, "menu")` gate.
## Steps to reproduce
1. On omarchy 4.0.3-1: `omarchy plugin clone omarchy.menu` (enables the clone, disables stock)
2. `omarchy restart shell` (required — `keepLoaded: true` panels do not pick up file edits via hot-reload/rescan)
3. `omarchy menu summon apps` (resolves to the clone) — empty; stock showed ~100 entries
4. Fresh minimal repro: manifest `{"id":"...","kinds":["menu"],"entryPoints":{"menu":"Menu.qml"}}` with a `Menu.qml` reporting `!!root.shell.appLibrary` via a `call` method — returns false
## Expected
A third-party plugin declaring `"menu"` kind receives a working `appLibrary` proxy (like `bar`), so Apps lists installed desktop entries.
## System
- omarchy 4.0.3-1 (also verified stock Menu.qml/MenuModel.js/BarWidget.qml/AppLibrary.qml unchanged 4.0.2 -> 4.0.3; only shell.qml scoping is new)
- Hyprland, XDG_CURRENT_DESKTOP=Hyprland, single quickshell instance
- Workaround: re-enable stock `omarchy.menu` (first-party gets the full shell, unaffected)
## Notes
- `keepLoaded: true` menu panels do not reload edited QML on save/rescan (Loader `source` URL unchanged); only `omarchy restart shell` picks up changes. That cost several debug cycles — may be worth documenting.
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.