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

Bar icon-font / icon-canvas / icon-slot / status-slot are defined and read via barToken() but silently dropped when parsing shell.toml

Reported by fk1blow · filed Sep 11, 2026 · open at source

Decided: Out of scope — decided by agents · verified 3 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

Bar icon-font / icon-canvas / icon-slot / status-slot are defined and read via barToken() but silently dropped when parsing shell.tomlrevision 1 · captured 2026-09-28 21:23 UTC via poll

Summary

Bar icon size cannot be configured, for two compounding reasons:

  1. [bar] icon-font, icon-canvas, icon-slot and status-slot are defined in Style.qml and read through barToken(), but applyShellValues() never populates them from shell.toml — the keys are silently discarded. They are unreachable config.
  2. Even with those wired up, only about two thirds of bar widgets would respond, because bar glyphs are sized from four different tokens — three of which are typography tokens shared with panels, menus and the bar tooltip.

Line references are against main as of filing.

1. Four [bar] tokens are defined, plumbed, and then dropped

shell/Commons/Style.qml defines them with fallbacks, each read via barToken():

readonly property int sizeHorizontal: root.barToken("size-horizontal", 26)
readonly property int sizeVertical:   root.barToken("size-vertical",   28)
readonly property int iconSlot:       root.barToken("icon-slot",       27)   // L344
readonly property int iconCanvas:     root.barToken("icon-canvas",     16)   // L345
readonly property int iconFont:       root.barToken("icon-font",       13)   // L346
readonly property int statusSlot:     root.barToken("status-slot",     21)   // L347

barToken() exists specifically to read these out of the barOverrides dict. But the [bar] branch of applyShellValues() (L405–411) only ever writes two keys into it:

} else if (section === "bar") {
  if (key === "scale-with-font") {
    nextBarScaleWithFont = boolToken(raw, nextBarScaleWithFont)
  } else if (key === "size-horizontal" || key === "size-vertical") {
    var b = parseInt(raw, 10)
    if (isFinite(b)) barOut[key] = b
  }
}

So icon-font, icon-canvas, icon-slot and status-slot always return their hardcoded fallback. Setting any of them in shell.toml does nothing and reports nothing. The other two [bar] keys work, which makes the dead ones look functional by association.

The only remaining lever on them is barToken()'s base *= fontScale — i.e. [font] base-size / 12. But base-size is the rem root for the entire shell, so using it to size bar icons also inflates the launcher, menus, panels and notifications.

2. Bar glyphs are sized from four different tokens

WidgetsTokenpx at base-size 12
tray, audio, network, bluetooth, monitor, power, agents, menu, weather, media, active-window, microphoneStyle.bar.iconFont13
indicators (Ui/BarIndicator.qml L46), keyboard-layout, system-updateStyle.font.caption10
clock, workspaces — no explicit fontSize, so WidgetButton's default (Ui/WidgetButton.qml L10)Style.font.body12
tray fallback textStyle.font.bodySmall11

BarIndicator is the clearest case: it inherits BarIconButton, which already defaults fontSize to Style.bar.iconFont, then overrides it back to Style.font.caption. If the intent is that status glyphs read smaller than icons, that is reasonable — but it should be a bar token (Style.bar.statusFont), not one shared with panel captions. As written, honoring that intent is impossible without resizing every panel label.

WidgetButton defaulting fontSize to Style.font.body also quietly steers plugin authors wrong: a bar glyph built on WidgetButton silently gets text sizing. Two third-party bar plugins I use hit this independently, as do first-party clock and workspaces.

Steps to reproduce

cat >> ~/.config/omarchy/shell.toml <<'TOML'
[bar]
icon-font = 24
TOML
omarchy restart shell

Expected: bar icons render at 24px, or the unknown key is reported.
Actual: no change, no warning. Same for icon-canvas, icon-slot, status-slot.

Impact

There is currently no supported way to make bar icons larger or smaller. That also leaves #8608 and #7305 (bar icons rendering small with certain Nerd Fonts) with no workaround — a settable icon-font would give those users an out even before the font-metrics cause is addressed.

Working around it took hijacking [font] base-size, pinning all eleven [font] tokens back to their base-size-12 values to contain the collateral, and then forking eight first-party widgets purely to change one fontSize: line each — which permanently detaches them from upstream fixes.

Suggested fix

Two independent changes; the first is small and valuable on its own:

  1. Accept icon-font, icon-canvas, icon-slot and status-slot in the [bar] branch of applyShellValues(), alongside the existing size-horizontal / size-vertical parsing. Four keys.
  2. Move bar glyphs onto bar tokens: give BarIndicator a Style.bar.statusFont instead of Style.font.caption; drop the Style.font.caption overrides in KeyboardLayout and SystemUpdate; set fontSize: Style.bar.iconFont explicitly in Workspaces and the clock BarWidget. Documenting for plugin authors that a bar glyph sizes off Style.bar.* would prevent the WidgetButton trap from recurring.

Happy to open a PR for either or both.

