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

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.

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

Bar: custom command modules log a "moduleName" read-only TypeError on every loadrevision 1 · captured 2026-10-04 12:03 UTC via poll

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:
   { "id": "hostname", "type": "command", "exec": "hostname -s", "interval": 3600 }
  1. Save (the shell hot-reloads).
  2. 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

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

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