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.
Bar: custom command modules log a "moduleName" read-only TypeError on every load
Reported by chrisekelley · filed Sep 1, 2026Closed upstream on 2026-09-21 by bjarneo via an automated message, as a duplicate of #7635 (R-1613). 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
Adding a custom type: "command" module to the bar makes the shell log this on every load and every shell.json hot-reload, twice each time:
omarchy-shell[754586]: WARN scene: @plugins/bar/Bar.qml[1770:-1]: TypeError: Cannot assign to read-only property "moduleName"
omarchy-shell[754586]: WARN scene: @plugins/bar/Bar.qml[1770:-1]: TypeError: Cannot assign to read-only property "moduleName" (exception occurred during delayed function evaluation)The widget itself renders and works correctly — this is log noise plus a silently aborted function, not a visible breakage.
Expected
No warning. Custom command modules are a documented feature (shell/plugins/bar/README.md, "Custom user modules"), so the happy path shouldn't throw.
Steps to reproduce
- Add a custom command module to
~/.config/omarchy/shell.jsonunderbar.layout.left:
{ "id": "hostname", "type": "command", "exec": "hostname -s", "interval": 3600 }- Save (the shell hot-reloads).
journalctl --user -u <shell unit> -n 20— or just watch the shell's stderr.
Any custom command module reproduces it; nothing about the specific exec matters.
Cause
ModuleSlot.injectProps() assigns into every loaded module:
function injectProps() {
var target = activeItem
if (!target) return
if ("bar" in target) target.bar = root
if ("moduleName" in target) target.moduleName = moduleName
if ("settings" in target) target.settings = moduleSettings
}But CustomCommandModule declares both moduleName and settings as readonly, deriving them from entry:
component CustomCommandModule: WidgetButton {
id: customRoot
required property var entry
readonly property string moduleName: root.entryId(entry)
readonly property var settings: root.entrySettings(entry)So the moduleName assignment throws. Because it throws, injectProps() aborts before the settings line — which would have thrown too. The module still behaves correctly, since it computes both values from entry itself; the injection was never needed for this module type.
Suggested fix
Either skip injection for modules that already source their own props, or make the writes non-fatal — e.g. drop readonly from the two CustomCommandModule properties, or guard injectProps() so it doesn't write properties the target defines as readonly.
System details
- Omarchy 4.0.2-1
- Hyprland / Wayland, single 3440x1440 display at scale 2
- Intel Core i9-8950HK, Intel UHD 630 + AMD Baffin (RX 560), Apple T2 Mac
- Confirmed present on
masterat f4378f0 (packaged 4.0.2-1 and upstreamBar.qmlare byte-identical in this region)
View raw text
### What happens
Adding a custom `type: "command"` module to the bar makes the shell log this on every load and every `shell.json` hot-reload, twice each time:
```
omarchy-shell[754586]: WARN scene: @plugins/bar/Bar.qml[1770:-1]: TypeError: Cannot assign to read-only property "moduleName"
omarchy-shell[754586]: WARN scene: @plugins/bar/Bar.qml[1770:-1]: TypeError: Cannot assign to read-only property "moduleName" (exception occurred during delayed function evaluation)
```
The widget itself renders and works correctly — this is log noise plus a silently aborted function, not a visible breakage.
### Expected
No warning. Custom command modules are a documented feature (`shell/plugins/bar/README.md`, "Custom user modules"), so the happy path shouldn't throw.
### Steps to reproduce
1. Add a custom command module to `~/.config/omarchy/shell.json` under `bar.layout.left`:
```json
{ "id": "hostname", "type": "command", "exec": "hostname -s", "interval": 3600 }
```
2. Save (the shell hot-reloads).
3. `journalctl --user -u <shell unit> -n 20` — or just watch the shell's stderr.
Any custom command module reproduces it; nothing about the specific `exec` matters.
### Cause
`ModuleSlot.injectProps()` assigns into every loaded module:
https://github.com/basecamp/omarchy/blob/f4378f0de5b44d331ee943746a97872b718a6c18/shell/plugins/bar/Bar.qml#L1766-L1772
```qml
function injectProps() {
var target = activeItem
if (!target) return
if ("bar" in target) target.bar = root
if ("moduleName" in target) target.moduleName = moduleName
if ("settings" in target) target.settings = moduleSettings
}
```
But `CustomCommandModule` declares both `moduleName` and `settings` as `readonly`, deriving them from `entry`:
https://github.com/basecamp/omarchy/blob/f4378f0de5b44d331ee943746a97872b718a6c18/shell/plugins/bar/Bar.qml#L1780-L1785
```qml
component CustomCommandModule: WidgetButton {
id: customRoot
required property var entry
readonly property string moduleName: root.entryId(entry)
readonly property var settings: root.entrySettings(entry)
```
So the `moduleName` assignment throws. Because it throws, `injectProps()` aborts before the `settings` line — which would have thrown too. The module still behaves correctly, since it computes both values from `entry` itself; the injection was never needed for this module type.
### Suggested fix
Either skip injection for modules that already source their own props, or make the writes non-fatal — e.g. drop `readonly` from the two `CustomCommandModule` properties, or guard `injectProps()` so it doesn't write properties the target defines as readonly.
### System details
- Omarchy 4.0.2-1
- Hyprland / Wayland, single 3440x1440 display at scale 2
- Intel Core i9-8950HK, Intel UHD 630 + AMD Baffin (RX 560), Apple T2 Mac
- Confirmed present on `master` at f4378f0 (packaged 4.0.2-1 and upstream `Bar.qml` are byte-identical in this region)
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.