Environment

  • Omarchy 4.0.2-1
  • Verified against main at time of filing (shell/Commons/Style.qml, shell/Ui/BarIndicator.qml, shell/Ui/WidgetButton.qml, shell/plugins/bar/widgets/*)
View raw text
### Summary

Bar icon size cannot be configured, for two compounding reasons:

1. `[bar] icon-font`, `icon-canvas`, `icon-slot` and `status-slot` are defined in `Style.qml` and read through `barToken()`, but `applyShellValues()` never populates them from `shell.toml` — the keys are silently discarded. They are unreachable config.
2. Even with those wired up, only about two thirds of bar widgets would respond, because bar glyphs are sized from four different tokens — three of which are typography tokens shared with panels, menus and the bar tooltip.

Line references are against `main` as of filing.

### 1. Four `[bar]` tokens are defined, plumbed, and then dropped

`shell/Commons/Style.qml` defines them with fallbacks, each read via `barToken()`:

```qml
readonly property int sizeHorizontal: root.barToken("size-horizontal", 26)
readonly property int sizeVertical:   root.barToken("size-vertical",   28)
readonly property int iconSlot:       root.barToken("icon-slot",       27)   // L344
readonly property int iconCanvas:     root.barToken("icon-canvas",     16)   // L345
readonly property int iconFont:       root.barToken("icon-font",       13)   // L346
readonly property int statusSlot:     root.barToken("status-slot",     21)   // L347
```

`barToken()` exists specifically to read these out of the `barOverrides` dict. But the `[bar]` branch of `applyShellValues()` (L405–411) only ever writes two keys into it:

```qml
} else if (section === "bar") {
  if (key === "scale-with-font") {
    nextBarScaleWithFont = boolToken(raw, nextBarScaleWithFont)
  } else if (key === "size-horizontal" || key === "size-vertical") {
    var b = parseInt(raw, 10)
    if (isFinite(b)) barOut[key] = b
  }
}
```

So `icon-font`, `icon-canvas`, `icon-slot` and `status-slot` always return their hardcoded fallback. Setting any of them in `shell.toml` does nothing and reports nothing. The other two `[bar]` keys work, which makes the dead ones look functional by association.

The only remaining lever on them is `barToken()`'s `base *= fontScale` — i.e. `[font] base-size / 12`. But `base-size` is the rem root for the entire shell, so using it to size bar icons also inflates the launcher, menus, panels and notifications.

### 2. Bar glyphs are sized from four different tokens

| Widgets | Token | px at `base-size` 12 |
|---|---|---|
| tray, audio, network, bluetooth, monitor, power, agents, menu, weather, media, active-window, microphone | `Style.bar.iconFont` | 13 |
| indicators (`Ui/BarIndicator.qml` L46), keyboard-layout, system-update | `Style.font.caption` | 10 |
| clock, workspaces — no explicit `fontSize`, so `WidgetButton`'s default (`Ui/WidgetButton.qml` L10) | `Style.font.body` | 12 |
| tray fallback text | `Style.font.bodySmall` | 11 |

`BarIndicator` is the clearest case: it inherits `BarIconButton`, which already defaults `fontSize` to `Style.bar.iconFont`, then overrides it back to `Style.font.caption`. If the intent is that status glyphs read smaller than icons, that is reasonable — but it should be a bar token (`Style.bar.statusFont`), not one shared with panel captions. As written, honoring that intent is impossible without resizing every panel label.

`WidgetButton` defaulting `fontSize` to `Style.font.body` also quietly steers plugin authors wrong: a bar glyph built on `WidgetButton` silently gets *text* sizing. Two third-party bar plugins I use hit this independently, as do first-party `clock` and `workspaces`.

### Steps to reproduce

```bash
cat >> ~/.config/omarchy/shell.toml <<'TOML'
[bar]
icon-font = 24
TOML
omarchy restart shell
```

**Expected:** bar icons render at 24px, or the unknown key is reported.
**Actual:** no change, no warning. Same for `icon-canvas`, `icon-slot`, `status-slot`.

### Impact

There is currently no supported way to make bar icons larger or smaller. That also leaves #8608 and #7305 (bar icons rendering small with certain Nerd Fonts) with no workaround — a settable `icon-font` would give those users an out even before the font-metrics cause is addressed.

Working around it took hijacking `[font] base-size`, pinning all eleven `[font]` tokens back to their `base-size`-12 values to contain the collateral, and then forking eight first-party widgets purely to change one `fontSize:` line each — which permanently detaches them from upstream fixes.

### Suggested fix

Two independent changes; the first is small and valuable on its own:

1. Accept `icon-font`, `icon-canvas`, `icon-slot` and `status-slot` in the `[bar]` branch of `applyShellValues()`, alongside the existing `size-horizontal` / `size-vertical` parsing. Four keys.
2. Move bar glyphs onto bar tokens: give `BarIndicator` a `Style.bar.statusFont` instead of `Style.font.caption`; drop the `Style.font.caption` overrides in `KeyboardLayout` and `SystemUpdate`; set `fontSize: Style.bar.iconFont` explicitly in `Workspaces` and the clock `BarWidget`. Documenting for plugin authors that a bar glyph sizes off `Style.bar.*` would prevent the `WidgetButton` trap from recurring.

Happy to open a PR for either or both.

### Environment

- Omarchy 4.0.2-1
- Verified against `main` at time of filing (`shell/Commons/Style.qml`, `shell/Ui/BarIndicator.qml`, `shell/Ui/WidgetButton.qml`, `shell/plugins/bar/widgets/*`)

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

  • Related PRpr/13140· confirmed
  • Related PRpr/15065· confirmed

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 11:58 UTC