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

Notification toasts render on every connected monitor; the notifications plugin has no focused-monitor gate

Reported by EduardsSk · 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

Notification toasts render on every connected monitor; the notifications plugin has no focused-monitor gaterevision 1 · captured 2026-09-28 21:29 UTC via poll

Every notification toast is drawn simultaneously on all connected monitors, so a four-monitor desktop shows four copies of each one. Only the copy on the monitor being looked at is useful; the rest are duplicates competing for attention in the periphery.

There is no setting for this. The notifications plugin reads exactly one value from user config — barPosition (shell/plugins/notifications/Service.qml:48) — so no shell.json key changes the behaviour.

Cause

shell/plugins/notifications/Service.qml:951-955 instantiates one PanelWindow per output and gates visibility only on the popup model being non-empty:

Variants {
  model: Quickshell.screens

  PanelWindow {
    id: popupWindow
    required property var modelData
    screen: modelData
    visible: popupModel.count > 0

Quickshell.screens is every connected output, so every output satisfies visible at once.

Suggested fix

The shell already resolves the focused output — shell/plugins/bar/Bar.qml:490-493:

function focusedScreenName() {
  var monitor = Hyprland.focusedMonitor
  return monitor ? String(monitor.name || "") : ""
}

Gating the popup window on the same value confines toasts to the focused monitor while keeping the Variants shape, so hotplug still works:

readonly property string focusedScreenName:
  Hyprland.focusedMonitor ? String(Hyprland.focusedMonitor.name || "") : ""
readonly property bool onFocusedScreen:
  focusedScreenName === "" || String(modelData.name || "") === focusedScreenName

visible: popupModel.count > 0 && onFocusedScreen

Service.qml needs import Quickshell.Hyprland. The empty-name case falls back to showing on all outputs rather than none — if the compositor reports no focused monitor, duplicated beats invisible.

I have been running exactly this for a few hours on four outputs (1 internal + 3 DP) with no issues: toasts follow focus, hotplug still works, and the history panel is unaffected.

Two details are a maintainer's call rather than mine:

  • Whether this should be configurable instead of changed outright. Some multi-monitor users may prefer duplicates for notifications they must not miss. A notifications.followFocus key defaulting to today's behaviour would be conservative; defaulting to focus-only matches what most single-user desktops seem to want.
  • Whether "focused monitor" is the right anchor versus the monitor holding the pointer. They differ when focus follows the keyboard rather than the mouse.

Workaround for anyone hitting this now

omarchy-plugin-clone omarchy.notifications produces an editable copy under ~/.config/omarchy/plugins/ and rewires shell.json automatically; apply the change above to the clone and run omarchy-restart-shell. This works well — worth knowing that omarchy-refresh-shell is not the command to use afterwards, since it replaces shell.json with the default and drops plugins[] / disabledPlugins[] / cloneSourceRestores[] (it does write a timestamped backup first).

Environment

  • Omarchy 4.0.0-1, stable channel
  • Hyprland 0.56.2-1 (efb5099)
  • quickshell-git 0.3.0.r20.g28771c7-1
  • Dell XPS 15 9520, Arch, four outputs (1 internal + 3 DP)

Reproduce

  1. Attach two or more monitors.
  2. notify-send "test" "body".
  3. The toast appears on every monitor at once.
View raw text
Every notification toast is drawn simultaneously on all connected monitors, so a four-monitor desktop shows four copies of each one. Only the copy on the monitor being looked at is useful; the rest are duplicates competing for attention in the periphery.

There is no setting for this. The notifications plugin reads exactly one value from user config — `barPosition` (`shell/plugins/notifications/Service.qml:48`) — so no `shell.json` key changes the behaviour.

## Cause

`shell/plugins/notifications/Service.qml:951-955` instantiates one `PanelWindow` per output and gates visibility only on the popup model being non-empty:

```qml
Variants {
  model: Quickshell.screens

  PanelWindow {
    id: popupWindow
    required property var modelData
    screen: modelData
    visible: popupModel.count > 0
```

`Quickshell.screens` is every connected output, so every output satisfies `visible` at once.

## Suggested fix

The shell already resolves the focused output — `shell/plugins/bar/Bar.qml:490-493`:

```qml
function focusedScreenName() {
  var monitor = Hyprland.focusedMonitor
  return monitor ? String(monitor.name || "") : ""
}
```

Gating the popup window on the same value confines toasts to the focused monitor while keeping the `Variants` shape, so hotplug still works:

```qml
readonly property string focusedScreenName:
  Hyprland.focusedMonitor ? String(Hyprland.focusedMonitor.name || "") : ""
readonly property bool onFocusedScreen:
  focusedScreenName === "" || String(modelData.name || "") === focusedScreenName

visible: popupModel.count > 0 && onFocusedScreen
```

`Service.qml` needs `import Quickshell.Hyprland`. The empty-name case falls back to showing on all outputs rather than none — if the compositor reports no focused monitor, duplicated beats invisible.

I have been running exactly this for a few hours on four outputs (1 internal + 3 DP) with no issues: toasts follow focus, hotplug still works, and the history panel is unaffected.

Two details are a maintainer's call rather than mine:

- **Whether this should be configurable instead of changed outright.** Some multi-monitor users may prefer duplicates for notifications they must not miss. A `notifications.followFocus` key defaulting to today's behaviour would be conservative; defaulting to focus-only matches what most single-user desktops seem to want.
- **Whether "focused monitor" is the right anchor** versus the monitor holding the pointer. They differ when focus follows the keyboard rather than the mouse.

## Workaround for anyone hitting this now

`omarchy-plugin-clone omarchy.notifications` produces an editable copy under `~/.config/omarchy/plugins/` and rewires `shell.json` automatically; apply the change above to the clone and run `omarchy-restart-shell`. This works well — worth knowing that `omarchy-refresh-shell` is not the command to use afterwards, since it replaces `shell.json` with the default and drops `plugins[]` / `disabledPlugins[]` / `cloneSourceRestores[]` (it does write a timestamped backup first).

## Environment

- Omarchy `4.0.0-1`, `stable` channel
- Hyprland `0.56.2-1` (`efb5099`)
- `quickshell-git 0.3.0.r20.g28771c7-1`
- Dell XPS 15 9520, Arch, four outputs (1 internal + 3 DP)

## Reproduce

1. Attach two or more monitors.
2. `notify-send "test" "body"`.
3. The toast appears on every monitor at once.

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/9928· 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:30 UTC