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

Bar-widget+service plugins are dead on third-party bars (service-less entry facade)

Reported by PapaLeQuavious · filed Sep 26, 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

Bar-widget+service plugins are dead on third-party bars (service-less entry facade)revision 1 · captured 2026-09-28 21:23 UTC via poll

Bar-widget+service plugins are dead on third-party bars

A plugin with kinds ["bar-widget", "service"] (bar gear + background
service owning a window/IPC target) works fully under the stock bar but its
bar widget silently no-ops under any third-party bar clone.

Repro (with twiking/omasettings 1.3.0 + a bar clone)

  1. omarchy plugin add https://github.com/twiking/omasettings.git --enable

with a third-party bar (e.g. a clone of omarchy.bar) active.
2. Click the plugin's gear in the bar, or run
omarchy-shell shell summon io.github.twiking.omasettings (returns ok).
3. Nothing happens. No journal error.
4. omarchy-shell omasettings show (direct IPC to the service) opens the
window fine — so the service is alive; only the widget-to-service path fails.

Root cause

pluginBarApiFor (plugins/bar/Bar.qml:229-242): the trusted built-in bar
gets pluginShellForId(moduleName) (service-capable facade), while
replacement bars get pluginShellForBarEntry(key, moduleName) — explicitly
"a service-less entry facade". That facade (shell.qml:pluginShellForBarEntry)
creates a PluginShellApi with no `_serviceLookup`, so serviceFor()
always returns null. Any widget written as

readonly property var service: bar && bar.shell && typeof bar.shell.serviceFor === "function"
  ? bar.shell.serviceFor(moduleName) : null

gets null and every service.show()/toggle() silently no-ops — including
shell summon, which routes through findPanelWidget → item.open().

Proposal

Give the bar-entry facade an own-service-only lookup, reusing the owns()
check already defined in pluginShellForBarEntry:

_serviceLookup: function(requestedId) {
  return owns(requestedId)
    ? shell.serviceFor(shell.pluginRegistry.resolveEnabledId(target)) : null
},

This preserves the stated security property (a bar still can't reach another
plugin's live service) while unbreaking the documented widget+service pattern
on third-party bars.

Related

Same reporter hit from the plugin side, where the other half of this
stripped-manifest behavior bites:

  • twiking/omasettings#17 (by Dankestrick) — launcher entry never created:

independently confirms the host strips __sourceDir from third-party
service manifests (publicPluginManifest, shell.qml:316), so
Service.qml onManifestChanged returns early. Notably, their bar gear
works — consistent with this issue, since they're on the stock bar.
- twiking/omasettings#18 — same launcher report, plus confirmation that on a
custom bar clone the gear is dead too (widget→service path), pointing back
here for the widget half.

Together: stock bar = working gear + missing launcher; custom bar = dead gear
+ missing launcher. Both trace to what the host withholds from third-party
plugins.

Environment

  • Omarchy shell with PluginShellApi-scoped facades (service-less entry

facade + publicPluginManifest stripping __sourceDir, shell.qml:316).
- Two monitors (DP-1 focused + HDMI-A-1); third-party bar (clone of
omarchy.bar) active; plugin enabled and present in bar.layout.right.

View raw text
## Bar-widget+service plugins are dead on third-party bars

A plugin with kinds `["bar-widget", "service"]` (bar gear + background
service owning a window/IPC target) works fully under the stock bar but its
bar widget silently no-ops under any third-party bar clone.

### Repro (with twiking/omasettings 1.3.0 + a bar clone)

1. `omarchy plugin add https://github.com/twiking/omasettings.git --enable`
   with a third-party bar (e.g. a clone of `omarchy.bar`) active.
2. Click the plugin's gear in the bar, or run
   `omarchy-shell shell summon io.github.twiking.omasettings` (returns `ok`).
3. Nothing happens. No journal error.
4. `omarchy-shell omasettings show` (direct IPC to the service) opens the
   window fine — so the service is alive; only the widget-to-service path fails.

### Root cause

`pluginBarApiFor` (`plugins/bar/Bar.qml:229-242`): the trusted built-in bar
gets `pluginShellForId(moduleName)` (service-capable facade), while
replacement bars get `pluginShellForBarEntry(key, moduleName)` — explicitly
"a service-less entry facade". That facade (`shell.qml:pluginShellForBarEntry`)
creates a `PluginShellApi` with **no `_serviceLookup`**, so `serviceFor()`
always returns null. Any widget written as

```qml
readonly property var service: bar && bar.shell && typeof bar.shell.serviceFor === "function"
  ? bar.shell.serviceFor(moduleName) : null
```

gets null and every `service.show()`/`toggle()` silently no-ops — including
`shell summon`, which routes through `findPanelWidget` → `item.open()`.

### Proposal

Give the bar-entry facade an own-service-only lookup, reusing the `owns()`
check already defined in `pluginShellForBarEntry`:

```js
_serviceLookup: function(requestedId) {
  return owns(requestedId)
    ? shell.serviceFor(shell.pluginRegistry.resolveEnabledId(target)) : null
},
```

This preserves the stated security property (a bar still can't reach *another*
plugin's live service) while unbreaking the documented widget+service pattern
on third-party bars.

### Related

Same reporter hit from the plugin side, where the other half of this
stripped-manifest behavior bites:

- twiking/omasettings#17 (by Dankestrick) — launcher entry never created:
  independently confirms the host strips `__sourceDir` from third-party
  service manifests (`publicPluginManifest`, `shell.qml:316`), so
  `Service.qml onManifestChanged` returns early. Notably, their bar gear
  *works* — consistent with this issue, since they're on the stock bar.
- twiking/omasettings#18 — same launcher report, plus confirmation that on a
  custom bar clone the gear is dead too (widget→service path), pointing back
  here for the widget half.

Together: stock bar = working gear + missing launcher; custom bar = dead gear
+ missing launcher. Both trace to what the host withholds from third-party
plugins.

### Environment

- Omarchy shell with `PluginShellApi`-scoped facades (service-less entry
  facade + `publicPluginManifest` stripping `__sourceDir`, `shell.qml:316`).
- Two monitors (DP-1 focused + HDMI-A-1); third-party bar (clone of
  omarchy.bar) active; plugin enabled and present in `bar.layout.right`.

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:48 UTC