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 toasts render on every connected monitor; the notifications plugin has no focused-monitor gate
Reported by EduardsSk · filed Aug 16, 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
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 > 0Quickshell.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 && onFocusedScreenService.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.followFocuskey 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,stablechannel - 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
- Attach two or more monitors.
notify-send "test" "body".- 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