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

Saving a local plugin's QML logs "Local plugin changed, reloading" but the bar widget keeps running the old code

Reported by stoa-ops · filed Sep 4, 2026Closed upstream on 2026-09-20 by bjarneo via an automated message, as a duplicate of #6981 (R-1835). 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

Saving a local plugin's QML logs "Local plugin changed, reloading" but the bar widget keeps running the old coderevision 1 · captured 2026-10-04 12:10 UTC via poll

What happens

Saving a change to a local plugin's Panel.qml logs

DEBUG qml: Local plugin changed, reloading: <plugin-id>

but the running bar widget goes on executing the previous code. The log line reads
as a successful reload, so there is no signal that the edit did not take effect.
omarchy restart shell applies it immediately.

omarchy-shell shell rescanPlugins does not help either.

Expected

Either the saved QML actually takes effect, or the shell reports that it could not
apply the change. Right now the only feedback is a message saying it reloaded.

Steps to reproduce

  1. omarchy plugin clone omarchy.power (any bar-widget plugin should do; this is

the one I used)
2. Add an instantiation marker as the first line inside the root object of
~/.config/omarchy/plugins/<user>.power/Panel.qml:

   Panel {
     id: root
     Component.onCompleted: console.log("REPRO-A instantiated", Date.now())
     ...
  1. Save, then watch the shell log:
   journalctl --user -f | grep -E "REPRO-A|Local plugin changed"

Observed — the reload fires (four times, from the individual filesystem events),
and the marker never appears. It was still absent three minutes later:

Sep 03 22:56:18 omarchy-shell[711256]: DEBUG qml: Local plugin changed, reloading: alejandro-stoa.power
Sep 03 22:56:18 omarchy-shell[711256]: DEBUG qml: Local plugin changed, reloading: alejandro-stoa.power
Sep 03 22:56:18 omarchy-shell[711256]: DEBUG qml: Local plugin changed, reloading: alejandro-stoa.power
Sep 03 22:56:18 omarchy-shell[711256]: DEBUG qml: Local plugin changed, reloading: alejandro-stoa.power
  1. omarchy restart shell — the marker appears at once, under the new PID:
Sep 03 22:56:34 omarchy-shell[775556]: INFO: Launching config: "/usr/share/omarchy/shell/shell.qml"
Sep 03 22:56:34 omarchy-shell[775556]: DEBUG qml: REPRO-A instantiated 1788490594592

The same thing happened with real code before I reduced it to this marker: a
Process with running: true added to the cloned widget never spawned across
repeated saves, then ran on the first restart.

Notes

I have not pinned down the cause, so I am reporting the symptom rather than
guessing at a fix. The relevant path looks like shell.qml:764
(onLocalPluginChanged) → reloadPlugins() → finishPluginReload() →
syncPluginWidgets() → loadPluginWidget().

Two candidates I could not distinguish from outside the process:

  • the reload wedges before re-registering, so the old item simply stays; or
  • the widget is re-created but Qt.clearComponentCache() does not invalidate the

cached compiled QML, so Qt.createComponent() hands back the old component.

The marker cannot tell these apart, since the stale component has no marker in it
either. Either way the user-visible behavior is the same.

Worth noting the docs describe this as working — shell/README.md:160 says
"Saving a file anywhere under ~/.config/omarchy/plugins/ reloads plugin code
automatically; omarchy-shell shell rescanPlugins remains available to force a
reload" — so anyone customizing a cloned widget is likely to trust the log line
and conclude their own QML is wrong.

System

  • Omarchy 4.0.2-1 (stable channel)
  • quickshell 0.3.1-1
  • Hyprland 0.56.2
  • Kernel 7.1.9-arch1-2
  • AMD Ryzen AI 9 HX PRO 370 w/ Radeon 890M, ThinkPad P14s Gen 6 AMD
View raw text
## What happens

Saving a change to a local plugin's `Panel.qml` logs

```
DEBUG qml: Local plugin changed, reloading: <plugin-id>
```

but the running bar widget goes on executing the previous code. The log line reads
as a successful reload, so there is no signal that the edit did not take effect.
`omarchy restart shell` applies it immediately.

`omarchy-shell shell rescanPlugins` does not help either.

## Expected

Either the saved QML actually takes effect, or the shell reports that it could not
apply the change. Right now the only feedback is a message saying it reloaded.

## Steps to reproduce

1. `omarchy plugin clone omarchy.power` (any bar-widget plugin should do; this is
   the one I used)
2. Add an instantiation marker as the first line inside the root object of
   `~/.config/omarchy/plugins/<user>.power/Panel.qml`:

   ```qml
   Panel {
     id: root
     Component.onCompleted: console.log("REPRO-A instantiated", Date.now())
     ...
   ```

3. Save, then watch the shell log:

   ```
   journalctl --user -f | grep -E "REPRO-A|Local plugin changed"
   ```

Observed — the reload fires (four times, from the individual filesystem events),
and the marker never appears. It was still absent three minutes later:

```
Sep 03 22:56:18 omarchy-shell[711256]: DEBUG qml: Local plugin changed, reloading: alejandro-stoa.power
Sep 03 22:56:18 omarchy-shell[711256]: DEBUG qml: Local plugin changed, reloading: alejandro-stoa.power
Sep 03 22:56:18 omarchy-shell[711256]: DEBUG qml: Local plugin changed, reloading: alejandro-stoa.power
Sep 03 22:56:18 omarchy-shell[711256]: DEBUG qml: Local plugin changed, reloading: alejandro-stoa.power
```

4. `omarchy restart shell` — the marker appears at once, under the new PID:

```
Sep 03 22:56:34 omarchy-shell[775556]: INFO: Launching config: "/usr/share/omarchy/shell/shell.qml"
Sep 03 22:56:34 omarchy-shell[775556]: DEBUG qml: REPRO-A instantiated 1788490594592
```

The same thing happened with real code before I reduced it to this marker: a
`Process` with `running: true` added to the cloned widget never spawned across
repeated saves, then ran on the first restart.

## Notes

I have not pinned down the cause, so I am reporting the symptom rather than
guessing at a fix. The relevant path looks like `shell.qml:764`
(`onLocalPluginChanged`) → `reloadPlugins()` → `finishPluginReload()` →
`syncPluginWidgets()` → `loadPluginWidget()`.

Two candidates I could not distinguish from outside the process:

- the reload wedges before re-registering, so the old item simply stays; or
- the widget *is* re-created but `Qt.clearComponentCache()` does not invalidate the
  cached compiled QML, so `Qt.createComponent()` hands back the old component.

The marker cannot tell these apart, since the stale component has no marker in it
either. Either way the user-visible behavior is the same.

Worth noting the docs describe this as working — `shell/README.md:160` says
"Saving a file anywhere under `~/.config/omarchy/plugins/` reloads plugin code
automatically; `omarchy-shell shell rescanPlugins` remains available to force a
reload" — so anyone customizing a cloned widget is likely to trust the log line
and conclude their own QML is wrong.

## System

- Omarchy 4.0.2-1 (stable channel)
- quickshell 0.3.1-1
- Hyprland 0.56.2
- Kernel 7.1.9-arch1-2
- AMD Ryzen AI 9 HX PRO 370 w/ Radeon 890M, ThinkPad P14s Gen 6 AMD

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.