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

omarchy-hyprland-monitor-scaling: scale reverts instantly, monitors get rearranged, and sed -i destroys a symlinked monitors.lua

Reported by FCygan · filed Aug 20, 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-hyprland-monitor-scaling: scale reverts instantly, monitors get rearranged, and sed -i destroys a symlinked monitors.luarevision 1 · captured 2026-09-28 21:29 UTC via poll

Summary

omarchy-hyprland-monitor-scaling — used by the Display panel's SCALE buttons and by SUPER + SLASH / SUPER + ALT + SLASH — misbehaves in three separate ways on a multi-monitor setup where monitors.lua pins per-output scales and positions. Together they make the scale buttons appear to do nothing while silently damaging the user's config.

The command assumes monitors.lua still holds Omarchy's generic catch-all defaults. When it holds explicit per-output hl.monitor() lines instead — which is what the shipped comments in monitors.lua invite you to write — every part of it goes wrong.

Environment

  • Omarchy 4.0.0-1
  • Hyprland 0.56.2
  • AMD Ryzen 9 9950X3D, NVIDIA RTX 5080
  • Two monitors, per-output scales and pinned positions:
hl.monitor({ output = "DP-3", mode = "3840x2160@240", position = "0x0", scale = 1.333334 })
hl.monitor({ output = "DP-2", mode = "2560x1440@144", position = "-2560x200", scale = 1 })

Defect 1 — sed -i destroys a symlinked monitors.lua

set_scale() persists with:

sed -i -E -e "s|^local omarchy_monitor_scale = .*|...|" "$monitor_lua"

GNU sed -i without --follow-symlinks writes a new file and renames it over the target, replacing the symlink with a regular file.

Anyone managing dotfiles with GNU Stow (or any symlink-based manager) has ~/.config/hypr/monitors.lua as a symlink into their repo. The first scale-button click breaks that link permanently and silently. The repo stops driving the config, and nothing surfaces the change — in my case it went unnoticed for four days, and was only found while investigating Defect 2.

Repro

mv ~/.config/hypr/monitors.lua ~/dotfiles/monitors.lua
ln -s ~/dotfiles/monitors.lua ~/.config/hypr/monitors.lua
ls -l ~/.config/hypr/monitors.lua          # symlink
# click any SCALE button in the Display panel
ls -l ~/.config/hypr/monitors.lua          # now a regular file

Fix: sed -i --follow-symlinks, or resolve with readlink -f before writing.

This one is worth fixing regardless of the rest — it is silent data loss for a common setup.

Defect 2 — persistence writes one global scale, so the change reverts instantly

set_scale() only ever rewrites local omarchy_monitor_scale (or the output = "" catch-all line). Both feed the generic catch-all rule. An explicit per-output hl.monitor() line later in the file overrides it, so:

  1. hyprctl eval applies the new scale — this part works;
  2. sed -i writes the global variable, which is not what governs this output;
  3. the write trips Hyprland's autoreload, which re-applies the per-output line and reverts the scale within milliseconds.

Net effect: the buttons look completely inert. Nothing in the UI indicates a change was attempted, applied, and undone.

~/.local/state/omarchy/monitor-scaling.log shows the fingerprint clearly — every entry records the same current=, even for clicks seconds apart:

at=...T12:20:07 requested=1.25 current=1.3333334 new=1.25 monitor=DP-3
at=...T12:20:19 requested=4    current=1.3333334 new=4    monitor=DP-3

Repro

  1. Put an explicit hl.monitor({ output = "<name>", ..., scale = 1.333334 }) line in monitors.lua.
  2. Focus that monitor, click any SCALE button.
  3. hyprctl monitors still reports the old scale.

Confirmed the two halves independently: an hyprctl eval of the same hl.monitor() call holds indefinitely on its own, and appending a single comment line to monitors.lua is enough to snap the scale back.

Defect 3 — position = "auto" rearranges the desktop

The runtime half hardcodes position = "auto":

hyprctl eval "hl.monitor({ output = \"$active_monitor\", mode = \"...\", position = \"auto\", scale = $new_scale })"

This discards the position from monitors.lua. Clicking a scale button moved my secondary display from -2560x200 (left of the primary, 200px lower) to 2400x0 — the opposite side of the desk, offset lost. 2400 is the primary's logical width at the newly chosen scale, so auto simply re-packed the outputs left-to-right.

Repro

  1. Pin two monitors at explicit non-default positions.
  2. Click any SCALE button.
  3. hyprctl monitors shows the outputs re-packed from the origin.

Fix: pass the monitor's current x/y rather than auto.

Suggested direction

Rewriting the scale = value on the focused output's own hl.monitor() line, then letting the autoreload apply the file, fixes all three at once — mode, position, scale and workspace rules are re-applied together, the layout cannot drift, and the change persists across reboots. On that path the hyprctl eval becomes unnecessary; it is only needed as a fallback for a monitor that has no line of its own, and even then it should pass the real position.

Falling back to the existing global-variable behaviour when no per-output line matches would keep current setups working unchanged.

