Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A 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.

Inbox
ReportR-4960GitHub issuePublicReceived

Cloned bar plugin never loads: required properties can't be set by pluginBarLoader, and the error is swallowed

Reported by kesavsabari · filed Sep 8, 2026Closed upstream on 2026-09-20 by bjarneo via an automated message, as a duplicate of #6915 (R-1851). GitHub close reason: completed.

Received and recorded verbatim. Nothing has been checked yet.

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

Cloned bar plugin never loads: required properties can't be set by pluginBarLoader, and the error is swallowedrevision 1 · captured 2026-10-04 12:10 UTC via poll

What happened

omarchy plugin clone omarchy.bar produces a bar that never renders. There is no
omarchy-bar layer in hyprctl layers, and the screen has no bar at all — the
shell does not fall back to the built-in one either.

This is not caused by editing the clone: a byte-identical copy of the packaged
shell/plugins/bar/Bar.qml fails the same way.

Cause

The built-in bar is instantiated through defaultBarComponent (shell/shell.qml),
which sets its properties declaratively. A cloned bar goes through
pluginBarLoader instead, which loads it by URL:

Loader {
    id: pluginBarLoader
    source: shell.activeBarId !== shell.defaultBarId ? shell.activeBarSourceUrl : ""
    asynchronous: true
    onLoaded: shell.configureBar(item, shell.activeBarManifest)

Bar.qml declares three properties the host injects as required:

required property string omarchyPath
required property var barWidgetRegistry
required property var barConfig

A Loader using source: cannot satisfy required property — there is no way to
supply them at creation — so instantiation fails and the Loader goes to
Loader.Error before configureBar() ever runs. The shell logs:

WARN scene: file:///home/<user>/.config/omarchy/plugins/<user>.bar/Bar.qml[15:3]: Required property omarchyPath 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[22:3]: Required property barConfig was not initialized

Dropping required on those three (plain property string omarchyPath: "",
property var barWidgetRegistry: null, property var barConfig: null) makes the
cloned bar load and render correctly — configureBar() assigns them immediately
after load. That looks like the right fix, and it would let any third-party bar
plugin work too, since they all face the same loader.

Second bug: the real error is swallowed

The failure is very hard to diagnose because pluginBarLoader's error handler
(shell/shell.qml:256) calls errorString(), which is not in scope there:

var detail = errorString && errorString() ? errorString() : ""

That throws, so instead of the "bar option ... failed to load, falling back to ..."
message the user only ever sees:

WARN scene: @shell.qml[256:-1]: ReferenceError: errorString is not defined

and shell.failedBarId is never set, so the documented fallback to the built-in
bar never happens either — hence no bar on screen at all rather than a degraded one.

Steps to reproduce

  1. omarchy plugin clone omarchy.bar (it switches bar.id to <user>.bar)
  2. omarchy restart shell
  3. No bar renders; hyprctl layers | grep omarchy-bar returns nothing.
  4. journalctl --user -e shows the three "Required property" warnings and the

ReferenceError: errorString is not defined.

Expected

A freshly cloned bar renders identically to the built-in one — that is the point of
omarchy plugin clone. Failing that, the shell should fall back to the built-in bar
and log why.

System

  • Omarchy 4.0.2-1
  • Arch Linux, Hyprland, single 1920x1080 display
View raw text
### What happened

`omarchy plugin clone omarchy.bar` produces a bar that never renders. There is no
`omarchy-bar` layer in `hyprctl layers`, and the screen has no bar at all — the
shell does not fall back to the built-in one either.

This is not caused by editing the clone: a byte-identical copy of the packaged
`shell/plugins/bar/Bar.qml` fails the same way.

### Cause

The built-in bar is instantiated through `defaultBarComponent` (`shell/shell.qml`),
which sets its properties declaratively. A cloned bar goes through
`pluginBarLoader` instead, which loads it by URL:

```qml
Loader {
    id: pluginBarLoader
    source: shell.activeBarId !== shell.defaultBarId ? shell.activeBarSourceUrl : ""
    asynchronous: true
    onLoaded: shell.configureBar(item, shell.activeBarManifest)
```

`Bar.qml` declares three properties the host injects as `required`:

```qml
required property string omarchyPath
required property var barWidgetRegistry
required property var barConfig
```

A `Loader` using `source:` cannot satisfy `required property` — there is no way to
supply them at creation — so instantiation fails and the Loader goes to
`Loader.Error` before `configureBar()` ever runs. The shell logs:

```
WARN scene: file:///home/<user>/.config/omarchy/plugins/<user>.bar/Bar.qml[15:3]: Required property omarchyPath 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[22:3]: Required property barConfig was not initialized
```

Dropping `required` on those three (plain `property string omarchyPath: ""`,
`property var barWidgetRegistry: null`, `property var barConfig: null`) makes the
cloned bar load and render correctly — `configureBar()` assigns them immediately
after load. That looks like the right fix, and it would let any third-party bar
plugin work too, since they all face the same loader.

### Second bug: the real error is swallowed

The failure is very hard to diagnose because `pluginBarLoader`'s error handler
(`shell/shell.qml:256`) calls `errorString()`, which is not in scope there:

```qml
var detail = errorString && errorString() ? errorString() : ""
```

That throws, so instead of the "bar option ... failed to load, falling back to ..."
message the user only ever sees:

```
WARN scene: @shell.qml[256:-1]: ReferenceError: errorString is not defined
```

and `shell.failedBarId` is never set, so the documented fallback to the built-in
bar never happens either — hence no bar on screen at all rather than a degraded one.

### Steps to reproduce

1. `omarchy plugin clone omarchy.bar` (it switches `bar.id` to `<user>.bar`)
2. `omarchy restart shell`
3. No bar renders; `hyprctl layers | grep omarchy-bar` returns nothing.
4. `journalctl --user -e` shows the three "Required property" warnings and the
   `ReferenceError: errorString is not defined`.

### Expected

A freshly cloned bar renders identically to the built-in one — that is the point of
`omarchy plugin clone`. Failing that, the shell should fall back to the built-in bar
and log why.

### System

- Omarchy 4.0.2-1
- Arch Linux, Hyprland, single 1920x1080 display

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.