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.
Clicking a Chromium web-app notification focuses the browser window, not the sending web app
Reported by vmarcinko · filed Aug 17, 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
System details
AMD Ryzen 7 255 w/ Radeon 780M (HawkPoint1), Omarchy 4.0.0-1, Hyprland v0.56.2, quickshell-git 0.3.0.r20.g28771c7-1, chromium 151.0.7922.137-1
What's wrong?
Clicking a notification from a Chromium web app focuses the plain browser window instead of the web app that sent it.
Chromium sends every web-app notification with app_name = "Chromium", regardless of which web app produced it. The originating site appears only inside the body text:
{"id":50,"app":"Chromium","summary":"Some Team Channel",
"body":"<a href=\"https://teams.microsoft.com/\">teams.microsoft.com</a>\n\nSender Name: message text here",
"exec":"","urgency":2,"expireTimeout":0}(shape of a real entry from ~/.local/state/omarchy/notifications/history/, with the channel name, sender and message text replaced by placeholders)
Chromium does not register a "default" libnotify action for these, so invokePopupDefault() in plugins/notifications/Service.qml takes the if (!invoked) focusApp(entry) fallback at line 394. That calls omarchy-hyprland-focus-app "Chromium", which regex-matches the app name against window classes and takes the first hit. With several Chromium web apps open, the plain browser window always wins:
| window | class | matches /Chromium/i |
|---|---|---|
| browser (ws 1) | chromium | yes — always selected |
| Teams (ws 4) | chrome-teams.microsoft.com__-Default | no |
| Gmail (ws 5) | chrome-mail.google.com__-Default | no |
| YouTube Music | chrome-music.youtube.com__-Default | no |
All of these are one Chromium process, so the notification carries nothing to distinguish them by app name alone.
Steps to reproduce
- Open a Chromium web app via
omarchy-launch-webapp(e.g. Microsoft Teams) and put it on another workspace, plus a normal Chromium browser window. - Simulate what Chromium sends — an app name of
Chromiumand no actions:
notify-send -a "Chromium" -u critical -t 120000 "CLICK-TEST" "Click me"- Click the toast.
Expected: focus the web-app window that sent the notification.
Actual: focus moves to the plain browser window (class: chromium).
Verified with hyprctl activewindow polling (FOCUS: chromium | ws 1 at the moment of the click) and with dbus-monitor --session "interface='org.freedesktop.Notifications'", which shows only NotificationClosed and no `ActionInvoked` — confirming the focusApp fallback runs rather than an app-side action.
Real Teams notifications behave the same way, which makes click-to-jump unusable for chat web apps — the case the fallback was added for.
Suggested fix
The origin host in the body is exactly the substring Chromium puts in the web-app window class (chrome-<host>__-Default), so it can be used as a stronger match than the app name. Roughly:
Service.qml— for senders whose app name ischromium/chrome, extract the origin from the body and pass it to the helper as a class hint:
function originHint(entry) {
if (!entry) return ""
if (!/^chrom(e|ium)$/i.test(String(entry.app || "").trim())) return ""
var match = /https?:\/\/([^\/"'\s<>]+)/.exec(String(entry.body || ""))
return match ? match[1] : ""
}omarchy-hyprland-focus-app— accept an optional second argument and try it against.classbefore the app name:
jq -r --arg pattern "$app" --arg hint "$hint" \
'def matches($p; $value): ($p // "") != "" and (($value // "") | test($p; "i"));
first(
(.[] | select(matches($hint; .class))),
(.[] | select(matches($pattern; .class))),
(.[] | select(.initialClass == "org.omarchy.agent" and matches($pattern; .initialTitle)))
).address // empty'Applying the hint even when a "default" action was invoked may be worthwhile too, since Chromium's own self-activation does not reliably raise the web-app window under Hyprland.
I can attach an omarchy debug log if useful — happy to add one on request.
View raw text
### System details
AMD Ryzen 7 255 w/ Radeon 780M (HawkPoint1), Omarchy 4.0.0-1, Hyprland v0.56.2, quickshell-git 0.3.0.r20.g28771c7-1, chromium 151.0.7922.137-1
### What's wrong?
**Clicking a notification from a Chromium web app focuses the plain browser window instead of the web app that sent it.**
Chromium sends every web-app notification with `app_name = "Chromium"`, regardless of which web app produced it. The originating site appears only inside the body text:
```json
{"id":50,"app":"Chromium","summary":"Some Team Channel",
"body":"<a href=\"https://teams.microsoft.com/\">teams.microsoft.com</a>\n\nSender Name: message text here",
"exec":"","urgency":2,"expireTimeout":0}
```
(shape of a real entry from `~/.local/state/omarchy/notifications/history/`, with the channel name, sender and message text replaced by placeholders)
Chromium does not register a `"default"` libnotify action for these, so `invokePopupDefault()` in `plugins/notifications/Service.qml` takes the `if (!invoked) focusApp(entry)` fallback at line 394. That calls `omarchy-hyprland-focus-app "Chromium"`, which regex-matches the app name against window **classes** and takes the first hit. With several Chromium web apps open, the plain browser window always wins:
| window | class | matches `/Chromium/i` |
|---|---|---|
| browser (ws 1) | `chromium` | yes — always selected |
| Teams (ws 4) | `chrome-teams.microsoft.com__-Default` | no |
| Gmail (ws 5) | `chrome-mail.google.com__-Default` | no |
| YouTube Music | `chrome-music.youtube.com__-Default` | no |
All of these are one Chromium process, so the notification carries nothing to distinguish them by app name alone.
### Steps to reproduce
1. Open a Chromium web app via `omarchy-launch-webapp` (e.g. Microsoft Teams) and put it on another workspace, plus a normal Chromium browser window.
2. Simulate what Chromium sends — an app name of `Chromium` and no actions:
```bash
notify-send -a "Chromium" -u critical -t 120000 "CLICK-TEST" "Click me"
```
3. Click the toast.
**Expected:** focus the web-app window that sent the notification.
**Actual:** focus moves to the plain browser window (`class: chromium`).
Verified with `hyprctl activewindow` polling (`FOCUS: chromium | ws 1` at the moment of the click) and with `dbus-monitor --session "interface='org.freedesktop.Notifications'"`, which shows only `NotificationClosed` and **no `ActionInvoked`** — confirming the `focusApp` fallback runs rather than an app-side action.
Real Teams notifications behave the same way, which makes click-to-jump unusable for chat web apps — the case the fallback was added for.
### Suggested fix
The origin host in the body is exactly the substring Chromium puts in the web-app window class (`chrome-<host>__-Default`), so it can be used as a stronger match than the app name. Roughly:
- `Service.qml` — for senders whose app name is `chromium`/`chrome`, extract the origin from the body and pass it to the helper as a class hint:
```js
function originHint(entry) {
if (!entry) return ""
if (!/^chrom(e|ium)$/i.test(String(entry.app || "").trim())) return ""
var match = /https?:\/\/([^\/"'\s<>]+)/.exec(String(entry.body || ""))
return match ? match[1] : ""
}
```
- `omarchy-hyprland-focus-app` — accept an optional second argument and try it against `.class` before the app name:
```
jq -r --arg pattern "$app" --arg hint "$hint" \
'def matches($p; $value): ($p // "") != "" and (($value // "") | test($p; "i"));
first(
(.[] | select(matches($hint; .class))),
(.[] | select(matches($pattern; .class))),
(.[] | select(.initialClass == "org.omarchy.agent" and matches($pattern; .initialTitle)))
).address // empty'
```
Applying the hint even when a `"default"` action *was* invoked may be worthwhile too, since Chromium's own self-activation does not reliably raise the web-app window under Hyprland.
I can attach an `omarchy debug` log if useful — happy to add one on request.
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/14441· 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 04:32 UTC