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-4558GitHub issuePublicReceived

Display mirroring immediately reverts to extended mode via auto-recovery daemon

Reported by setiapam · filed Aug 11, 2026Closed upstream on 2026-08-11 by dhh, as not planned.

Received and recorded verbatim. Nothing has been checked yet.

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?
Not yet mapped to any requirement or component.
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?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.

Original report

Display mirroring immediately reverts to extended mode via auto-recovery daemonrevision 1 · captured 2026-10-04 11:56 UTC via poll

System details

AMD Ryzen 7 5800H, GeForce RTX 3050 Mobile, Omarchy 4.0.0.r1645.g5edc349-1

What's wrong?

Summary

When toggling display mirroring using the default keybinding (SUPER + CTRL + ALT + Delete or omarchy-hyprland-monitor-internal-mirror toggle), Hyprland applies the mirror configuration, but Omarchy's monitor recovery daemon (omarchy-hyprland-monitor-watch / sync_clamshell) immediately reverts the display back to Extended Mode within seconds.

This happens because the background monitor check script (omarchy-hyprland-monitor-external-active) queries hyprctl monitors -j. In Hyprland, mirrored external outputs are omitted from hyprctl monitors -j (they are only listed in hyprctl monitors all -j). As a result, Omarchy incorrectly concludes that the external monitor was disconnected, triggering omarchy-hyprland-monitor-internal-mirror recover which deletes the mirror toggle file and forces extended mode.


Environment

  • Omarchy version: 4.0.0.r1645.g5edc349-1
  • Hyprland version: 0.56.2
  • Kernel: 7.1.7-arch1-1
  • GPU: NVIDIA GeForce RTX 3050 Mobile / AMD Cezanne [Radeon Vega Series] (Hybrid GPU)
  • Monitors:
  • Laptop internal: eDP-1 (1920x1080@144Hz)
  • External monitor: HDMI-A-1 (HP 24mh 1920x1080@60Hz)

Reproduction

  1. Connect an external monitor (e.g. HDMI-A-1).
  2. Press SUPER + CTRL + ALT + Delete (or run omarchy-hyprland-monitor-internal-mirror toggle in a terminal).
  3. The notification "Mirroring enabled (HDMI-A-1)" appears briefly.
  4. Within 1–3 seconds, the background watcher omarchy-hyprland-monitor-watch triggers omarchy-hyprland-monitor-clamshell, which calls omarchy-hyprland-monitor-internal-mirror recover.
  5. The display immediately reverts back to Extended Mode.

Evidence & Root Cause Analysis

1. Keybinding Execution

The shortcut runs /usr/share/omarchy/bin/omarchy-hyprland-monitor-internal-mirror toggle, which writes the toggle file:
~/.local/state/omarchy/toggles/hypr/internal-monitor-mirror.lua:

hl.monitor({ output = "HDMI-A-1", mode = "preferred", position = "auto", scale = 1, mirror = "eDP-1" })

and calls hyprctl reload.

2. Hyprland Behavior with Mirrored Displays

When HDMI-A-1 is set to mirror = "eDP-1", Hyprland removes HDMI-A-1 from the active standalone monitor list returned by hyprctl monitors -j.
HDMI-A-1 is only returned when calling hyprctl monitors all -j.

3. False Negative in External Monitor Detection

/usr/share/omarchy/bin/omarchy-hyprland-monitor-external-active currently executes:

hyprctl monitors -j | jq -e '.[] | select(.name | test("^(eDP|LVDS|DSI)-") | not) | select(.disabled == false)' >/dev/null 2>&1

Because HDMI-A-1 is absent from hyprctl monitors -j while mirrored, this script returns exit status 1 (External active: NO).

4. Auto-Recovery Execution

omarchy-hyprland-monitor-watch triggers sync_clamshell -> omarchy-hyprland-monitor-clamshell -> omarchy-hyprland-monitor-internal-mirror recover.
recover() evaluates:

if ! omarchy-hyprland-monitor-external-active && omarchy-hyprland-toggle-enabled $TOGGLE; then
  omarchy-hyprland-toggle $TOGGLE off
fi

Since omarchy-hyprland-monitor-external-active returned false, recover() assumes the external monitor was disconnected, deletes internal-monitor-mirror.lua, and restores Extended Mode.


Proposed Solution

Update /usr/share/omarchy/bin/omarchy-hyprland-monitor-external-active to query hyprctl monitors all -j instead of hyprctl monitors -j.

Patch

--- a/bin/omarchy-hyprland-monitor-external-active
+++ b/bin/omarchy-hyprland-monitor-external-active
@@ -3,4 +3,4 @@
 # omarchy:summary=Returns true when Hyprland has an active external monitor
 # omarchy:hidden=true

-hyprctl monitors -j | jq -e '.[] | select(.name | test("^(eDP|LVDS|DSI)-") | not) | select(.disabled == false)' >/dev/null 2>&1
+hyprctl monitors all -j | jq -e '.[] | select(.name | test("^(eDP|LVDS|DSI)-") | not) | select(.disabled == false)' >/dev/null 2>&1

Testing confirmed that hyprctl monitors all -j continues to report HDMI-A-1 with "disabled": false during active mirroring, preventing false auto-recover triggers.

