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.
omarchy bar set --json cannot persist array settings (tray pinned ["steam"] stored as "steam")
Reported by mscurtescu · filed Sep 8, 2026Closed upstream on 2026-09-08 by its own reporter mscurtescu, as a duplicate of #7120 (R-1771). GitHub close reason: duplicate.
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
System details
Framework Laptop 13 (AMD Ryzen AI 9 HX 370 / Radeon 890M), Omarchy 4.0.2-1, linux 7.1.9-arch1-2, Hyprland 0.56.2, quickshell 0.3.1-1
What's wrong?
omarchy bar set --json cannot persist JSON array widget settings. The command reports success, but a one-element array is stored as a string, and a multi-element array is rejected by Quickshell IPC as extra arguments.
This matters for omarchy.tray: pinned / hidden are arrays. Tray.qml only honors an array:
readonly property var pinnedIds: settings.pinned instanceof Array ? settings.pinned : []So omarchy bar set omarchy.tray pinned '["steam"]' --json looks like it worked and does nothing: Steam stays in the hover drawer. Pinning from the chevron manage popup works, because that path writes a real array in-process via updateEntryInline.
Steps
With omarchy.tray on the bar and Steam running (or any SNI id):
omarchy bar set omarchy.tray pinned '["steam"]' --json
# → Set pinned on omarchy.tray~/.config/omarchy/shell.json then has:
{ "id": "omarchy.tray", "pinned": "steam" }Expected:
{ "id": "omarchy.tray", "pinned": ["steam"] }Direct IPC (same result):
omarchy-shell shell setBarWidget omarchy.tray pinned '["steam"]' '{}'
# stored "steam" (string)
omarchy-shell shell setBarWidget omarchy.tray pinned '["steam","foo"]' '{}'
# Too many arguments provided (4 required but 5 were provided.)
# Function definition: function setBarWidget(id: string, key: string, valueJson: string, selectorJson: string): string
omarchy-shell shell setBarWidget omarchy.tray pinned '{"a":1}' '{}'
# stored {"a":1} (object, correct)
omarchy-shell shell setBarWidget omarchy.tray pinned '300' '{}'
# stored 300 (number, correct)Objects, numbers, and bools round-trip. Arrays do not.
Where it breaks
omarchy-bar cmd_set is fine: jq --argjson emits ["steam"], then:
omarchy-shell shell setBarWidget "$id" "$key" "$value_json" "$(placement_json)"omarchy-shell forwards that to qs ipc call. shell.qml setBarWidget is typed with valueJson: string and does JSON.parse(valueJson).
A JSON array argument is not one string to parse. A one-element array is coerced into the string "steam" (parse succeeds, wrong type). Two or more elements become extra IPC arguments.
The chevron Pin button never hits this path (persistTrayState → updateEntryInline with a JS array), which is why the UI works and the documented CLI does not.
Workaround: edit ~/.config/omarchy/shell.json so pinned is an array, or pin from the chevron popup.
omarchy-debug --no-sudo --print was collected locally; this is a CLI/IPC bug, not a hardware one.
View raw text
### System details
Framework Laptop 13 (AMD Ryzen AI 9 HX 370 / Radeon 890M), Omarchy 4.0.2-1, linux 7.1.9-arch1-2, Hyprland 0.56.2, quickshell 0.3.1-1
### What's wrong?
`omarchy bar set --json` cannot persist **JSON array** widget settings. The command reports success, but a one-element array is stored as a string, and a multi-element array is rejected by Quickshell IPC as extra arguments.
This matters for `omarchy.tray`: `pinned` / `hidden` are arrays. `Tray.qml` only honors an array:
```qml
readonly property var pinnedIds: settings.pinned instanceof Array ? settings.pinned : []
```
So `omarchy bar set omarchy.tray pinned '["steam"]' --json` looks like it worked and does nothing: Steam stays in the hover drawer. Pinning from the chevron manage popup works, because that path writes a real array in-process via `updateEntryInline`.
#### Steps
With `omarchy.tray` on the bar and Steam running (or any SNI id):
```bash
omarchy bar set omarchy.tray pinned '["steam"]' --json
# → Set pinned on omarchy.tray
```
`~/.config/omarchy/shell.json` then has:
```json
{ "id": "omarchy.tray", "pinned": "steam" }
```
Expected:
```json
{ "id": "omarchy.tray", "pinned": ["steam"] }
```
Direct IPC (same result):
```bash
omarchy-shell shell setBarWidget omarchy.tray pinned '["steam"]' '{}'
# stored "steam" (string)
omarchy-shell shell setBarWidget omarchy.tray pinned '["steam","foo"]' '{}'
# Too many arguments provided (4 required but 5 were provided.)
# Function definition: function setBarWidget(id: string, key: string, valueJson: string, selectorJson: string): string
omarchy-shell shell setBarWidget omarchy.tray pinned '{"a":1}' '{}'
# stored {"a":1} (object, correct)
omarchy-shell shell setBarWidget omarchy.tray pinned '300' '{}'
# stored 300 (number, correct)
```
Objects, numbers, and bools round-trip. Arrays do not.
#### Where it breaks
`omarchy-bar` `cmd_set` is fine: `jq --argjson` emits `["steam"]`, then:
```bash
omarchy-shell shell setBarWidget "$id" "$key" "$value_json" "$(placement_json)"
```
`omarchy-shell` forwards that to `qs ipc call`. `shell.qml` `setBarWidget` is typed with `valueJson: string` and does `JSON.parse(valueJson)`.
A JSON array argument is not one string to parse. A one-element array is coerced into the string `"steam"` (parse succeeds, wrong type). Two or more elements become extra IPC arguments.
The chevron Pin button never hits this path (`persistTrayState` → `updateEntryInline` with a JS array), which is why the UI works and the documented CLI does not.
Workaround: edit `~/.config/omarchy/shell.json` so `pinned` is an array, or pin from the chevron popup.
`omarchy-debug --no-sudo --print` was collected locally; this is a CLI/IPC bug, not a hardware one.
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.