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.
Cloned bar plugin (kind: bar) never renders — required properties not passed by pluginBarLoader
Reported by Orneyfish · filed Aug 25, 2026Closed upstream on 2026-09-20 by bjarneo via an automated message, as a duplicate of #6915 (R-1851). GitHub close reason: completed.
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
What happened
Cloning the built-in bar plugin (omarchy plugin clone omarchy.bar) and switching to it (omarchy bar use <cloned-id>) results in a completely invisible bar — no widgets, no background, nothing rendered — even with a totally unmodified clone (zero edits). Confirmed by cloning fresh into a throwaway id and switching to it with no changes made.
What I expected
The cloned bar to render identically to the stock bar (that's the documented purpose of omarchy plugin clone for the bar kind — customize height/behavior/etc. and keep it working).
Root cause (traced in shell.qml)
In /usr/share/omarchy/shell/shell.qml, the stock bar is instantiated through defaultBarComponent, which explicitly binds the bar's required properties inline:
barWidgetRegistry: shell.barWidgetRegistry
barConfig: shell.barConfig
shell: shell
manifest: shell.barManifestFor(shell.defaultBarId)But a custom/cloned bar-kind plugin goes through a different loader, pluginBarLoader, which just does a bare dynamic load with no property injection:
Loader {
id: pluginBarLoader
active: !shell.pluginReloading && shell.activeBarId !== shell.defaultBarId && shell.activeBarSourceUrl !== ""
source: shell.activeBarId !== shell.defaultBarId ? shell.activeBarSourceUrl : ""
asynchronous: true
onLoaded: shell.configureBar(item, shell.activeBarManifest)
...
}Since Bar.qml's root Item declares omarchyPath, barWidgetRegistry, and barConfig as required property, and QML only allows required properties to be satisfied at object-creation time (a Loader.source-based load can't pass initial properties the way createObject(parent, {props}) can), the component fails to initialize correctly. shell.configureBar(item, ...) runs afterward, but that's too late for required property.
Symptom in journalctl --user when this happens:
WARN scene: file:///home/USER/.config/omarchy/plugins/<id>/Bar.qml[15:3]: Required property omarchyPath was not initialized
WARN scene: file:///home/USER/.config/omarchy/plugins/<id>/Bar.qml[17:3]: Required property barWidgetRegistry was not initialized
WARN scene: file:///home/USER/.config/omarchy/plugins/<id>/Bar.qml[22:3]: Required property barConfig was not initialized
WARN scene: @shell.qml[256:-1]: ReferenceError: errorString is not definedThat last line is a second, separate bug: pluginBarLoader's own onStatusChanged handler (shell.qml ~line 256) references a bare errorString that isn't defined in scope, so whatever the real Loader.Error message would have been gets swallowed by a ReferenceError instead of being logged.
Steps to reproduce
omarchy plugin clone omarchy.bar # make zero edits
# bar is now invisible
omarchy bar use omarchy.bar # reverts fine, confirms it's not monitor/theme stateSystem
- Omarchy 4.0.0-1
- Hyprland 0.56.2-1
- quickshell-git 0.3.0.r20.g28771c7-2
- CPU: 12th Gen Intel Core i9-12900H
- GPU: Intel Iris Xe (integrated) + NVIDIA GeForce RTX 3070 Ti Laptop (hybrid graphics)
Impact
Blocks the documented "clone the bar to customize it" workflow entirely for anything that lives in the bar's root component (height, auto-hide behavior, exclusion zone, etc.) — not just for one specific customization. Individual bar-widget clones (omarchy plugin clone omarchy.workspaces etc.) are on a different, unaffected code path and still work fine.
View raw text
## What happened
Cloning the built-in bar plugin (`omarchy plugin clone omarchy.bar`) and switching to it (`omarchy bar use <cloned-id>`) results in a **completely invisible bar** — no widgets, no background, nothing rendered — even with a totally unmodified clone (zero edits). Confirmed by cloning fresh into a throwaway id and switching to it with no changes made.
## What I expected
The cloned bar to render identically to the stock bar (that's the documented purpose of `omarchy plugin clone` for the `bar` kind — customize height/behavior/etc. and keep it working).
## Root cause (traced in shell.qml)
In `/usr/share/omarchy/shell/shell.qml`, the stock bar is instantiated through `defaultBarComponent`, which explicitly binds the bar's required properties inline:
```qml
barWidgetRegistry: shell.barWidgetRegistry
barConfig: shell.barConfig
shell: shell
manifest: shell.barManifestFor(shell.defaultBarId)
```
But a custom/cloned `bar`-kind plugin goes through a different loader, `pluginBarLoader`, which just does a bare dynamic load with no property injection:
```qml
Loader {
id: pluginBarLoader
active: !shell.pluginReloading && shell.activeBarId !== shell.defaultBarId && shell.activeBarSourceUrl !== ""
source: shell.activeBarId !== shell.defaultBarId ? shell.activeBarSourceUrl : ""
asynchronous: true
onLoaded: shell.configureBar(item, shell.activeBarManifest)
...
}
```
Since `Bar.qml`'s root `Item` declares `omarchyPath`, `barWidgetRegistry`, and `barConfig` as `required property`, and QML only allows required properties to be satisfied at object-creation time (a `Loader.source`-based load can't pass initial properties the way `createObject(parent, {props})` can), the component fails to initialize correctly. `shell.configureBar(item, ...)` runs afterward, but that's too late for `required property`.
Symptom in `journalctl --user` when this happens:
```
WARN scene: file:///home/USER/.config/omarchy/plugins/<id>/Bar.qml[15:3]: Required property omarchyPath was not initialized
WARN scene: file:///home/USER/.config/omarchy/plugins/<id>/Bar.qml[17:3]: Required property barWidgetRegistry was not initialized
WARN scene: file:///home/USER/.config/omarchy/plugins/<id>/Bar.qml[22:3]: Required property barConfig was not initialized
WARN scene: @shell.qml[256:-1]: ReferenceError: errorString is not defined
```
That last line is a second, separate bug: `pluginBarLoader`'s own `onStatusChanged` handler (shell.qml ~line 256) references a bare `errorString` that isn't defined in scope, so whatever the real `Loader.Error` message would have been gets swallowed by a `ReferenceError` instead of being logged.
## Steps to reproduce
```bash
omarchy plugin clone omarchy.bar # make zero edits
# bar is now invisible
omarchy bar use omarchy.bar # reverts fine, confirms it's not monitor/theme state
```
## System
- Omarchy 4.0.0-1
- Hyprland 0.56.2-1
- quickshell-git 0.3.0.r20.g28771c7-2
- CPU: 12th Gen Intel Core i9-12900H
- GPU: Intel Iris Xe (integrated) + NVIDIA GeForce RTX 3070 Ti Laptop (hybrid graphics)
## Impact
Blocks the documented "clone the bar to customize it" workflow entirely for anything that lives in the bar's root component (height, auto-hide behavior, exclusion zone, etc.) — not just for one specific customization. Individual bar-*widget* clones (`omarchy plugin clone omarchy.workspaces` etc.) are on a different, unaffected code path and still work fine.
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.