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.
omarchy-hyprland-monitor-scaling persists one shared scale across all displays
Reported by Kashfy · filed Aug 24, 2026Closed upstream on 2026-08-24 by its own reporter Kashfy. GitHub close reason: completed. Closed by its own reporter — not by itself evidence of a fix.
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
System details
AMD Ryzen 7 7800X3D, NVIDIA RTX 5070 Ti, Omarchy 4.0.0.alpha, Hyprland 0.56.2. Two external displays, no internal panel: Apple Studio Display (5K) and LG UltraGear 32" (4K).
What's wrong?
set_scale in bin/omarchy-hyprland-monitor-scaling applies the new scale to the focused monitor correctly at runtime via hyprctl eval. Persistence is where it goes wrong, in two different ways depending on how monitors.lua looks.
Case 1 — stock `monitors.lua`, two displays with different DPI.
The runtime hyprctl eval correctly targets only the focused monitor, but persistence writes a single value:
sed -i -E -e "s|^local omarchy_monitor_scale = .*|local omarchy_monitor_scale = ${new_scale}|"or, in the elif branch, rewrites the output = "" catch-all. Both are single-valued and apply to every display. So scaling one monitor looks correct until the next hyprctl reload — hotplug, a monitor toggle, anything — at which point both displays snap to the last-set scale.
Steps to recreate:
- Two connected displays that want different scales (here 5K at 3.2, 4K at 2), with stock
monitors.lua. - Focus display A,
SUPER+/to change its scale. Looks right. - Trigger any
hyprctl reload— replug a monitor, or letomarchy-hyprland-monitor-watchfire. - Display B is now also at A's scale.
Case 2 — `monitors.lua` customized with explicit per-display entries.
Both grep guards fail, so nothing is persisted at all and the scale silently reverts on the next reload. This may be intentional — the comment says "Persist to monitors.lua if the user still has Omarchy's generic catch-all defaults" — but the effect is that once a user configures displays individually, SUPER+/ becomes runtime-only with no indication of why.
There is also a sharp edge worth noting: the elif guard matches the catch-all only in its exact single-line form. Reformatting that block across multiple lines silently changes persistence behavior, with nothing to indicate it.
Suggested direction
Persist per-display rather than globally, keyed on monitor description since DP-1/DP-2 swap across hotplugs, and fall back to the current single-value behavior only when the config really is untouched.
I have a working local implementation, though it imposes a local <name>_scale = <number> convention on monitors.lua that you probably would not want to require. Happy to adapt it into a PR if the approach is of interest, or to leave this as a report.
View raw text
### System details
AMD Ryzen 7 7800X3D, NVIDIA RTX 5070 Ti, Omarchy 4.0.0.alpha, Hyprland 0.56.2. Two external displays, no internal panel: Apple Studio Display (5K) and LG UltraGear 32" (4K).
### What's wrong?
`set_scale` in `bin/omarchy-hyprland-monitor-scaling` applies the new scale to the focused monitor correctly at runtime via `hyprctl eval`. Persistence is where it goes wrong, in two different ways depending on how `monitors.lua` looks.
**Case 1 — stock `monitors.lua`, two displays with different DPI.**
The runtime `hyprctl eval` correctly targets only the focused monitor, but persistence writes a single value:
```bash
sed -i -E -e "s|^local omarchy_monitor_scale = .*|local omarchy_monitor_scale = ${new_scale}|"
```
or, in the `elif` branch, rewrites the `output = ""` catch-all. Both are single-valued and apply to every display. So scaling one monitor looks correct until the next `hyprctl reload` — hotplug, a monitor toggle, anything — at which point both displays snap to the last-set scale.
Steps to recreate:
1. Two connected displays that want different scales (here 5K at 3.2, 4K at 2), with stock `monitors.lua`.
2. Focus display A, `SUPER+/` to change its scale. Looks right.
3. Trigger any `hyprctl reload` — replug a monitor, or let `omarchy-hyprland-monitor-watch` fire.
4. Display B is now also at A's scale.
**Case 2 — `monitors.lua` customized with explicit per-display entries.**
Both `grep` guards fail, so nothing is persisted at all and the scale silently reverts on the next reload. This may be intentional — the comment says "Persist to monitors.lua if the user still has Omarchy's generic catch-all defaults" — but the effect is that once a user configures displays individually, `SUPER+/` becomes runtime-only with no indication of why.
There is also a sharp edge worth noting: the `elif` guard matches the catch-all only in its exact single-line form. Reformatting that block across multiple lines silently changes persistence behavior, with nothing to indicate it.
### Suggested direction
Persist per-display rather than globally, keyed on monitor description since `DP-1`/`DP-2` swap across hotplugs, and fall back to the current single-value behavior only when the config really is untouched.
I have a working local implementation, though it imposes a `local <name>_scale = <number>` convention on `monitors.lua` that you probably would not want to require. Happy to adapt it into a PR if the approach is of interest, or to leave this as a report.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.