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.
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
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
Summary
Bar icon size cannot be configured, for two compounding reasons:
[bar] icon-font,icon-canvas,icon-slotandstatus-slotare defined inStyle.qmland read throughbarToken(), butapplyShellValues()never populates them fromshell.toml— the keys are silently discarded. They are unreachable config.- 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) // L347barToken() 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
| 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
cat >> ~/.config/omarchy/shell.toml <<'TOML'
[bar]
icon-font = 24
TOML
omarchy restart shellExpected: 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:
- Accept
icon-font,icon-canvas,icon-slotandstatus-slotin the[bar]branch ofapplyShellValues(), alongside the existingsize-horizontal/size-verticalparsing. Four keys. - Move bar glyphs onto bar tokens: give
BarIndicatoraStyle.bar.statusFontinstead ofStyle.font.caption; drop theStyle.font.captionoverrides inKeyboardLayoutandSystemUpdate; setfontSize: Style.bar.iconFontexplicitly inWorkspacesand the clockBarWidget. Documenting for plugin authors that a bar glyph sizes offStyle.bar.*would prevent theWidgetButtontrap from recurring.
Happy to open a PR for either or both.
Environment
- Omarchy 4.0.2-1
- Verified against
mainat 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