View raw text
### System details

AMD Ryzen 7 5800H, GeForce RTX 3050 Mobile,  Omarchy 4.0.0.r1645.g5edc349-1

### What's wrong?

## Summary
When toggling display mirroring using the default keybinding (`SUPER + CTRL + ALT + Delete` or `omarchy-hyprland-monitor-internal-mirror toggle`), Hyprland applies the mirror configuration, but Omarchy's monitor recovery daemon (`omarchy-hyprland-monitor-watch` / `sync_clamshell`) immediately reverts the display back to Extended Mode within seconds.

This happens because the background monitor check script (`omarchy-hyprland-monitor-external-active`) queries `hyprctl monitors -j`. In Hyprland, mirrored external outputs are omitted from `hyprctl monitors -j` (they are only listed in `hyprctl monitors all -j`). As a result, Omarchy incorrectly concludes that the external monitor was disconnected, triggering `omarchy-hyprland-monitor-internal-mirror recover` which deletes the mirror toggle file and forces extended mode.

---

## Environment
- **Omarchy version**: `4.0.0.r1645.g5edc349-1`
- **Hyprland version**: `0.56.2`
- **Kernel**: `7.1.7-arch1-1`
- **GPU**: NVIDIA GeForce RTX 3050 Mobile / AMD Cezanne [Radeon Vega Series] (Hybrid GPU)
- **Monitors**:
  - Laptop internal: `eDP-1` (1920x1080@144Hz)
  - External monitor: `HDMI-A-1` (HP 24mh 1920x1080@60Hz)

---

## Reproduction
1. Connect an external monitor (e.g. `HDMI-A-1`).
2. Press `SUPER + CTRL + ALT + Delete` (or run `omarchy-hyprland-monitor-internal-mirror toggle` in a terminal).
3. The notification "Mirroring enabled (HDMI-A-1)" appears briefly.
4. Within 1–3 seconds, the background watcher `omarchy-hyprland-monitor-watch` triggers `omarchy-hyprland-monitor-clamshell`, which calls `omarchy-hyprland-monitor-internal-mirror recover`.
5. The display immediately reverts back to Extended Mode.

---

## Evidence & Root Cause Analysis

### 1. Keybinding Execution
The shortcut runs `/usr/share/omarchy/bin/omarchy-hyprland-monitor-internal-mirror toggle`, which writes the toggle file:
`~/.local/state/omarchy/toggles/hypr/internal-monitor-mirror.lua`:
```lua
hl.monitor({ output = "HDMI-A-1", mode = "preferred", position = "auto", scale = 1, mirror = "eDP-1" })
```
and calls `hyprctl reload`.

### 2. Hyprland Behavior with Mirrored Displays
When `HDMI-A-1` is set to `mirror = "eDP-1"`, Hyprland removes `HDMI-A-1` from the active standalone monitor list returned by `hyprctl monitors -j`.
`HDMI-A-1` is **only** returned when calling `hyprctl monitors all -j`.

### 3. False Negative in External Monitor Detection
`/usr/share/omarchy/bin/omarchy-hyprland-monitor-external-active` currently executes:
```bash
hyprctl monitors -j | jq -e '.[] | select(.name | test("^(eDP|LVDS|DSI)-") | not) | select(.disabled == false)' >/dev/null 2>&1
```
Because `HDMI-A-1` is absent from `hyprctl monitors -j` while mirrored, this script returns exit status `1` (`External active: NO`).

### 4. Auto-Recovery Execution
`omarchy-hyprland-monitor-watch` triggers `sync_clamshell` -> `omarchy-hyprland-monitor-clamshell` -> `omarchy-hyprland-monitor-internal-mirror recover`.
`recover()` evaluates:
```bash
if ! omarchy-hyprland-monitor-external-active && omarchy-hyprland-toggle-enabled $TOGGLE; then
  omarchy-hyprland-toggle $TOGGLE off
fi
```
Since `omarchy-hyprland-monitor-external-active` returned false, `recover()` assumes the external monitor was disconnected, deletes `internal-monitor-mirror.lua`, and restores Extended Mode.

---

## Proposed Solution

Update `/usr/share/omarchy/bin/omarchy-hyprland-monitor-external-active` to query `hyprctl monitors all -j` instead of `hyprctl monitors -j`.

### Patch
```diff
--- a/bin/omarchy-hyprland-monitor-external-active
+++ b/bin/omarchy-hyprland-monitor-external-active
@@ -3,4 +3,4 @@
 # omarchy:summary=Returns true when Hyprland has an active external monitor
 # omarchy:hidden=true

-hyprctl monitors -j | jq -e '.[] | select(.name | test("^(eDP|LVDS|DSI)-") | not) | select(.disabled == false)' >/dev/null 2>&1
+hyprctl monitors all -j | jq -e '.[] | select(.name | test("^(eDP|LVDS|DSI)-") | not) | select(.disabled == false)' >/dev/null 2>&1
```

Testing confirmed that `hyprctl monitors all -j` continues to report `HDMI-A-1` with `"disabled": false` during active mirroring, preventing false auto-recover triggers.

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.

No decision has been recorded yet.