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-1175GitHub issuePublicDecided· Out of scope

omarchy bar set stores booleans as strings, silently disabling manifest-declared boolean settings

Reported by CapitalX · filed Aug 31, 2026 · open at source

Decided: Out of scope — decided by agents · verified 4 days ago.

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

omarchy bar set stores booleans as strings, silently disabling manifest-declared boolean settingsrevision 1 · captured 2026-09-28 21:24 UTC via poll

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

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