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

Hiding the last tray icon removes the tray widget, including the menu that unhides it

Reported by omarchybot · filed Aug 16, 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

Hiding the last tray icon removes the tray widget, including the menu that unhides itrevision 1 · captured 2026-09-28 21:29 UTC via poll

System details: Omarchy quattro @ 7488eade (post-4.0.0), QEMU/KVM VM, Hyprland session. Found by an automated QA pass; reproduced on a disposable worker VM.

Hiding the last tray icon makes the whole tray widget disappear — including the chevron whose right-click menu is the only way to unhide it.

shell/plugins/bar/widgets/Tray.qml:213 gates the widget root on the two shown buckets:

visible: pinnedItems.length > 0 || drawerCount > 0

bucket() routes anything in hiddenIds to the "hidden" category and returns it in neither pinnedItems nor drawerItems, so hiding every reporting item makes the root invisible and Bar.qml:1565 collapses the slot to width 0. The chevron that opens the manage popup does count hidden items (drawerArea.visible: root.allItems.length > 0, Tray.qml:260) — but it is a descendant of the now-invisible root, so it goes too.

One tray item is very common (Steam alone, Dropbox alone, a VPN applet alone), and one click on Hide is enough:

$ setsid udiskie -t &                # one tray item
$ omarchy-shell shell debugBarGeometry | grep tray
{'id': 'omarchy.tray', 'width': 54, 'height': 26, 'visible': True, ...}

$ # exactly what the manage popup's Hide button writes (Tray.qml:508 -> persistTrayState)
$ # set the omarchy.tray entry to {"pinned": [], "hidden": ["udiskie"]}

$ omarchy-shell shell debugBarGeometry | grep tray
{'id': 'omarchy.tray', 'width': 0, 'height': 0, 'visible': False, 'itemWidth': 27, ...}

There is no way back from the UI, and no CLI escape either: omarchy-shell omarchy.tray toggle answers Target not found., and omarchy-bar has no unhide command. The pinned/hidden keys are not documented in shell/plugins/bar/README.md, shell/README.md or docs/, so a user has to read Tray.qml to discover the key name and hand-edit shell.json.

visible: allItems.length > 0 is the whole fix.


Correction, after an independent review of this report:

The user is not trapped, which the original implied. After the tray slot collapses the chevron cannot reopen the manager, but recovery is available through the manager's own Show button if it is still open, through omarchy bar defaults or direct shell.json editing, and through the plugin enable/disable UI. The omarchy bar set omarchy.tray hidden '[]' --json route is the one that does not work, for the separate reason filed alongside this.

View raw text
**System details:** Omarchy `quattro` @ 7488eade (post-4.0.0), QEMU/KVM VM, Hyprland session. Found by an automated QA pass; reproduced on a disposable worker VM.

Hiding the last tray icon makes the whole tray widget disappear — including the chevron whose right-click menu is the only way to unhide it.

`shell/plugins/bar/widgets/Tray.qml:213` gates the widget root on the two *shown* buckets:

```qml
visible: pinnedItems.length > 0 || drawerCount > 0
```

`bucket()` routes anything in `hiddenIds` to the `"hidden"` category and returns it in neither `pinnedItems` nor `drawerItems`, so hiding every reporting item makes the root invisible and `Bar.qml:1565` collapses the slot to width 0. The chevron that opens the manage popup does count hidden items (`drawerArea.visible: root.allItems.length > 0`, `Tray.qml:260`) — but it is a descendant of the now-invisible root, so it goes too.

One tray item is very common (Steam alone, Dropbox alone, a VPN applet alone), and one click on Hide is enough:

```
$ setsid udiskie -t &                # one tray item
$ omarchy-shell shell debugBarGeometry | grep tray
{'id': 'omarchy.tray', 'width': 54, 'height': 26, 'visible': True, ...}

$ # exactly what the manage popup's Hide button writes (Tray.qml:508 -> persistTrayState)
$ # set the omarchy.tray entry to {"pinned": [], "hidden": ["udiskie"]}

$ omarchy-shell shell debugBarGeometry | grep tray
{'id': 'omarchy.tray', 'width': 0, 'height': 0, 'visible': False, 'itemWidth': 27, ...}
```

There is no way back from the UI, and no CLI escape either: `omarchy-shell omarchy.tray toggle` answers `Target not found.`, and `omarchy-bar` has no unhide command. The `pinned`/`hidden` keys are not documented in `shell/plugins/bar/README.md`, `shell/README.md` or `docs/`, so a user has to read `Tray.qml` to discover the key name and hand-edit `shell.json`.

`visible: allItems.length > 0` is the whole fix.

---

**Correction, after an independent review of this report:**

The user is not trapped, which the original implied. After the tray slot collapses the chevron cannot reopen the manager, but recovery is available through the manager's own Show button if it is still open, through `omarchy bar defaults` or direct `shell.json` editing, and through the plugin enable/disable UI. The `omarchy bar set omarchy.tray hidden '[]' --json` route is the one that does not work, for the separate reason filed alongside this.

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 04:23 UTC