Frank's call: no per-host graveyard. The four /system/dankware/ pages carried two pieces of knowledge that outlive the box, and one that does not. Distilled: - omp-docs/system/network.md (new) — LAN topology plus the multi-link resolver law: a client with two +DefaultRoute links flaps its DNS, and the fix is a static per-connection resolver, not resolved.conf. Keeps the flush-caches-loop verification, because one successful dig proves nothing. - omp-docs/tools/niri/displays.md (new) — the multi-monitor rig: portrait transforms, absolute positions, auto-placed third panel, the iGPU render-node pin, and the three failure modes (duplicate output blocks, positions that do not reflow, a mode the panel cannot drive). Dropped: the machine's own spec sheet (CPU/GPU/PCI/NVMe inventory for a box Frank sold) and its quick-facts table. The OS and userspace facts it repeated already live in tools/cachyos.md. omp-docs/system/dankware/ moved to .AGENTTRASH/20260928-retired-workstation/ (not deleted; git history holds it too). system/index.md and the niri index repoint; niri's [[displays]] wikilink now resolves to the new page instead of the trashed one. kb-lint: 0 violations.
4.2 KiB
type, title, description, tags, verified
| type | title | description | tags | verified | ||||
|---|---|---|---|---|---|---|---|---|
| reference | Display Configuration | Niri output configuration for a multi-monitor desk rig — portrait transforms, position pinning, scale, and iGPU display ownership. |
|
2026-08-28 |
Display Configuration
How a multi-monitor desk rig is configured in niri: portrait external panels flanking a laptop panel, positions pinned by hand, and the integrated GPU kept as the display owner.
Config: ~/.config/niri/cfg/display.kdl
Probe: wlr-randr (installed by CachyOS) reports what the compositor
actually committed — connectors, preferred modes, transforms, scale, positions.
The rig
Three outputs in a row: two external monitors rotated to portrait, one internal laptop panel in landscape at the right.
┌──────────────┬──────────────┬──────────────┐
│ │ │ │
│ DP-1 │ DP-3 │ eDP-1 │
│ external │ external │ internal │
│ 1920x1200 │ 1920x1200 │ 2560x1600 │
│ Portrait │ Portrait │ Landscape │
│ 90° rotate │ 270° rotate │ 1.5x scale │
│ │ │ │
└──────────────┴──────────────┴──────────────┘
x=0,0 x=1200,0 auto-placed
| Output | Role | Transform | Position | Scale |
|---|---|---|---|---|
DP-1 |
External, left | 90 (portrait) |
x=0 y=0 |
1.0 |
DP-3 |
External, center | 270 (portrait) |
x=1200 y=0 |
1.0 |
eDP-1 |
Internal panel | none (landscape) | auto-placed | 1.5 |
The two portrait panels are 1200 px wide after rotation, which is why the
second one starts at x=1200. The internal panel declares no position at
all — niri auto-places it to the right of the explicitly positioned outputs.
That is the only reliable way to keep a third panel from landing on top of
the rig when a cable is re-seated.
The config pattern
output "DP-1" {
transform "90"
position x=0 y=0
}
output "DP-3" {
transform "270"
position x=1200 y=0
}
output "eDP-1" {
// no position — auto-placed to the right of the DP-* outputs
scale 1.5
}
Three rules learned the hard way:
- One output, one block. A second block keyed by the make/model string
(
output "Samsung Electric Company …") that also setstransformfights the connector-keyed block. Use the make/model form only to pin amodefor an output whose connector name is unstable across boots, and never set a transform in both places. - Positions are absolute, not relational. Niri does not reflow the rig
when one panel is disconnected — a missing output leaves a hole at its
coordinates. Verify with
wlr-randrafter any cable or dock change. - Re-assert rotation after a config reload, then confirm. A transform silently reverting to landscape is the usual symptom of a duplicate output block, not of a failed reload.
Modes must match what the panel reports. Check wlr-randr for the preferred
mode before writing a mode line; a mode the panel cannot drive leaves the
output dark or drops it.
GPU assignment
The integrated GPU drives all display output; the discrete GPU is available
for compute but must not take the outputs. Pin the render node explicitly in
~/.config/niri/cfg/misc.kdl:
environment {
render-node "/dev/dri/renderD129"
}
Without the pin, the session's render node follows probe order and can land on the discrete GPU — which costs display-linked copies and, on hybrid graphics laptops, is a common trigger of the suspend/resume deadlock covered in the sleep-wake investigation report.
Reload
niri msg action load-config-file reloads live. Never SIGHUP the process
— see tips.