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.
Third-party bar plugins: a cloned bar can never load, and user plugin QML does not hot-reload
Reported by epicbagel · 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
Two separate, independently reproducible problems with user plugins under~/.config/omarchy/plugins/. Both hit while customising a bar and a bar widget.
System
| Omarchy | 4.0.0-1 |
| Hyprland | 0.56.2 (efb5099) |
| Quickshell | 0.3.0.r20.g28771c7-1 |
| Kernel | 7.1.8-arch1-3 |
1. omarchy plugin clone omarchy.bar produces a bar that cannot load
Steps to reproduce
omarchy plugin clone omarchy.bar # -> ~/.config/omarchy/plugins/<user>.bar
omarchy plugin enable <user>.bar
omarchy restart shellExpected
The cloned bar loads and behaves identically to the built-in one, as documented
for cloning built-in plugins.
Actual
No bar renders at all. The log shows:
WARN scene: file:///home/<user>/.config/omarchy/plugins/<user>.bar/Bar.qml[22:3]:
Required property barConfig was not initialized
WARN scene: file:///home/<user>/.config/omarchy/plugins/<user>.bar/Bar.qml[17:3]:
Required property barWidgetRegistry was not initialized
WARN scene: file:///home/<user>/.config/omarchy/plugins/<user>.bar/Bar.qml[15:3]:
Required property omarchyPath was not initialized
WARN scene: @shell.qml[256:-1]: ReferenceError: errorString is not definedThe clone is byte-identical to shell/plugins/bar/ apart from the generated
manifest, so this is not a user edit.
Root cause
shell/plugins/bar/Bar.qml declares three properties as required:
required property string omarchyPath // :15
required property var barWidgetRegistry // :17
required property var barConfig // :22The built-in bar is constructed declaratively, which satisfies them
(shell.qml, defaultBarComponent):
Bar {
omarchyPath: shell.omarchyPath
barWidgetRegistry: shell.barWidgetRegistry
barConfig: shell.barConfig
...
}A third-party bar is instead created bare and configured after construction
(shell.qml, configureBar()):
if ("omarchyPath" in target) target.omarchyPath = shell.omarchyPath
if ("barWidgetRegistry" in target) target.barWidgetRegistry = shell.barWidgetRegistry
if ("barConfig" in target) target.barConfig = shell.barConfigQML requires required properties to be satisfied at construction, so
post-creation assignment can never satisfy them. Any clone of the stock bar
therefore fails, making the documented omarchy plugin clone omarchy.bar
workflow non-functional.
Note the secondary bug in the error path: shell.qml:256 raisesReferenceError: errorString is not defined, so the real failure reason is
masked.
Workaround
Dropping required in the clone and giving defaults works, because the
post-creation injection then lands. barConfig is already null-safe
(Bar.qml:361 guards with Util.isPlainObject(barConfig) ? barConfig : fallbackBarConfig):
property string omarchyPath: ""
property var barWidgetRegistry: null
property var barConfig: nullSuggested fix
Either construct third-party bars with initial properties (e.g. viacreateObject(parent, props) / Loader.setSource(url, props)), or droprequired from these three in Bar.qml and rely on the existing injection plus
null guards.
2. Saving user plugin QML does not hot-reload; rescanPlugins does not either
shell/README.md:160-161 states:
Saving a file anywhere under~/.config/omarchy/plugins/reloads plugin code automatically;omarchy-shell shell rescanPluginsremains available to force a reload.
and rescanPlugins is documented as "re-walk plugin dirs and hot-reload plugin code".
Steps to reproduce
With any third-party bar-widget plugin installed and placed on the bar
(reproduced with a cava visualizer widget):
- Edit its QML to change something that affects layout with no config involved.
I changed a padding constant from 8 to 24, which widens the widget.
2. Save.
3. omarchy-shell shell rescanPlugins
Expected
The widget re-renders at the new width.
Actual
No change. I measured widget positions by scanning a pixel row across the bar
before and after; the runs were identical:
before edit: ... 4067-4070 4136-4140 4210-4215 4304-4386 ...
after edit + rescan: ... 4067-4070 4136-4140 4210-4215 4304-4386 ...
after omarchy restart: ... 4015-4018 4111-4115 4210-4215 4304-4386 ...Only omarchy restart shell picked the change up. rescanPlugins exits
successfully and logs nothing relevant.
Same behaviour was observed separately on a bar-kind plugin: an edit to a
cloned Bar.qml required a full omarchy restart shell.
Impact
Plugin development against the documented workflow is slow and misleading — a
saved change appears to do nothing, so it reads as a broken edit rather than a
stale component.
View raw text
Two separate, independently reproducible problems with user plugins under
`~/.config/omarchy/plugins/`. Both hit while customising a bar and a bar widget.
**System**
| | |
|---|---|
| Omarchy | 4.0.0-1 |
| Hyprland | 0.56.2 (efb5099) |
| Quickshell | 0.3.0.r20.g28771c7-1 |
| Kernel | 7.1.8-arch1-3 |
---
## 1. `omarchy plugin clone omarchy.bar` produces a bar that cannot load
### Steps to reproduce
```sh
omarchy plugin clone omarchy.bar # -> ~/.config/omarchy/plugins/<user>.bar
omarchy plugin enable <user>.bar
omarchy restart shell
```
### Expected
The cloned bar loads and behaves identically to the built-in one, as documented
for cloning built-in plugins.
### Actual
No bar renders at all. The log shows:
```
WARN scene: file:///home/<user>/.config/omarchy/plugins/<user>.bar/Bar.qml[22:3]:
Required property barConfig was not initialized
WARN scene: file:///home/<user>/.config/omarchy/plugins/<user>.bar/Bar.qml[17:3]:
Required property barWidgetRegistry was not initialized
WARN scene: file:///home/<user>/.config/omarchy/plugins/<user>.bar/Bar.qml[15:3]:
Required property omarchyPath was not initialized
WARN scene: @shell.qml[256:-1]: ReferenceError: errorString is not defined
```
The clone is byte-identical to `shell/plugins/bar/` apart from the generated
manifest, so this is not a user edit.
### Root cause
`shell/plugins/bar/Bar.qml` declares three properties as `required`:
```qml
required property string omarchyPath // :15
required property var barWidgetRegistry // :17
required property var barConfig // :22
```
The built-in bar is constructed declaratively, which satisfies them
(`shell.qml`, `defaultBarComponent`):
```qml
Bar {
omarchyPath: shell.omarchyPath
barWidgetRegistry: shell.barWidgetRegistry
barConfig: shell.barConfig
...
}
```
A third-party bar is instead created bare and configured *after* construction
(`shell.qml`, `configureBar()`):
```qml
if ("omarchyPath" in target) target.omarchyPath = shell.omarchyPath
if ("barWidgetRegistry" in target) target.barWidgetRegistry = shell.barWidgetRegistry
if ("barConfig" in target) target.barConfig = shell.barConfig
```
QML requires `required` properties to be satisfied at construction, so
post-creation assignment can never satisfy them. Any clone of the stock bar
therefore fails, making the documented `omarchy plugin clone omarchy.bar`
workflow non-functional.
Note the secondary bug in the error path: `shell.qml:256` raises
`ReferenceError: errorString is not defined`, so the real failure reason is
masked.
### Workaround
Dropping `required` in the clone and giving defaults works, because the
post-creation injection then lands. `barConfig` is already null-safe
(`Bar.qml:361` guards with `Util.isPlainObject(barConfig) ? barConfig : fallbackBarConfig`):
```qml
property string omarchyPath: ""
property var barWidgetRegistry: null
property var barConfig: null
```
### Suggested fix
Either construct third-party bars with initial properties (e.g. via
`createObject(parent, props)` / `Loader.setSource(url, props)`), or drop
`required` from these three in `Bar.qml` and rely on the existing injection plus
null guards.
---
## 2. Saving user plugin QML does not hot-reload; `rescanPlugins` does not either
`shell/README.md:160-161` states:
> Saving a file anywhere under `~/.config/omarchy/plugins/` reloads plugin code
> automatically; `omarchy-shell shell rescanPlugins` remains available to force a reload.
and `rescanPlugins` is documented as "re-walk plugin dirs and hot-reload plugin code".
### Steps to reproduce
With any third-party `bar-widget` plugin installed and placed on the bar
(reproduced with a cava visualizer widget):
1. Edit its QML to change something that affects layout with no config involved.
I changed a padding constant from `8` to `24`, which widens the widget.
2. Save.
3. `omarchy-shell shell rescanPlugins`
### Expected
The widget re-renders at the new width.
### Actual
No change. I measured widget positions by scanning a pixel row across the bar
before and after; the runs were **identical**:
```
before edit: ... 4067-4070 4136-4140 4210-4215 4304-4386 ...
after edit + rescan: ... 4067-4070 4136-4140 4210-4215 4304-4386 ...
after omarchy restart: ... 4015-4018 4111-4115 4210-4215 4304-4386 ...
```
Only `omarchy restart shell` picked the change up. `rescanPlugins` exits
successfully and logs nothing relevant.
Same behaviour was observed separately on a `bar`-kind plugin: an edit to a
cloned `Bar.qml` required a full `omarchy restart shell`.
### Impact
Plugin development against the documented workflow is slow and misleading — a
saved change appears to do nothing, so it reads as a broken edit rather than a
stale component.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.