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-266GitHub issuePublicDecided· Out of scope

Third-party bar cannot pass a bar widget its own plugin's live service (scoped shell blocks service-backed widgets)

Reported by PNowakBG · filed Sep 20, 2026 · open at source

Decided: Out of scope — decided by agents · verified 3 days ago.

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?
AreaOutside the audited area· 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?
Decided by agents and verified by a second, independent agent — see the decision.

Original report

Third-party bar cannot pass a bar widget its own plugin's live service (scoped shell blocks service-backed widgets)revision 1 · captured 2026-09-28 21:23 UTC via poll

Description

When the active bar is a third-party bar plugin (a kind: ["bar"] plugin that is not first-party — e.g. a clone of omarchy.bar), any hosted service-backed bar widget (a plugin declaring both service and bar-widget kinds) can no longer reach its own plugin's live service. The widget stays stuck in its "not ready" state forever, even though the backing service is running and healthy.

The widget does everything correctly — it asks the bar for its service via bar.shell.serviceFor(PLUGIN_ID) — but under a third-party bar the shell handed to the bar is a scoped shell whose serviceFor() returns null for anything outside a small first-party allowlist. So the widget silently never becomes ready. There is no error in the logs.

Steps to reproduce

  1. Install/enable any plugin that declares kinds: ["service", "bar-widget"] (e.g. oliwier.auto-pilot4agents, or the built-in omarchy.media / a clone like pablo.media) and add its widget to the bar.
  2. Switch the active bar to a third-party bar plugin: omarchy bar use <third-party-bar-id> (e.g. a clone of omarchy.bar).
  3. Observe the widget: it remains in its "starting"/not-ready state indefinitely.
  4. Switch back to the default first-party bar (omarchy bar use omarchy.bar): the widget becomes ready and works normally.

Expected behavior

A bar widget should be able to reach its own plugin's service even when hosted by a third-party bar. The scoping boundary should prevent a widget from reaching other plugins' services, but not its own (owns-check).

Actual behavior

bar.shell.serviceFor(<own PLUGIN_ID>) returns null under a third-party bar, so the widget is permanently non-functional. The backing service is confirmed healthy at the same time (its IPC status() reports {"ready":true,...}).

Root cause (verified in shell source)

  • shell/shell.qml pluginShellFor(manifest): a first-party bar receives the full shell (whose serviceFor() resolves any plugin's service), but a third-party bar receives createScopedPluginShell(...).
  • In the scoped shell, the service lookups only expose a fixed first-party allowlist (["omarchy.idle", "omarchy.media", "omarchy.nightlight", "omarchy.notifications"]) and gate even those on activeBarManifest.__isFirstParty. The inline comment states the intent: "not … access to another plugin's live service."
  • A hosted widget's own service is therefore unreachable, because the scoping treats "the widget's own service" the same as "another plugin's service."

Impact

Third-party bars and service-backed widgets are mutually exclusive, silently. Users who run a custom bar (very common — auto-hiding bars, alternative layouts) lose all service-backed widgets with no visible error, and vice versa.

Suggested fix

Allow a scoped bar's per-widget shell to resolve the widget's own plugin service (an owns()-style check keyed by the widget's plugin id), while keeping the existing block on reaching other plugins' services.

System details

  • Omarchy: 4.0.4-1
  • Quickshell: 0.3.1 (Arch)
  • Kernel: 7.2.5-3-omarchy
View raw text
### Description

When the active bar is a **third-party** bar plugin (a `kind: ["bar"]` plugin that is not first-party — e.g. a clone of `omarchy.bar`), any hosted **service-backed** bar widget (a plugin declaring both `service` and `bar-widget` kinds) can no longer reach **its own** plugin's live service. The widget stays stuck in its "not ready" state forever, even though the backing service is running and healthy.

The widget does everything correctly — it asks the bar for its service via `bar.shell.serviceFor(PLUGIN_ID)` — but under a third-party bar the shell handed to the bar is a *scoped* shell whose `serviceFor()` returns `null` for anything outside a small first-party allowlist. So the widget silently never becomes ready. There is no error in the logs.

### Steps to reproduce

1. Install/enable any plugin that declares `kinds: ["service", "bar-widget"]` (e.g. `oliwier.auto-pilot4agents`, or the built-in `omarchy.media` / a clone like `pablo.media`) and add its widget to the bar.
2. Switch the active bar to a third-party bar plugin: `omarchy bar use <third-party-bar-id>` (e.g. a clone of `omarchy.bar`).
3. Observe the widget: it remains in its "starting"/not-ready state indefinitely.
4. Switch back to the default first-party bar (`omarchy bar use omarchy.bar`): the widget becomes ready and works normally.

### Expected behavior

A bar widget should be able to reach **its own** plugin's service even when hosted by a third-party bar. The scoping boundary should prevent a widget from reaching **other** plugins' services, but not its own (`owns`-check).

### Actual behavior

`bar.shell.serviceFor(<own PLUGIN_ID>)` returns `null` under a third-party bar, so the widget is permanently non-functional. The backing service is confirmed healthy at the same time (its IPC `status()` reports `{"ready":true,...}`).

### Root cause (verified in shell source)

- `shell/shell.qml` `pluginShellFor(manifest)`: a first-party bar receives the full `shell` (whose `serviceFor()` resolves any plugin's service), but a third-party bar receives `createScopedPluginShell(...)`.
- In the scoped shell, the service lookups only expose a fixed first-party allowlist (`["omarchy.idle", "omarchy.media", "omarchy.nightlight", "omarchy.notifications"]`) and gate even those on `activeBarManifest.__isFirstParty`. The inline comment states the intent: *"not … access to another plugin's live service."*
- A hosted widget's own service is therefore unreachable, because the scoping treats "the widget's own service" the same as "another plugin's service."

### Impact

Third-party bars and service-backed widgets are mutually exclusive, silently. Users who run a custom bar (very common — auto-hiding bars, alternative layouts) lose all service-backed widgets with no visible error, and vice versa.

### Suggested fix

Allow a scoped bar's per-widget shell to resolve the widget's **own** plugin service (an `owns()`-style check keyed by the widget's plugin id), while keeping the existing block on reaching other plugins' services.

### System details

- Omarchy: 4.0.4-1
- Quickshell: 0.3.1 (Arch)
- Kernel: 7.2.5-3-omarchy

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.

  • Out of scopeDecided by agents · verified · 2026-10-09 19:20 UTC