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.
Bar widget stays disabled: enable/putBarWidget no-op once a plugin already has an overlay plugins[] entry
Reported by theaxlklo · filed Sep 5, 2026 · open at source
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
What happened
For a third-party plugin whose manifest started as "kinds": ["overlay"]
and later gained "bar-widget" (new entryPoints.barWidget +barWidget block, e.g. after adding a status-bar icon to an existing
overlay plugin), both omarchy plugin enable <id> and the underlyingomarchy-shell shell putBarWidget <id> '{}' IPC call report success but
do nothing: the widget is never added to shell.json's bar.layout, andomarchy plugin list keeps reporting it as disabled.
Root cause
In shell/services/PluginRegistry.qml, setEnabled() computeslocation = findEntryLocation(config, key) up front. Because the plugin
already has a top-level entry in config.plugins[] (added back when it
was still overlay-only), location.found is true. The bar-widget
insertion branch is guarded by:
if (!location.found && isBarWidget) {
... config.bar.layout[target.section].splice(target.index, 0, entry) ...
}so it's skipped — the plugin is treated as "already enabled" and nothing
is written to bar.layout.
But shell.qml's listPlugins() defines enabled for anything withbar-widget in kinds as shell.pluginRegistry.inBar(id) (checksbar.layout specifically, not plugins[]):
enabled: isBarOption ? active
: (isBarWidget ? shell.pluginRegistry.inBar(id) : shell.pluginRegistry.isEnabled(id)),So the two functions disagree about what "enabled" means for this
plugin, and there is no way to get the widget placed via the documentedomarchy plugin enable / putBarWidget path once this state is reached.
putBarWidget() hits the same wall: it only special-cases inBar(id)
before delegating straight to setEnabled(id, true, target), so it fails
identically once location.found is already true for another reason.
Repro
- Install/enable a plugin with
"kinds": ["overlay"]only. This adds
{ "id": "<id>" } to shell.json's top-level plugins[].
2. Update the plugin's manifest.json: add "bar-widget" to kinds,
plus entryPoints.barWidget and a barWidget block pointing at a new
QML file.
3. omarchy-shell shell rescanPlugins
4. omarchy plugin enable <id> → prints "Enabled <id>", exit 0. (Or:
omarchy-shell shell putBarWidget <id> '{}' → returns "ok".)
5. omarchy plugin list --json still shows "enabled": false for
<id>, and shell.json's bar.layout has no entry for it.
Expected
Step 4 should add the widget to bar.layout (at the plugin'sbarWidget.defaultSection, same placement a brand-new install would
get), matching what listPlugins() actually checks for a
bar-widget-kind plugin's enabled state.
Workaround
Manually add { "id": "<id>" } to the right bar.layout.<section>
array in shell.json by hand; the running shell picks it up live andomarchy plugin list then correctly reports it enabled.
System
- Omarchy 4.0.2-1
- Hyprland 0.56.2
- omarchy-shell / Quickshell — live process, IPC responsive throughout
View raw text
## What happened
For a third-party plugin whose manifest started as `"kinds": ["overlay"]`
and later gained `"bar-widget"` (new `entryPoints.barWidget` +
`barWidget` block, e.g. after adding a status-bar icon to an existing
overlay plugin), both `omarchy plugin enable <id>` and the underlying
`omarchy-shell shell putBarWidget <id> '{}'` IPC call report success but
do nothing: the widget is never added to `shell.json`'s `bar.layout`, and
`omarchy plugin list` keeps reporting it as disabled.
## Root cause
In `shell/services/PluginRegistry.qml`, `setEnabled()` computes
`location = findEntryLocation(config, key)` up front. Because the plugin
already has a top-level entry in `config.plugins[]` (added back when it
was still overlay-only), `location.found` is `true`. The bar-widget
insertion branch is guarded by:
```js
if (!location.found && isBarWidget) {
... config.bar.layout[target.section].splice(target.index, 0, entry) ...
}
```
so it's skipped — the plugin is treated as "already enabled" and nothing
is written to `bar.layout`.
But `shell.qml`'s `listPlugins()` defines `enabled` for anything with
`bar-widget` in `kinds` as `shell.pluginRegistry.inBar(id)` (checks
`bar.layout` specifically, not `plugins[]`):
```js
enabled: isBarOption ? active
: (isBarWidget ? shell.pluginRegistry.inBar(id) : shell.pluginRegistry.isEnabled(id)),
```
So the two functions disagree about what "enabled" means for this
plugin, and there is no way to get the widget placed via the documented
`omarchy plugin enable` / `putBarWidget` path once this state is reached.
`putBarWidget()` hits the same wall: it only special-cases `inBar(id)`
before delegating straight to `setEnabled(id, true, target)`, so it fails
identically once `location.found` is already true for another reason.
## Repro
1. Install/enable a plugin with `"kinds": ["overlay"]` only. This adds
`{ "id": "<id>" }` to `shell.json`'s top-level `plugins[]`.
2. Update the plugin's `manifest.json`: add `"bar-widget"` to `kinds`,
plus `entryPoints.barWidget` and a `barWidget` block pointing at a new
QML file.
3. `omarchy-shell shell rescanPlugins`
4. `omarchy plugin enable <id>` → prints "Enabled `<id>`", exit 0. (Or:
`omarchy-shell shell putBarWidget <id> '{}'` → returns `"ok"`.)
5. `omarchy plugin list --json` still shows `"enabled": false` for
`<id>`, and `shell.json`'s `bar.layout` has no entry for it.
## Expected
Step 4 should add the widget to `bar.layout` (at the plugin's
`barWidget.defaultSection`, same placement a brand-new install would
get), matching what `listPlugins()` actually checks for a
bar-widget-kind plugin's `enabled` state.
## Workaround
Manually add `{ "id": "<id>" }` to the right `bar.layout.<section>`
array in `shell.json` by hand; the running shell picks it up live and
`omarchy plugin list` then correctly reports it enabled.
## System
- Omarchy 4.0.2-1
- Hyprland 0.56.2
- omarchy-shell / Quickshell — live process, IPC responsive throughout
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 10:49 UTC