Multi-monitor on Omarchy 4
What works and what breaks with multi-monitor setups on Omarchy 4.0.4: clamshell handling, per-monitor scaling, wake failures and the fixes that hold.
Multiple displays work out of the box on 4.0.4. Hyprland auto-arranges them and Omarchy handles lid close, mirroring and DDC brightness. The sore spots are per-monitor scaling and position, which a docked-laptop poller re-asserts from monitors.lua every two seconds, and displays that stay dark after idle wake. Edit ~/.config/hypr/monitors.lua with connector-name rules rather than the Display panel.
On this page
Status on 4.0.4
Two or more displays work on Omarchy 4.0.4 without any configuration. Hyprland detects each output, brings it up at its preferred mode and places it automatically, and the Quickshell bar appears on every monitor. This page was checked against the v4.0.4 source tree, the 4.0.0 through 4.0.4 release notes and open issues as of 2026-09-17.
The problems are not with getting a picture. They are with making a layout stay put, and with monitors that go dark after an idle cycle and never come back. The displays and multi-monitor component carries 1132 issues in the tracking data, and the 4.x ones cluster tightly on those two themes.
On 3.x you edited ~/.config/hypr/monitors.conf with monitor= lines. Since 4.0.0 that file is monitors.lua and the rules are hl.monitor({ ... }) calls. Old guides that tell you to paste monitor=eDP-1, preferred, auto, 2 do not apply. See monitors.conf replaced by monitors.lua.
What Omarchy does automatically
The shipped ~/.config/hypr/monitors.lua contains one catch-all rule, hl.monitor({ output = "", mode = "preferred", position = "auto", scale = omarchy_monitor_scale }), with omarchy_monitor_scale set to "auto" and GDK_SCALE set to 2. Everything else is machinery around it:
- Clamshell.
switch:off:Lid Switchrunsomarchy-hyprland-monitor-clamshell, which disables the internal panel when the lid shuts and an external output is active, and re-enables it at the remembered scale when you open it. This replaced the hand-writtenbindllid switches people were copying from issue #427 for nearly a year. - A monitor watcher.
omarchy-hyprland-monitor-watchsubscribes to Hyprland’s event socket, reconciles clamshell state onmonitoraddedandmonitorremoved, and polls every two seconds while a laptop is docked as a backstop for drift across suspend. - Modeless recovery. A display that was switched off at boot hands the kernel a truncated EDID with no video modes, so Hyprland enables it at 0x0 and it stays black. Switching it on later produces no hotplug event, so 4.0.0 added
omarchy-hyprland-monitor-modelessplus a reload loop in the watcher that backs off from 3 to 60 seconds and recovers the output without a reboot. - Toggle recovery. A systemd user service runs
omarchy-hw-recover-internal-monitorbefore the graphical session and clears a stale internal-disable toggle if no external display is connected, so you cannot boot undocked into a disabled laptop screen. - Mirroring and toggles.
Super + Ctrl + Deletetoggles the laptop display,Super + Ctrl + Alt + Deletemirrors it to the first external output. Both refuse unsafe connector names, and the toggle refuses to disable your only active display. - Scaling.
Super + /andSuper + Alt + /step through 1, 1.25, 1.6, 2, 3 and 4, rounded up to a scale Hyprland accepts in 1/120 steps.omarchy display text sizemoves shell, GTK and terminal text together without touching monitor scale. - External brightness. Brightness keys drive the focused display. External monitors that speak DDC/CI are adjusted through
ddcutil, Apple Studio and XDR displays throughasdcontrol, and laptop panels through the kernel backlight picked byomarchy-hw-display. - Panel quirks.
fix-asus-ptl-b9406-display.shaddsxe.enable_panel_replay=0on the ASUS ExpertBook B9406, where Panel Replay holds the last frame in self-refresh and nothing short of a full modeset, such as a VT switch, repaints it.fix-nouveau-cursor.shforces software cursors on nouveau, where the hardware cursor plane is invisible.xps13-text-scaling.shdrops text size to 11 on the 2026 XPS 13.
Known problems
| Issue | Models | Status | Fixed in |
|---|---|---|---|
| #6909 internal panel scale snaps to 2x on every idle wake | Laptops on stock scale = "auto" with an external monitor |
Fixed by #7581 | 4.0.1 |
#7084 clamshell watcher ignores desc: keyed, multi-line and require()d rules and re-asserts the catch-all scale over them |
Any docked laptop whose internal panel rule is not a one-line connector-name rule in monitors.lua |
Open | |
#8103 scale changes not persisted when monitors.lua has explicit per-output rules |
Dell Latitude 7420 and any laptop plus external | Open | |
| #6673 Display panel scale is per-monitor live but persists globally, rescaling the others | Three-display AMD Ryzen AI 9 setup, any mixed-DPI array | Open | |
#7326 internal monitor position forced back to auto |
Dell Latitude E5470, any laptop plus external | Open | |
#12147 monitor stays dark after wake because dpmsStatus desyncs to true |
Hybrid Intel plus NVIDIA, LG HDR 4K on DP | Open | |
| #12152 external-only output unusable after idle wake, atomic commits fail with EINVAL | Dell Vostro 5470, i915 plus nouveau | Open, Aquamarine fix upstream | |
| #12180 lock surface not backed by a valid wayland output, black screen then hard freeze | Intel UHD 630 | Open | |
| #12208 lockscreen failsafe loop during HDMI thrash | AMD Phoenix1 with Dell U2719DX on HDMI | Open | |
| #12207 USB4 monitor EDID read fails on about half of hotplugs, stuck at 640x480 | Dell XPS 16 DA16260, Panther Lake with xe |
Open | |
| #12083 4K at 120 Hz blanks for seconds on every frame after a pause | AMD Navi 33 on HDMI 2.1 | Open | |
#9804 Quickshell SIGSEGV when a monitor is set to bitdepth = 10 |
NVIDIA RTX 4060 laptop with OLED external | Open, traced to a null image in Mesa’s Wayland EGL path; reporter later ran 10-bit without crashes with XWayland off | |
| #12192 and #12198 update icon appears on one bar only | Any multi-monitor machine | Open | |
| #2184 Chromium crashes when moved between monitors | All, 3.x era | Fixed by #2394, then upstream in Chromium | 3.1.0 |
Fixes that work
Work down this list in order.
- Put your layout in
monitors.lua, keyed by connector name. Open it with Setup > Monitors in the Omarchy menu. Usehl.monitor({ output = "eDP-1", mode = "preferred", position = "auto", scale = 2 })and a matching line per output. Connector names come fromhyprctl monitors. Keep each rule on one line and do not usedesc:for the internal panel on a laptop: the clamshell watcher cannot read those rules, and as soon as the catch-all holds a number (which happens the first time you pressSuper + /) it re-asserts that number over yours (#7084). - If a scale will not stick, stop using the panel and the hotkeys. Edit the value in
monitors.luaand reload. Both #8103 and #6673 come from the same gap: the live change and the file disagree, and the docked poller re-asserts the file. Editing the file removes the mismatch. - A display that is dark after wake needs to be cycled off and on, not just on. Run
hyprctl dispatch 'hl.dsp.dpms({ action = "disable" })'then the same with"enable".omarchy-system-wakeskips the enable dispatch when every monitor already reportsdpmsStatustrue, which is exactly the stuck state (#12147). - If that does nothing, switch VT and back.
Ctrl + Alt + F2thenCtrl + Alt + F1forces a full modeset and brought the HDMI output back for the reporter of #12152. The reporter of #12208 used a second TTY the way Hyprland’s failsafe screen describes, to clear the crashed lock client. Treat both as workarounds, not fixes. - A monitor stuck at 640x480 with an empty description got a bad EDID read. Check
cat /sys/class/drm/card*-DP-1/edid | wc -c. If it is 0, re-probe a few seconds after plugging in:echo off | sudo tee /sys/class/drm/card0-DP-1/status, thenecho detectto the same file. On the XPS 16 in #12207 the full EDID came back on every retry, and the modeless recovery above does not catch this case because the output does have a mode, just the wrong one. - If display trouble started with 4.0.4, suspect the kernel. 4.0.4 shipped
linux-omarchyto everyone. Boot the stocklinuxentry once from the Limine menu and compare. Two AMD reporters in #12083 and the XPS 14 reporter in #12188 confirmed the stock kernel clears their problem. - Chromium crashing on a monitor move is a 3.x bug that Chromium fixed upstream. PR #2394 added
--disable-features=WaylandWpColorManagerV1to the default flag files in 3.1.0 as a stopgap; the 4.0.4chromium-flags.confno longer carries it. If a current Chromium still crashes when you move a window, add that line to~/.config/chromium-flags.confyourself.
Report it
Collect a bundle with omarchy-debug. It writes /tmp/omarchy-debug.log with inxi -Farz, dmesg, this boot’s warnings and errors, and the package list. Use omarchy-debug --no-sudo to skip dmesg, and --print to print instead of upload. Three reporters on 4.0.4, in #12147, #12180 and #12207, found that omarchy debug through the CLI wrapper was not available on their install even though the source tree lists it, so run the hyphenated command directly.
For a display bug, add these by hand, since the debug log does not carry them:
hyprctl monitors all -j, which shows disabled outputs, mirrors, scale anddpmsStatus.- The connector state:
cat /sys/class/drm/card*-*/statusand the size of the matchingedidfile. - Your
~/.config/hypr/monitors.lua. - The Hyprland log lines around the failure.
atomic drm request: failed to commit: Invalid argumentis the line both #12147 and #12152 turn on. - Whether the same thing happens on the stock
linuxkernel.
Say which connector, which monitor make and model, and whether the machine was docked. If you have a machine that works well, add it at hardware submit.
Related
Most-discussed upstream issues
The most-discussed upstream issues for this subsystem (1382 total, 778 open).
| Issue | State | Comments | Opened |
|---|---|---|---|
| #4023 Hyprland config errors after Omarchy update (invalid options and window rules) · fixed by #4032 | closed | 36 | 2025-12-30 |
| #2184 Chrome crashes when moving tile between monitors on Hyprland · fixed by #2394 | closed | 33 | 2025-10-03 |
| #5478 Hard Crash with AMD GPU on 3.6 since upgrade. Triggered by Chromium use - | closed | 60 | 2026-04-28 |
| #2858 Add a better display configuration tool | closed | 38 | 2025-10-26 |
| #427 Disable Internal (Laptop) Display on Lid Close | closed | 23 | 2025-07-31 |
| #8215 4.0.1: `shell_succeeds` fix enables NVDEC VAAPI routing on hybrid laptops with Intel-driven displays, corrupting browser video | open | 34 | 2026-08-25 |
| #1776 Laptop / Hybrid GPU Power Management Issue (NVIDIA, iGPU + dGPU) | closed | 15 | 2025-09-18 |
| #1840 Omarchy lid/sleep/suspend issue on MacBook (bug + solution to be tested) | closed | 14 | 2025-09-20 |
| #6952 Quickshell SIGSEGV in QQuickRepeater when PipeWire removes USB audio nodes · fixed by #7783 | closed | 41 | 2026-08-15 |
| #2314 Moving browser between monitors kill all apps · fixed by #2394 | closed | 31 | 2025-10-08 |
| #1806 Macbook Pro 2020 WIFI Issues | open | 34 | 2025-09-19 |
| #4821 # No Sound Fix: ASUS ROG Strix G16 (2025) on Omarchy 3.4.1 | open | 10 | 2026-02-28 |
Questions people ask
- Why does my monitor scale snap back a second after I change it?
- While a laptop has an external monitor active, a poller checks the internal panel every two seconds and re-asserts whatever scale it reads from monitors.lua, and the scaling command only writes back to monitors.lua when the file still has Omarchy's generic catch-all. Issues #8103 and #7084 cover this. Edit the rule in monitors.lua directly instead.
- Does Omarchy ship a GUI for arranging monitors?
- Not for arrangement. The Display panel on Super + Ctrl + D does brightness, text size, scale and enable or disable only. Issue #2858 was closed in July 2026 as superseded by the Quattro panel, which does not arrange monitors, so positions still go in ~/.config/hypr/monitors.lua. The hyprmoncfg plugin mentioned in that thread adds a layout editor if you want one.
- My laptop screen stays on when I close the lid. What changed?
- Nothing on 4.x should need the manual bindl lines from issue #427. Omarchy disables the internal panel itself when the lid shuts and an external output is active. If it does not, check that an external monitor is really enabled in hyprctl monitors, since the internal panel is never disabled as the only display.
Sources and credit
Fixes on this page were worked out by fuchsblau (Traced and fixed the internal panel scale flapping to 2x on every idle wake), mkelk (Found that the clamshell watcher cannot read desc: keyed monitor rules), nico-kovacs (Showed that the Display panel scale persists globally and rescales other monitors), dudis (Traced dead external-only output after wake to an Aquamarine 0.15.0 CRTC regression), diazkev314 (Captured the failing USB4 EDID read with drm.debug and a working re-probe workaround), SykesTheLord (Identified the dpmsStatus desync that makes a wake skip a dark monitor). Text here is our own paraphrase; follow the links for the original threads.
- manualOmarchy manual: Monitors · omacom · 2026-09-15
- prPR #7581: Leave an auto-scaled internal panel alone in clamshell recovery · fuchsblau · 2026-08-22
- issueIssue #6909: [Quattro] eDP-1 monitor scaling forces 2x reset on mixed-monitor array with Quickshell navbar · PedroMiguelInacio · 2026-08-14
- issueIssue #6673: [Quattro] Display panel scale is per-monitor at runtime but persists globally, rescaling other monitors on reload · nico-kovacs · 2026-08-10
- issueIssue #7084: Clamshell watcher ignores desc: rules for the internal panel and overwrites its scale every 2s · mkelk · 2026-08-16
- issueIssue #7326: Internal monitor position cannot be made to stick: clamshell watcher and Display panel scaling both re-apply position = "auto" · skoom21 · 2026-08-17
- issueIssue #8103: omarchy-hyprland-monitor-scaling doesn't persist scale on outputs with explicit per-monitor rules in monitors.lua · RonRayReed · 2026-08-24
- issueIssue #12147: LG display stays off after wake: dpmsStatus desyncs true while panel has no signal · SykesTheLord · 2026-09-16
- issueIssue #12152: External-only HDMI display becomes unusable after idle lock/DPMS wake with eDP-1 disabled · dudis · 2026-09-16
- issueIssue #12207: linux-omarchy 7.2.5 (xe, Panther Lake): USB4 monitor's EDID read fails on about half of hotplugs · diazkev314 · 2026-09-17
- issueIssue #12180: Black screen / full hang on unlock after idle screensaver: lock surface fails to attach · socalest1977 · 2026-09-16
- issueIssue #12208: Lock screen dies during HDMI/display thrash, Hyprland lockscreen failsafe loop · qaz027 · 2026-09-17
- issueIssue #12188: linux-omarchy kernel breaks screen backlight and USB audio volume on Dell XPS 14 (Panther Lake) · cthybert · 2026-09-16
- issueIssue #12083: 4K@120 HDMI screen blanks for seconds on every new frame after linux-omarchy 7.2.5-3 (AMD Navi 33) · berkesadam74 · 2026-09-16
- issueIssue #12192: System-update icon only appears on one monitor (checkupdates race) · loraque-git · 2026-09-16
- issueIssue #12198: Update icon appears on only one monitor: concurrent omarchy-update-available runs race inside checkupdates · kevinbsr · 2026-09-16
- issueIssue #9804: Quickshell crashes with SIGSEGV in QSGRenderThread when Hyprland monitor is set to 10-bit · ozdil · 2026-09-02
- issueIssue #2858: Add a better display configuration tool · ryanrhughes · 2025-10-26
- issueIssue #427: Disable Internal (Laptop) Display on Lid Close · curtisspendlove · 2025-07-31
- prPR #2394: fix: prevent Chromium crash when moving windows between monitors · d-cas · 2025-10-14