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-4680GitHub issuePublicReceived

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.

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

Third-party bar plugins: a cloned bar can never load, and user plugin QML does not hot-reloadrevision 1 · captured 2026-10-04 12:03 UTC via poll

Two separate, independently reproducible problems with user plugins under
~/.config/omarchy/plugins/. Both hit while customising a bar and a bar widget.

System

Omarchy4.0.0-1
Hyprland0.56.2 (efb5099)
Quickshell0.3.0.r20.g28771c7-1
Kernel7.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 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:

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):

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.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):

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.

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.