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.
omarchy plugin enable never restores a bar-widget icon when the plugin id still exists in plugins[]
Reported by berrimi · filed Sep 19, 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
Summary
omarchy plugin enable <id> reports success but never restores a bar widget's icon if the plugin's id already has an entry in the top-level plugins[] array of shell.json. The widget ends up silently gone from the bar even though enable printed "Enabled".
Environment
- Omarchy 4.0.4-1 (shell code matches
omacom/omarchyHEAD atshell/services/PluginRegistry.qmlshae8b8ad3) - Reproduced on this machine with:
akshar.radio-atlas(kinds:panel,bar-widget)anishfn.widgets(kinds:panel,bar-widget,service)
Repro
- Have a plugin that is both a
bar-widgetand apanel(orservice), whose id already sits inplugins[](e.g. it was enabled back when it was panel-only, or a legacyplugins[]record lingers from an older Omarchy id scheme). - Its bar widget is also present in
bar.layout.<section>. omarchy plugin disable <id>-> removes only thebar.layoutentry; theplugins[]entry survives (by design, the panel stays summonable).omarchy plugin enable <id>-> printsEnabled <id>.- Expected: the widget reappears in the bar. Actual: nothing appears.
After the steps, the shell itself still considers the widget disabled:
$ omarchy-shell shell listPlugins # (ids matching)
anishfn.widgets false panel,bar-widget,service
akshar.radio-atlas false panel,bar-widgetand the id is absent from every section of bar.layout in both shell.json and live config.
Root cause
In shell/services/PluginRegistry.qml, setEnabled() keys the bar-widget re-insert off location.found returned by findEntryLocation():
var location = findEntryLocation(config, key) // line 522
if (value) {
...
if (!location.found && isBarWidget) { // line 528: insert into bar.layout
...
} else if (!location.found && !isFirstParty) { // line 541: plugins.push
config.plugins.push(entry)
}
if (isBarWidget && !insertedWithPlacement
&& placement && Object.keys(placement).length)
moveBarEntry(config, key, placement) // line 545; skipped when placement == {} or entry missing
}findEntryLocation() matches any config presence, including a plugins[] entry. So when the plugin still has a plugins[] record, location.found === true, the isBarWidget insert branch never runs, and moveBarEntry() also bails (for placement === {}, and there is no layout entry to move anyway). setEnabled still bumps registryRevision, fires pluginsChanged(), and returns true — hence the misleading success.
omarchy bar put <id> cannot work around it either: putBarWidget() funnels into the same setEnabled call and hits the same skip.
Suggested fix
Decide the widget insert on bar presence, not general config presence:
if (value) {
removeDisabled(config, key)
var entry = { id: key }
var insertedWithPlacement = false
var onBar = findBarLocation(config, key, "").found
if (!onBar && isBarWidget) {
// ... existing insert/replace logic ...
} else if (!location.found && !isFirstParty) {
config.plugins.push(entry)
}
...
}i.e. isBarWidget && !onBar must always recreate the layout entry, regardless of a lingering plugins[] entry, and the plugins.push fallback should stay reserved for non-bar-widget plugins.
Workaround
Manually add {"id":"<id>"} to the desired bar.layout section in ~/.config/omarchy/shell.json, then omarchy-shell shell reloadConfig.
View raw text
## Summary
`omarchy plugin enable <id>` reports success but never restores a bar widget's icon if the plugin's id already has an entry in the top-level `plugins[]` array of `shell.json`. The widget ends up silently gone from the bar even though enable printed "Enabled".
## Environment
- Omarchy 4.0.4-1 (shell code matches `omacom/omarchy` HEAD at `shell/services/PluginRegistry.qml` sha `e8b8ad3`)
- Reproduced on this machine with:
- `akshar.radio-atlas` (kinds: `panel`, `bar-widget`)
- `anishfn.widgets` (kinds: `panel`, `bar-widget`, `service`)
## Repro
1. Have a plugin that is both a `bar-widget` and a `panel` (or `service`), whose id already sits in `plugins[]` (e.g. it was enabled back when it was panel-only, or a legacy `plugins[]` record lingers from an older Omarchy id scheme).
2. Its bar widget is also present in `bar.layout.<section>`.
3. `omarchy plugin disable <id>` -> removes only the `bar.layout` entry; the `plugins[]` entry survives (by design, the panel stays summonable).
4. `omarchy plugin enable <id>` -> prints `Enabled <id>`.
5. Expected: the widget reappears in the bar. Actual: nothing appears.
After the steps, the shell itself still considers the widget disabled:
```
$ omarchy-shell shell listPlugins # (ids matching)
anishfn.widgets false panel,bar-widget,service
akshar.radio-atlas false panel,bar-widget
```
and the id is absent from every section of `bar.layout` in both `shell.json` and live config.
## Root cause
In `shell/services/PluginRegistry.qml`, `setEnabled()` keys the bar-widget re-insert off `location.found` returned by `findEntryLocation()`:
```qml
var location = findEntryLocation(config, key) // line 522
if (value) {
...
if (!location.found && isBarWidget) { // line 528: insert into bar.layout
...
} else if (!location.found && !isFirstParty) { // line 541: plugins.push
config.plugins.push(entry)
}
if (isBarWidget && !insertedWithPlacement
&& placement && Object.keys(placement).length)
moveBarEntry(config, key, placement) // line 545; skipped when placement == {} or entry missing
}
```
`findEntryLocation()` matches _any_ config presence, including a `plugins[]` entry. So when the plugin still has a `plugins[]` record, `location.found === true`, the `isBarWidget` insert branch never runs, and `moveBarEntry()` also bails (for `placement === {}`, and there is no layout entry to move anyway). `setEnabled` still bumps `registryRevision`, fires `pluginsChanged()`, and returns `true` — hence the misleading success.
`omarchy bar put <id>` cannot work around it either: `putBarWidget()` funnels into the same `setEnabled` call and hits the same skip.
## Suggested fix
Decide the widget insert on bar presence, not general config presence:
```qml
if (value) {
removeDisabled(config, key)
var entry = { id: key }
var insertedWithPlacement = false
var onBar = findBarLocation(config, key, "").found
if (!onBar && isBarWidget) {
// ... existing insert/replace logic ...
} else if (!location.found && !isFirstParty) {
config.plugins.push(entry)
}
...
}
```
i.e. `isBarWidget && !onBar` must always recreate the layout entry, regardless of a lingering `plugins[]` entry, and the `plugins.push` fallback should stay reserved for non-bar-widget plugins.
## Workaround
Manually add `{"id":"<id>"}` to the desired `bar.layout` section in `~/.config/omarchy/shell.json`, then `omarchy-shell shell reloadConfig`.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 16:00 UTC