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

Bar tray reserves its fully-expanded drawer width while collapsed, occupying bar space it never paints

Reported by Pursuit2703 · filed Sep 24, 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 tray reserves its fully-expanded drawer width while collapsed, occupying bar space it never paintsrevision 1 · captured 2026-09-28 21:23 UTC via poll

System details

Omarchy 4.0.4-1, quickshell 0.3.1-1, Hyprland 0.56.2-2, horizontal (top) bar, 2 tray items.

What's wrong?

omarchy.tray reserves its fully expanded drawer width at all times, collapsed or not, so the widget permanently occupies bar space it never paints in.

shell/plugins/bar/widgets/Tray.qml:235:

readonly property int drawerBlockWidth: root.allItems.length > 0
  ? expandIcon.implicitWidth + root.drawerExtent : 0   // always the FULL extent

implicitWidth: pinnedWidth + drawerBlockWidth

Measured with omarchy-shell shell debugBarGeometry, collapsed, 2 tray items:

stock:    {"id":"omarchy.tray","width":81,"itemWidth":81}

81 = 27 (chevron) + 54 (2 x Style.bar.iconSlot reserved for the closed drawer). Only the 27px chevron is drawn; the other 54px is empty and always there.

The widget already maintains an animated revealExtent (drawerExtent * revealProgress, line 34) and uses it to position the chevron and slide the icons — the width binding just never uses it.

The dead region is clearly known about: line 240 masks it out of hit-testing so hovering it does not expand the drawer and clicks fall through. What is not handled is anything drawing there. On a fully transparent bar it is merely invisible padding that displaces neighbouring widgets. As soon as a background is painted per module rather than as one continuous bar fill, the reserved-but-empty region gets filled in, and a collapsed tray renders as a block of empty background next to the chevron — which clears the instant the drawer opens, so it reads as a rendering glitch rather than a layout one.

Suggested fix

Size the block from the reveal instead of the full extent, and pin the chevron to the block's right edge so it holds still on screen while the block grows leftward out from under it:

readonly property int revealPx: Math.round(root.revealExtent)
readonly property int drawerBlockWidth: root.allItems.length > 0
  ? expandIcon.implicitWidth + revealPx : 0

with expandIcon.x: drawerBlockWidth - width, trayClip.x: 0, trayClip.width: revealPx, trayIcons.x: revealPx - drawerExtent.

The chevron's screen position is then stable by construction: the widget's left edge moves left by exactly the amount the block gains.

Rounding matters. drawerBlockWidth is an int while revealExtent is a real, so letting the clip and the icon row round it independently puts them on different subpixels and the icons visibly shimmer while the drawer animates. Deriving both from one shared rounded value fixes that.

Verified on the system above:

patched:  {"id":"omarchy.tray","width":27,"itemWidth":27}

Drawer still opens and closes normally, icons reveal nearest-the-chevron first, and the chevron does not move.

Not covered

Only the horizontal tray. verticalTrayRoot.drawerBlockHeight (~line 322) has the identical flaw, left alone as I have no vertical bar to verify a change on.

View raw text
### System details

Omarchy 4.0.4-1, quickshell 0.3.1-1, Hyprland 0.56.2-2, horizontal (top) bar, 2 tray items.

### What's wrong?

`omarchy.tray` reserves its **fully expanded** drawer width at all times, collapsed or not, so the widget permanently occupies bar space it never paints in.

`shell/plugins/bar/widgets/Tray.qml:235`:

```qml
readonly property int drawerBlockWidth: root.allItems.length > 0
  ? expandIcon.implicitWidth + root.drawerExtent : 0   // always the FULL extent

implicitWidth: pinnedWidth + drawerBlockWidth
```

Measured with `omarchy-shell shell debugBarGeometry`, collapsed, 2 tray items:

```
stock:    {"id":"omarchy.tray","width":81,"itemWidth":81}
```

81 = 27 (chevron) + 54 (2 x Style.bar.iconSlot reserved for the closed drawer). Only the 27px chevron is drawn; the other 54px is empty and always there.

The widget already maintains an animated `revealExtent` (`drawerExtent * revealProgress`, line 34) and uses it to position the chevron and slide the icons — the width binding just never uses it.

The dead region is clearly known about: line 240 masks it out of hit-testing so hovering it does not expand the drawer and clicks fall through. What is not handled is anything *drawing* there. On a fully transparent bar it is merely invisible padding that displaces neighbouring widgets. As soon as a background is painted per module rather than as one continuous bar fill, the reserved-but-empty region gets filled in, and a collapsed tray renders as a block of empty background next to the chevron — which clears the instant the drawer opens, so it reads as a rendering glitch rather than a layout one.

### Suggested fix

Size the block from the reveal instead of the full extent, and pin the chevron to the block's right edge so it holds still on screen while the block grows leftward out from under it:

```qml
readonly property int revealPx: Math.round(root.revealExtent)
readonly property int drawerBlockWidth: root.allItems.length > 0
  ? expandIcon.implicitWidth + revealPx : 0
```

with `expandIcon.x: drawerBlockWidth - width`, `trayClip.x: 0`, `trayClip.width: revealPx`, `trayIcons.x: revealPx - drawerExtent`.

The chevron's screen position is then stable by construction: the widget's left edge moves left by exactly the amount the block gains.

Rounding matters. `drawerBlockWidth` is an `int` while `revealExtent` is a real, so letting the clip and the icon row round it independently puts them on different subpixels and the icons visibly shimmer while the drawer animates. Deriving both from one shared rounded value fixes that.

Verified on the system above:

```
patched:  {"id":"omarchy.tray","width":27,"itemWidth":27}
```

Drawer still opens and closes normally, icons reveal nearest-the-chevron first, and the chevron does not move.

### Not covered

Only the horizontal tray. `verticalTrayRoot.drawerBlockHeight` (~line 322) has the identical flaw, left alone as I have no vertical bar to verify a change on.

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 18:20 UTC