I am happy to open a PR if this direction sounds right.

View raw text
## Summary

`omarchy-hyprland-monitor-scaling` — used by the Display panel's SCALE buttons and by `SUPER + SLASH` / `SUPER + ALT + SLASH` — misbehaves in three separate ways on a multi-monitor setup where `monitors.lua` pins per-output scales and positions. Together they make the scale buttons appear to do nothing while silently damaging the user's config.

The command assumes `monitors.lua` still holds Omarchy's generic catch-all defaults. When it holds explicit per-output `hl.monitor()` lines instead — which is what the shipped comments in `monitors.lua` invite you to write — every part of it goes wrong.

## Environment

- Omarchy 4.0.0-1
- Hyprland 0.56.2
- AMD Ryzen 9 9950X3D, NVIDIA RTX 5080
- Two monitors, per-output scales and pinned positions:

```lua
hl.monitor({ output = "DP-3", mode = "3840x2160@240", position = "0x0", scale = 1.333334 })
hl.monitor({ output = "DP-2", mode = "2560x1440@144", position = "-2560x200", scale = 1 })
```

## Defect 1 — `sed -i` destroys a symlinked `monitors.lua`

`set_scale()` persists with:

```bash
sed -i -E -e "s|^local omarchy_monitor_scale = .*|...|" "$monitor_lua"
```

GNU `sed -i` without `--follow-symlinks` writes a new file and renames it over the target, replacing the symlink with a regular file.

Anyone managing dotfiles with GNU Stow (or any symlink-based manager) has `~/.config/hypr/monitors.lua` as a symlink into their repo. The first scale-button click breaks that link permanently and silently. The repo stops driving the config, and nothing surfaces the change — in my case it went unnoticed for four days, and was only found while investigating Defect 2.

**Repro**

```bash
mv ~/.config/hypr/monitors.lua ~/dotfiles/monitors.lua
ln -s ~/dotfiles/monitors.lua ~/.config/hypr/monitors.lua
ls -l ~/.config/hypr/monitors.lua          # symlink
# click any SCALE button in the Display panel
ls -l ~/.config/hypr/monitors.lua          # now a regular file
```

**Fix:** `sed -i --follow-symlinks`, or resolve with `readlink -f` before writing.

This one is worth fixing regardless of the rest — it is silent data loss for a common setup.

## Defect 2 — persistence writes one global scale, so the change reverts instantly

`set_scale()` only ever rewrites `local omarchy_monitor_scale` (or the `output = ""` catch-all line). Both feed the generic catch-all rule. An explicit per-output `hl.monitor()` line later in the file overrides it, so:

1. `hyprctl eval` applies the new scale — this part works;
2. `sed -i` writes the global variable, which is not what governs this output;
3. the write trips Hyprland's autoreload, which re-applies the per-output line and reverts the scale within milliseconds.

Net effect: the buttons look completely inert. Nothing in the UI indicates a change was attempted, applied, and undone.

`~/.local/state/omarchy/monitor-scaling.log` shows the fingerprint clearly — every entry records the same `current=`, even for clicks seconds apart:

```
at=...T12:20:07 requested=1.25 current=1.3333334 new=1.25 monitor=DP-3
at=...T12:20:19 requested=4    current=1.3333334 new=4    monitor=DP-3
```

**Repro**

1. Put an explicit `hl.monitor({ output = "<name>", ..., scale = 1.333334 })` line in `monitors.lua`.
2. Focus that monitor, click any SCALE button.
3. `hyprctl monitors` still reports the old scale.

Confirmed the two halves independently: an `hyprctl eval` of the same `hl.monitor()` call holds indefinitely on its own, and appending a single comment line to `monitors.lua` is enough to snap the scale back.

## Defect 3 — `position = "auto"` rearranges the desktop

The runtime half hardcodes `position = "auto"`:

```bash
hyprctl eval "hl.monitor({ output = \"$active_monitor\", mode = \"...\", position = \"auto\", scale = $new_scale })"
```

This discards the position from `monitors.lua`. Clicking a scale button moved my secondary display from `-2560x200` (left of the primary, 200px lower) to `2400x0` — the opposite side of the desk, offset lost. `2400` is the primary's logical width at the newly chosen scale, so `auto` simply re-packed the outputs left-to-right.

**Repro**

1. Pin two monitors at explicit non-default positions.
2. Click any SCALE button.
3. `hyprctl monitors` shows the outputs re-packed from the origin.

**Fix:** pass the monitor's current `x`/`y` rather than `auto`.

## Suggested direction

Rewriting the `scale =` value on the focused output's own `hl.monitor()` line, then letting the autoreload apply the file, fixes all three at once — mode, position, scale and workspace rules are re-applied together, the layout cannot drift, and the change persists across reboots. On that path the `hyprctl eval` becomes unnecessary; it is only needed as a fallback for a monitor that has no line of its own, and even then it should pass the real position.

Falling back to the existing global-variable behaviour when no per-output line matches would keep current setups working unchanged.

I am happy to open a PR if this direction sounds right.

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/8982· 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 08:15 UTC