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

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

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

Clicking a Chromium web-app notification focuses the browser window, not the sending web apprevision 1 · captured 2026-09-28 21:29 UTC via poll

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:

windowclassmatches /Chromium/i
browser (ws 1)chromiumyes — always selected
Teams (ws 4)chrome-teams.microsoft.com__-Defaultno
Gmail (ws 5)chrome-mail.google.com__-Defaultno
YouTube Musicchrome-music.youtube.com__-Defaultno

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:
   notify-send -a "Chromium" -u critical -t 120000 "CLICK-TEST" "Click me"
  1. 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:
  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.

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