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.
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.
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 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
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())
...- 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.poweromarchy 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 1788490594592The same thing happened with real code before I reduced it to this marker: aProcess 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.