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 stores booleans as strings, silently disabling manifest-declared boolean settings
Reported by CapitalX · filed Aug 31, 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
What happened
omarchy bar set <id> <key> <value> always stores the value as a JSON string unless --json is passed. For a setting the widget's own manifest declares as "type": "boolean", that produces a value the widget can never act on — while the CLI still prints Set <key> on <id> and exits 0.
omarchy.indicators is the concrete case. Its manifest declares:
{ "key": "alwaysShow", "type": "boolean", "defaultValue": false }and shell/plugins/bar/widgets/Indicators.qml:17 reads it with a strict comparison:
readonly property bool alwaysShowIndicators: setting("alwaysShow", false) === true"true" === true is false, so the documented setting silently does nothing.
Steps to reproduce
omarchy bar set omarchy.indicators alwaysShow true
sleep 2
jq -c '.bar.layout.center[] | select(.id=="omarchy.indicators")
| {alwaysShow, type:(.alwaysShow|type)}' ~/.config/omarchy/shell.jsonActual:
Set alwaysShow on omarchy.indicators
{"alwaysShow":"true","type":"string"}Inactive indicators still only appear on hover.
With --json it works correctly, which isolates the problem to the untyped path:
omarchy bar set omarchy.indicators alwaysShow true --json
# {"alwaysShow":true,"type":"boolean"} -> indicators now always shownWhat I expected
Either the value is coerced to the type the manifest declares, or the command fails loudly. Silently writing an inert value and reporting success is the part that costs time — nothing in the output or in the bar suggests the setting did not take.
Where it comes from
The CLI is the only place the type is lost; everything downstream is faithful.
bin/omarchy-bar,cmd_set()— without--jsonthe value goes throughjq -cn --arg value "$value" '$value', which always yields a JSON string.shell/shell.qml:941setBarWidget()—JSON.parse(valueJson), correct.shell/services/PluginRegistry.qml:317setBarWidget()—entry[String(key)] = value, stored unchanged.
The registry already has the manifest schema at this point, so the declared type is available to coerce against (or to validate and reject).
Scope
Every manifest-declared non-string bar-widget setting is affected. Today that is omarchy.indicators alwaysShow (boolean) and items (multiselect, an array). Number-typed settings mostly survive because their consumers wrap reads in Number(...); booleans compared with === true do not.
System
- Omarchy:
4.0.2-1(latest release v4.0.2; verified the samecmd_set()and the same=== trueread onmain) - Kernel:
7.1.9-arch1-2 - Hyprland:
0.56.2 - CPU: Intel Core i7-8750H
- GPU: Intel UHD 630 + NVIDIA GTX 1060 Mobile
- jq:
1.8.2
View raw text
### What happened
`omarchy bar set <id> <key> <value>` always stores the value as a JSON **string** unless `--json` is passed. For a setting the widget's own manifest declares as `"type": "boolean"`, that produces a value the widget can never act on — while the CLI still prints `Set <key> on <id>` and exits 0.
`omarchy.indicators` is the concrete case. Its manifest declares:
```json
{ "key": "alwaysShow", "type": "boolean", "defaultValue": false }
```
and `shell/plugins/bar/widgets/Indicators.qml:17` reads it with a strict comparison:
```qml
readonly property bool alwaysShowIndicators: setting("alwaysShow", false) === true
```
`"true" === true` is `false`, so the documented setting silently does nothing.
### Steps to reproduce
```bash
omarchy bar set omarchy.indicators alwaysShow true
sleep 2
jq -c '.bar.layout.center[] | select(.id=="omarchy.indicators")
| {alwaysShow, type:(.alwaysShow|type)}' ~/.config/omarchy/shell.json
```
Actual:
```
Set alwaysShow on omarchy.indicators
{"alwaysShow":"true","type":"string"}
```
Inactive indicators still only appear on hover.
With `--json` it works correctly, which isolates the problem to the untyped path:
```bash
omarchy bar set omarchy.indicators alwaysShow true --json
# {"alwaysShow":true,"type":"boolean"} -> indicators now always shown
```
### What I expected
Either the value is coerced to the type the manifest declares, or the command fails loudly. Silently writing an inert value and reporting success is the part that costs time — nothing in the output or in the bar suggests the setting did not take.
### Where it comes from
The CLI is the only place the type is lost; everything downstream is faithful.
- `bin/omarchy-bar`, `cmd_set()` — without `--json` the value goes through `jq -cn --arg value "$value" '$value'`, which always yields a JSON string.
- `shell/shell.qml:941` `setBarWidget()` — `JSON.parse(valueJson)`, correct.
- `shell/services/PluginRegistry.qml:317` `setBarWidget()` — `entry[String(key)] = value`, stored unchanged.
The registry already has the manifest schema at this point, so the declared `type` is available to coerce against (or to validate and reject).
### Scope
Every manifest-declared non-string bar-widget setting is affected. Today that is `omarchy.indicators` `alwaysShow` (`boolean`) and `items` (`multiselect`, an array). Number-typed settings mostly survive because their consumers wrap reads in `Number(...)`; booleans compared with `=== true` do not.
### System
- Omarchy: `4.0.2-1` (latest release v4.0.2; verified the same `cmd_set()` and the same `=== true` read on `main`)
- Kernel: `7.1.9-arch1-2`
- Hyprland: `0.56.2`
- CPU: Intel Core i7-8750H
- GPU: Intel UHD 630 + NVIDIA GTX 1060 Mobile
- jq: `1.8.2`
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 10:15 UTC