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

omarchy.active-window shows the focused window's title on every monitor's bar

Reported by krys-anto · filed Sep 7, 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

omarchy.active-window shows the focused window's title on every monitor's barrevision 1 · captured 2026-09-28 21:23 UTC via poll

Problem

omarchy.active-window prints the focused window's title on every monitor's bar. On a
multi-monitor setup each bar names a window that only exists on one of them, so the title is
wrong on every screen except the one that actually holds the focused window.

There is no setting for this — the widget has to be replaced to get correct behaviour.

Root cause

shell/plugins/bar/widgets/ActiveWindow.qml:12:

readonly property var toplevel: ToplevelManager.activeToplevel

ToplevelManager.activeToplevel is the compositor-global focused toplevel from the Wayland
foreign-toplevel protocol. Bar.qml builds one bar surface per monitor:

Variants {
  model: Quickshell.screens
  ...
}

Every surface therefore renders the same global value. The widget has no notion of which
output it is drawn on.

Steps to reproduce

  1. Two monitors, a window on each.
  2. Focus a window on monitor A.
  3. Monitor B's bar shows monitor A's window title.

Suggested fix

Compare the bar surface's own output against the focused window's monitor and render only on
the match:

  • the surface's screen: root.QsWindow.window.screen.name
  • the window's monitor: Hyprland's toplevel list carries it, the Wayland handle does not, so

match the two by object identity:

readonly property string toplevelScreenName: {
  if (!root.toplevel) return ""
  var values = Hyprland.toplevels.values
  for (var i = 0; i < values.length; i++) {
    if (values[i].wayland === root.toplevel)
      return values[i].monitor ? String(values[i].monitor.name || "") : ""
  }
  return ""
}

Then gate visible on screenName === toplevelScreenName. Reporting implicitWidth: 0 when
hidden lets the bar slot collapse rather than sit empty.

I have this running locally and it behaves correctly on both outputs. Happy to open a PR if
the approach looks right.

Related but distinct

There are open PRs fixing the same class of bug in the workspaces widget —
#8997, #8435 and #7243 all deal with omarchy.workspaces using global rather than
per-monitor state. This is the sibling bug in omarchy.active-window, which none of them
touch, and I could not find an existing report for it.

System

omarchy          4.0.2-1
quickshell       0.3.1-1
qt6-declarative  6.11.2-1
hyprland         0.56.2-1
monitors         HDMI-A-1 1920x1080@60, DP-1 1920x1080@60
View raw text
## Problem

`omarchy.active-window` prints the focused window's title on **every** monitor's bar. On a
multi-monitor setup each bar names a window that only exists on one of them, so the title is
wrong on every screen except the one that actually holds the focused window.

There is no setting for this — the widget has to be replaced to get correct behaviour.

## Root cause

`shell/plugins/bar/widgets/ActiveWindow.qml:12`:

```qml
readonly property var toplevel: ToplevelManager.activeToplevel
```

`ToplevelManager.activeToplevel` is the compositor-global focused toplevel from the Wayland
foreign-toplevel protocol. `Bar.qml` builds one bar surface per monitor:

```qml
Variants {
  model: Quickshell.screens
  ...
}
```

Every surface therefore renders the same global value. The widget has no notion of which
output it is drawn on.

## Steps to reproduce

1. Two monitors, a window on each.
2. Focus a window on monitor A.
3. Monitor B's bar shows monitor A's window title.

## Suggested fix

Compare the bar surface's own output against the focused window's monitor and render only on
the match:

- the surface's screen: `root.QsWindow.window.screen.name`
- the window's monitor: Hyprland's toplevel list carries it, the Wayland handle does not, so
  match the two by object identity:

```qml
readonly property string toplevelScreenName: {
  if (!root.toplevel) return ""
  var values = Hyprland.toplevels.values
  for (var i = 0; i < values.length; i++) {
    if (values[i].wayland === root.toplevel)
      return values[i].monitor ? String(values[i].monitor.name || "") : ""
  }
  return ""
}
```

Then gate `visible` on `screenName === toplevelScreenName`. Reporting `implicitWidth: 0` when
hidden lets the bar slot collapse rather than sit empty.

I have this running locally and it behaves correctly on both outputs. Happy to open a PR if
the approach looks right.

## Related but distinct

There are open PRs fixing the same *class* of bug in the **workspaces** widget —
#8997, #8435 and #7243 all deal with `omarchy.workspaces` using global rather than
per-monitor state. This is the sibling bug in `omarchy.active-window`, which none of them
touch, and I could not find an existing report for it.

## System

```
omarchy          4.0.2-1
quickshell       0.3.1-1
qt6-declarative  6.11.2-1
hyprland         0.56.2-1
monitors         HDMI-A-1 1920x1080@60, DP-1 1920x1080@60
```

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:02 UTC