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-4970GitHub issuePublicReceived

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.

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

Third-party menu clones get null appLibrary in 4.0.3, Apps submenu emptyrevision 1 · captured 2026-10-04 12:10 UTC via poll

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

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