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.
Internal monitor scale reverts to 2 when monitors.lua has multi-line hl.monitor({...}) entries
Reported by retr8-101 · filed Aug 26, 2026Closed upstream on 2026-10-09 by the bot omarchybot, as a duplicate (target not recorded).
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
Internal monitor scale keeps reverting to 2 when monitors.lua has multi-line hl.monitor({...}) entries
What happened
With a laptop + one external monitor connected, the internal panel's scale
keeps snapping back to 2 every few seconds — even after setting it via the
quickshell monitor panel widget (Super, monitor icon) or manually reloading.
It happens continuously with no user action, roughly every 2 seconds.
Expected behavior
The internal monitor's scale should stay at whatever is configured in~/.config/hypr/monitors.lua while docked with an external monitor active.
Root cause
/usr/share/omarchy/bin/omarchy-hyprland-monitor-clamshell runssync_internal_scale on a 2-second poll (poll_clamshell_state, started
whenever omarchy-hw-laptop && omarchy-hyprland-monitor-external-active) to
keep the internal panel's scale in sync with monitors.lua.
It reads the desired scale with configured_monitor_scale →configured_monitor_value, which greps monitors.lua with a line-anchored
regex:
monitor_rule_regex() {
printf '^[[:space:]]*hl\\.monitor\\(\\{.*output[[:space:]]*=[[:space:]]*"%s"' "$1"
}This only matches when hl.monitor({ and output = "<name>" appear on the
same line. But nwg-displays (a common third-party tool for configuring
Hyprland monitor layout, since Omarchy has no built-in GUI for this) writes
each monitor as a multi-line block:
hl.monitor({
output = "eDP-1",
mode = "[email protected]",
position = "1536x0",
scale = 1.25
})Against that shape, configured_monitor_value finds no match, soconfigured_monitor_scale falls through every fallback (catch-all rule,omarchy_monitor_scale local) and read_monitor_scale hits its final
hardcoded default:
read_monitor_scale() {
...
echo 2
}Every ~2 seconds, the poll compares this bogus "desired" value (2) against
the actual live scale, sees a mismatch, and callshyprctl eval "hl.monitor({ output = \"$INTERNAL\", ... scale = 2 })" to
"fix" it — permanently fighting any other scale you set.
Steps to reproduce
- On a laptop with an external monitor, run
nwg-displays, arrange
monitors, set internal panel scale to something other than 2 (e.g.
1.25), and save.
2. Confirm ~/.config/hypr/monitors.lua now has multi-line hl.monitor({...})
blocks (this is nwg-displays' default output format).
3. hyprctl reload, then watch hyprctl monitors | grep scale for the
internal output over the next ~5-10 seconds.
4. Scale reverts to 2 on its own, with no user action.
Confirmed by the change-audit log at~/.local/state/omarchy/monitor-scaling.log, which shows current=2 on
every widget-driven correction, moments after scale had already been set
correctly.
Workaround
Manually collapse each hl.monitor({...}) block in monitors.lua to a
single line so the regex can match it. This holds until the file is
re-saved by a tool that reformats it back to multi-line (e.g. re-saving from
nwg-displays).
Suggested fix
Make configured_monitor_value/monitor_rules tolerant of multi-linehl.monitor({...}) tables (e.g. join the file into one logical stream per
table before matching), since multi-line output is the default/common style
from tools like nwg-displays, not just hand-edited files.
System info
- Omarchy: 4.0.0-1
- Hyprland: 0.56.2-1
- Kernel:
7.1.8-arch1-3 - GPU: NVIDIA GeForce GTX 1050 Max-Q (hybrid, AMD Vega iGPU also present)
- Laptop internal panel: eDP-1, 1920x1080, BOE panel
- External monitor: Lenovo S24e-20, HDMI-A-1, 1920x1080
View raw text
# Internal monitor scale keeps reverting to 2 when monitors.lua has multi-line `hl.monitor({...})` entries
## What happened
With a laptop + one external monitor connected, the internal panel's scale
keeps snapping back to `2` every few seconds — even after setting it via the
quickshell monitor panel widget (Super, monitor icon) or manually reloading.
It happens continuously with no user action, roughly every 2 seconds.
## Expected behavior
The internal monitor's scale should stay at whatever is configured in
`~/.config/hypr/monitors.lua` while docked with an external monitor active.
## Root cause
`/usr/share/omarchy/bin/omarchy-hyprland-monitor-clamshell` runs
`sync_internal_scale` on a 2-second poll (`poll_clamshell_state`, started
whenever `omarchy-hw-laptop && omarchy-hyprland-monitor-external-active`) to
keep the internal panel's scale in sync with `monitors.lua`.
It reads the desired scale with `configured_monitor_scale` →
`configured_monitor_value`, which greps `monitors.lua` with a **line-anchored**
regex:
```bash
monitor_rule_regex() {
printf '^[[:space:]]*hl\\.monitor\\(\\{.*output[[:space:]]*=[[:space:]]*"%s"' "$1"
}
```
This only matches when `hl.monitor({` and `output = "<name>"` appear on the
**same line**. But `nwg-displays` (a common third-party tool for configuring
Hyprland monitor layout, since Omarchy has no built-in GUI for this) writes
each monitor as a multi-line block:
```lua
hl.monitor({
output = "eDP-1",
mode = "[email protected]",
position = "1536x0",
scale = 1.25
})
```
Against that shape, `configured_monitor_value` finds no match, so
`configured_monitor_scale` falls through every fallback (catch-all rule,
`omarchy_monitor_scale` local) and `read_monitor_scale` hits its final
hardcoded default:
```bash
read_monitor_scale() {
...
echo 2
}
```
Every ~2 seconds, the poll compares this bogus "desired" value (`2`) against
the actual live scale, sees a mismatch, and calls
`hyprctl eval "hl.monitor({ output = \"$INTERNAL\", ... scale = 2 })"` to
"fix" it — permanently fighting any other scale you set.
## Steps to reproduce
1. On a laptop with an external monitor, run `nwg-displays`, arrange
monitors, set internal panel scale to something other than `2` (e.g.
`1.25`), and save.
2. Confirm `~/.config/hypr/monitors.lua` now has multi-line `hl.monitor({...})`
blocks (this is nwg-displays' default output format).
3. `hyprctl reload`, then watch `hyprctl monitors | grep scale` for the
internal output over the next ~5-10 seconds.
4. Scale reverts to `2` on its own, with no user action.
Confirmed by the change-audit log at
`~/.local/state/omarchy/monitor-scaling.log`, which shows `current=2` on
every widget-driven correction, moments after scale had already been set
correctly.
## Workaround
Manually collapse each `hl.monitor({...})` block in `monitors.lua` to a
single line so the regex can match it. This holds until the file is
re-saved by a tool that reformats it back to multi-line (e.g. re-saving from
nwg-displays).
## Suggested fix
Make `configured_monitor_value`/`monitor_rules` tolerant of multi-line
`hl.monitor({...})` tables (e.g. join the file into one logical stream per
table before matching), since multi-line output is the default/common style
from tools like nwg-displays, not just hand-edited files.
## System info
- Omarchy: 4.0.0-1
- Hyprland: 0.56.2-1
- Kernel: `7.1.8-arch1-3`
- GPU: NVIDIA GeForce GTX 1050 Max-Q (hybrid, AMD Vega iGPU also present)
- Laptop internal panel: eDP-1, 1920x1080, BOE panel
- External monitor: Lenovo S24e-20, HDMI-A-1, 1920x1080
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
- Fixed bypr/7146· confirmed
- Fixed bypr/14583· 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.
No decision has been recorded yet.