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 clone omarchy.bar leaves the shell with no bar, and the fallback path throws
Reported by quigles1977 · filed Aug 28, 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
omarchy plugin clone omarchy.bar produces a bar that fails to load, and the
shell does not fall back to the built-in bar — so the result is **no bar at
all**: no layer surface, no exclusion zone.
This is on a pristine clone with no edits.
Steps to reproduce
omarchy plugin clone omarchy.bar
omarchy restart shell
hyprctl layers # no `omarchy-bar` namespace anywhere
hyprctl monitors # reserved [0, 0, 0, 0]Removing "id": "swq.bar" from the bar object in~/.config/omarchy/shell.json and restarting the shell brings the bar back,
which confirms the clone is the trigger.
Expected
Either the cloned bar loads, or the shell falls back to omarchy.bar asshell.qml intends. Never zero bars.
Cause
1. A `Loader` cannot supply `required` properties.
Plugin bars are loaded at shell.qml:249 with:
Loader {
id: pluginBarLoader
source: shell.activeBarSourceUrl
onLoaded: shell.configureBar(item, shell.activeBarManifest)
}But plugins/bar/Bar.qml declares three required properties:
required property string omarchyPath
required property var barWidgetRegistry
required property var barConfigA Loader using source: has no way to set those, so instantiation fails.
The default bar sidesteps this entirely by using sourceComponent:
(defaultBarLoader, shell.qml:237), where the bindings can be supplied.
The log shows:
WARN scene: file:///home/…/.config/omarchy/plugins/<id>.bar/Bar.qml[16:3]:
Required property omarchyPath was not initialized
WARN scene: file:///home/…/.config/omarchy/plugins/<id>.bar/Bar.qml[18:3]:
Required property barWidgetRegistry was not initialized
WARN scene: file:///home/…/.config/omarchy/plugins/<id>.bar/Bar.qml[23:3]:
Required property barConfig was not initialized2. The fallback path throws before it can recover.
shell.qml:256 handles the load error with:
onStatusChanged: {
if (status === Loader.Error) {
var detail = errorString && errorString() ? errorString() : ""
console.warn("bar option " + shell.activeBarId + " failed to load, …")
shell.failedBarId = shell.activeBarId
}
}errorString is not a member of Loader, so this throws:
WARN scene: @shell.qml[256:-1]: ReferenceError: errorString is not definedThe exception aborts the handler before shell.failedBarId is assigned. SinceactiveBarId (shell.qml:180) falls back only whenselectedBarId !== failedBarId, the fallback never engages — which is why the
failure is silent and total rather than degrading to the stock bar.
Workaround
Changing the three properties to non-required in the clone makes it load
correctly:
property string omarchyPath: ""
property var barWidgetRegistry: null
property var barConfig: nullconfigureBar() assigns all three in onLoaded regardless, so nothing is lost.
Worth noting plugins/bar/README.md documents cloning as the supported way to
customize the bar, so this is on the intended path rather than an exotic setup.
The errorString bug is worth fixing independently of the first — a plugin bar
that fails for any other reason will also leave the user with no bar and no
clear indication why.
System
| Omarchy | 4.0.1-1 |
| Hyprland | v0.56.2 |
| quickshell | 0.3.1-1 |
| CPU | AMD Ryzen AI MAX+ PRO 395 w/ Radeon 8060S |
Happy to attach omarchy debug output if useful.
View raw text
## What happened
`omarchy plugin clone omarchy.bar` produces a bar that fails to load, and the
shell does not fall back to the built-in bar — so the result is **no bar at
all**: no layer surface, no exclusion zone.
This is on a pristine clone with no edits.
## Steps to reproduce
```bash
omarchy plugin clone omarchy.bar
omarchy restart shell
hyprctl layers # no `omarchy-bar` namespace anywhere
hyprctl monitors # reserved [0, 0, 0, 0]
```
Removing `"id": "swq.bar"` from the `bar` object in
`~/.config/omarchy/shell.json` and restarting the shell brings the bar back,
which confirms the clone is the trigger.
## Expected
Either the cloned bar loads, or the shell falls back to `omarchy.bar` as
`shell.qml` intends. Never zero bars.
## Cause
**1. A `Loader` cannot supply `required` properties.**
Plugin bars are loaded at `shell.qml:249` with:
```qml
Loader {
id: pluginBarLoader
source: shell.activeBarSourceUrl
onLoaded: shell.configureBar(item, shell.activeBarManifest)
}
```
But `plugins/bar/Bar.qml` declares three required properties:
```qml
required property string omarchyPath
required property var barWidgetRegistry
required property var barConfig
```
A `Loader` using `source:` has no way to set those, so instantiation fails.
The default bar sidesteps this entirely by using `sourceComponent:`
(`defaultBarLoader`, `shell.qml:237`), where the bindings can be supplied.
The log shows:
```
WARN scene: file:///home/…/.config/omarchy/plugins/<id>.bar/Bar.qml[16:3]:
Required property omarchyPath was not initialized
WARN scene: file:///home/…/.config/omarchy/plugins/<id>.bar/Bar.qml[18:3]:
Required property barWidgetRegistry was not initialized
WARN scene: file:///home/…/.config/omarchy/plugins/<id>.bar/Bar.qml[23:3]:
Required property barConfig was not initialized
```
**2. The fallback path throws before it can recover.**
`shell.qml:256` handles the load error with:
```qml
onStatusChanged: {
if (status === Loader.Error) {
var detail = errorString && errorString() ? errorString() : ""
console.warn("bar option " + shell.activeBarId + " failed to load, …")
shell.failedBarId = shell.activeBarId
}
}
```
`errorString` is not a member of `Loader`, so this throws:
```
WARN scene: @shell.qml[256:-1]: ReferenceError: errorString is not defined
```
The exception aborts the handler before `shell.failedBarId` is assigned. Since
`activeBarId` (`shell.qml:180`) falls back only when
`selectedBarId !== failedBarId`, the fallback never engages — which is why the
failure is silent and total rather than degrading to the stock bar.
## Workaround
Changing the three properties to non-required in the clone makes it load
correctly:
```qml
property string omarchyPath: ""
property var barWidgetRegistry: null
property var barConfig: null
```
`configureBar()` assigns all three in `onLoaded` regardless, so nothing is lost.
Worth noting `plugins/bar/README.md` documents cloning as the supported way to
customize the bar, so this is on the intended path rather than an exotic setup.
The `errorString` bug is worth fixing independently of the first — a plugin bar
that fails for any other reason will also leave the user with no bar and no
clear indication why.
## System
| | |
|---|---|
| Omarchy | 4.0.1-1 |
| Hyprland | v0.56.2 |
| quickshell | 0.3.1-1 |
| CPU | AMD Ryzen AI MAX+ PRO 395 w/ Radeon 8060S |
Happy to attach `omarchy debug` output if useful.
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.