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.
Notification card shows Qt broken-image placeholder box for unresolvable app_icon (e.g. Claude Code's 'claude')
Reported by qtn10 · filed Sep 9, 2026Closed upstream on 2026-10-11 by the bot omarchybot, as a duplicate (target not recorded).
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
What happened
A desktop notification whose app_icon is a name that doesn't resolve in the
icon theme renders Qt's broken-image placeholder (a purple/black checkered
box) in the notification card, instead of hiding the icon slot.
Concretely: Claude Code sends notifications with app_icon = "claude". There is
no claude icon in a stock Omarchy icon theme, so every Claude Code notification
shows the placeholder box where the app icon should be.
Steps to reproduce
notify-send -a "Claude Code" -i claude "Test" "body"→ notification card shows the purple/black broken-image placeholder in the icon
slot.
notify-send -a "Claude Code" "Test" "body" # no -i→ fine, no icon slot, no box.
Expected
plugins/notifications/components/NotificationCard.qml already intends to handle
this — the slot's visible binding has a comment:
// Hide the slot when the icon failed to resolve (themed-icon name
// not in the user's icon theme) AND we don't have a glyph fallback
// — prevents rendering Qt's pink broken-image placeholder.
visible: !root.collapseRedundantIcon && !root.compactGlyph
&& (root.hasSmallIcon || root.hasGlyph)
&& (root.hasGlyph || smallIconImage.status !== Image.Error)So the placeholder box should never be visible. It is.
Notes / what I tried
- Installing a valid
claude.pnginto~/.local/share/icons/hicolor/{48,64,128,256}x*/apps/ ~/.local/share/pixmaps/claude.png, runninggtk-update-icon-cache -f, and
omarchy restart shell — box persists.
- The child Image (id: smallIconImage) has asynchronous: true and its own
visible: !root.hasGlyph || smallIconImage.status === Image.Ready. For a
no-glyph notification (hasGlyph false) that resolves to visible: true even
when status === Image.Error. Possibly the placeholder paints for a resolved-
but-unrenderable source, or status lands on Ready with a null pixmap
rather than Error, so the parent guard never trips.
- Theme is a light Omarchy theme (color-scheme: prefer-light), icon theme
Yaru-grey. Quickshell owns org.freedesktop.Notifications.
Environment
Omarchy 4.0.3-1 · Hyprland 0.56.2 · quickshell (Omarchy shell) · ROG Flow X13
GV302XA · kernel 7.2.3
Suggested fix
Either bundle a claude icon (the agents plugin already shipsplugins/agents/assets/claude.svg), or make the slot also hide when the image
resolves but fails to paint (treat status === Image.Ready && !sourceSize/null
paint like Error), so any unresolvable/unrenderable app_icon collapses the
slot instead of showing the placeholder.
View raw text
## What happened
A desktop notification whose `app_icon` is a name that doesn't resolve in the
icon theme renders **Qt's broken-image placeholder** (a purple/black checkered
box) in the notification card, instead of hiding the icon slot.
Concretely: Claude Code sends notifications with `app_icon = "claude"`. There is
no `claude` icon in a stock Omarchy icon theme, so every Claude Code notification
shows the placeholder box where the app icon should be.
## Steps to reproduce
```bash
notify-send -a "Claude Code" -i claude "Test" "body"
```
→ notification card shows the purple/black broken-image placeholder in the icon
slot.
```bash
notify-send -a "Claude Code" "Test" "body" # no -i
```
→ fine, no icon slot, no box.
## Expected
`plugins/notifications/components/NotificationCard.qml` already intends to handle
this — the slot's `visible` binding has a comment:
```qml
// Hide the slot when the icon failed to resolve (themed-icon name
// not in the user's icon theme) AND we don't have a glyph fallback
// — prevents rendering Qt's pink broken-image placeholder.
visible: !root.collapseRedundantIcon && !root.compactGlyph
&& (root.hasSmallIcon || root.hasGlyph)
&& (root.hasGlyph || smallIconImage.status !== Image.Error)
```
So the placeholder box should never be visible. It is.
## Notes / what I tried
- Installing a valid `claude.png` into `~/.local/share/icons/hicolor/{48,64,128,256}x*/apps/`
+ `~/.local/share/pixmaps/claude.png`, running `gtk-update-icon-cache -f`, and
`omarchy restart shell` — **box persists.**
- The child `Image` (`id: smallIconImage`) has `asynchronous: true` and its own
`visible: !root.hasGlyph || smallIconImage.status === Image.Ready`. For a
no-glyph notification (`hasGlyph` false) that resolves to `visible: true` even
when `status === Image.Error`. Possibly the placeholder paints for a resolved-
but-unrenderable source, or `status` lands on `Ready` with a null pixmap
rather than `Error`, so the parent guard never trips.
- Theme is a light Omarchy theme (`color-scheme: prefer-light`), icon theme
`Yaru-grey`. Quickshell owns `org.freedesktop.Notifications`.
## Environment
Omarchy 4.0.3-1 · Hyprland 0.56.2 · quickshell (Omarchy shell) · ROG Flow X13
GV302XA · kernel 7.2.3
## Suggested fix
Either bundle a `claude` icon (the agents plugin already ships
`plugins/agents/assets/claude.svg`), or make the slot also hide when the image
resolves but fails to paint (treat `status === Image.Ready && !sourceSize`/null
paint like `Error`), so *any* unresolvable/unrenderable `app_icon` collapses the
slot instead of showing the placeholder.
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 11:19 UTC