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

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).

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

Notification card shows Qt broken-image placeholder box for unresolvable app_icon (e.g. Claude Code's 'claude')revision 1 · captured 2026-09-28 21:23 UTC via poll

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.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.

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