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 widget never mounts while its keepLoaded service runs, and reload does not compile the widget QML
Reported by thodoristsagko · filed Sep 26, 2026 · open at source
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?
- AreaOutside the audited area· Decided by agents · verified
- 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?
- Decided by agents and verified by a second, independent agent — see the decision.
Original report
System details
Intel i9-12900H, Intel Iris Xe + NVIDIA RTX A3000 Laptop, Omarchy 4.0.4-1, Quickshell 0.3.1 (Arch).
What happened
A third-party plugin that is both a service and a bar-widget ends up with a live service and no bar widget. The slot is in ~/.config/omarchy/shell.json, but nothing is drawn and the service has no widget instance. Reloading the plugin does not compile the widget file: a syntax error in that file produces no load error.
Reproduced with OmaStats 1.4.0 (crmne.omastats, keepLoaded: true, commit 61878e8). The plugin is enabled and its entry is in the right section of the bar.
The service is up. Its sampler is a child of the shell, and IPC answers:
omarchy-shell crmne.omastats status
{"ready":true,"seq":2606,"cpu":17.9,"cpuTemp":56,"memoryPercent":17.1,"download":1641668.75,"upload":31292.38,"gpu":null,"battery":24,"error":""}The widget is not:
omarchy-shell crmne.omastats locate
[]
omarchy-shell crmne.omastats show cpu
no-widgetno-widget is what OmaStatsService.qml returns when no bar instance has called registerInstance(). The right-hand side of the bar shows the neighboring icons and no CPU / memory / network readouts in the OmaStats slot.
journalctl --user -t omarchy-shell has Local plugin changed, reloading: crmne.omastats and never Plugin widget crmne.omastats failed. A console.warn added to Component.onCompleted in OmaStatsWidget.qml never showed up after that reload, so the item is not constructed.
The widget file itself compiles. In a separate Quickshell process, Qt.createComponent("…/OmaStatsWidget.qml", Component.PreferSynchronous) returns status 1 (Ready) and an empty error string.
Saving a deliberate syntax error into OmaStatsWidget.qml still only logs the reload line. There is no Plugin widget crmne.omastats failed: warning. The diagnostic edit was reverted; git diff in the plugin checkout is empty. So the running shell is not compiling that file on reload.
Expected
The bar widget is created, draws its readouts, and locate lists the instance. A syntax error in the widget QML is reported with Plugin widget <id> failed.
Where this diverges in the shell
ensureService() compiles the service with Component.PreferSynchronous, and that path works. The sampler stays up across reloads because the manifest sets keepLoaded: true.
loadPluginWidget() compiles the bar widget with Component.Asynchronous and only calls barWidgetRegistry.register() from finalize(). Neither the Ready path nor the Error path is visible for this plugin: the widget is never registered, and a file that cannot compile does not log the failure.
This is not #11796. That report is a widget that does mount, whose bar.shell.serviceFor() returns null. Here the widget object is never constructed.
Steps
- Omarchy 4.0.4-1, stock
omarchy.bar. omarchy plugin add https://github.com/crmne/omastats.git --enable- Confirm the entry is in
bar.layoutand the sampler process is running. omarchy-shell crmne.omastats statusreturns data.locatereturns[].show cpureturnsno-widget. The bar slot is empty.- Put a syntax error in
~/.config/omarchy/plugins/crmne.omastats/OmaStatsWidget.qmland save. The journal logs the reload and does not logPlugin widget crmne.omastats failed.
View raw text
## System details
Intel i9-12900H, Intel Iris Xe + NVIDIA RTX A3000 Laptop, Omarchy 4.0.4-1, Quickshell 0.3.1 (Arch).
## What happened
A third-party plugin that is both a `service` and a `bar-widget` ends up with a live service and no bar widget. The slot is in `~/.config/omarchy/shell.json`, but nothing is drawn and the service has no widget instance. Reloading the plugin does not compile the widget file: a syntax error in that file produces no load error.
Reproduced with [OmaStats 1.4.0](https://github.com/crmne/omastats) (`crmne.omastats`, `keepLoaded: true`, commit `61878e8`). The plugin is enabled and its entry is in the right section of the bar.
The service is up. Its sampler is a child of the shell, and IPC answers:
```
omarchy-shell crmne.omastats status
{"ready":true,"seq":2606,"cpu":17.9,"cpuTemp":56,"memoryPercent":17.1,"download":1641668.75,"upload":31292.38,"gpu":null,"battery":24,"error":""}
```
The widget is not:
```
omarchy-shell crmne.omastats locate
[]
omarchy-shell crmne.omastats show cpu
no-widget
```
`no-widget` is what `OmaStatsService.qml` returns when no bar instance has called `registerInstance()`. The right-hand side of the bar shows the neighboring icons and no CPU / memory / network readouts in the OmaStats slot.
`journalctl --user -t omarchy-shell` has `Local plugin changed, reloading: crmne.omastats` and never `Plugin widget crmne.omastats failed`. A `console.warn` added to `Component.onCompleted` in `OmaStatsWidget.qml` never showed up after that reload, so the item is not constructed.
The widget file itself compiles. In a separate Quickshell process, `Qt.createComponent("…/OmaStatsWidget.qml", Component.PreferSynchronous)` returns status `1` (Ready) and an empty error string.
Saving a deliberate syntax error into `OmaStatsWidget.qml` still only logs the reload line. There is no `Plugin widget crmne.omastats failed:` warning. The diagnostic edit was reverted; `git diff` in the plugin checkout is empty. So the running shell is not compiling that file on reload.
## Expected
The bar widget is created, draws its readouts, and `locate` lists the instance. A syntax error in the widget QML is reported with `Plugin widget <id> failed`.
## Where this diverges in the shell
`ensureService()` compiles the service with `Component.PreferSynchronous`, and that path works. The sampler stays up across reloads because the manifest sets `keepLoaded: true`.
`loadPluginWidget()` compiles the bar widget with `Component.Asynchronous` and only calls `barWidgetRegistry.register()` from `finalize()`. Neither the Ready path nor the Error path is visible for this plugin: the widget is never registered, and a file that cannot compile does not log the failure.
This is not #11796. That report is a widget that does mount, whose `bar.shell.serviceFor()` returns null. Here the widget object is never constructed.
## Steps
1. Omarchy 4.0.4-1, stock `omarchy.bar`.
2. `omarchy plugin add https://github.com/crmne/omastats.git --enable`
3. Confirm the entry is in `bar.layout` and the sampler process is running.
4. `omarchy-shell crmne.omastats status` returns data. `locate` returns `[]`. `show cpu` returns `no-widget`. The bar slot is empty.
5. Put a syntax error in `~/.config/omarchy/plugins/crmne.omastats/OmaStatsWidget.qml` and save. The journal logs the reload and does not log `Plugin widget crmne.omastats failed`.
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.
- Out of scopeDecided by agents · verified · 2026-10-09 18:45 UTC