kanshi_gui
Waylandswaywlrootsv2.0.2

Drag a monitor.
It is already applied.

kanshi_gui arranges multi-display setups under Wayland by hand instead of by config file. Move a screen and the running compositor moves with you — no save, no restart, no reload. Save the arrangement once and it comes back exactly like this, every time you dock.

curl -fsSL https://apt.nurkert.de/install/kanshi-gui | sudo sh
Source
Setup 1
DP-1Samsung Electric Company2560 × 1440landscape60 Hz
DP-2Samsung Electric Company2560 × 1440landscape60 Hz
HDMI-A-1InfoVision Optoelectronics1920 × 1080landscape60 Hz
Drag a screen — the edges snap
Saved. These 3 screens come back exactly like this.

A working piece of the app, running in your browser. In the real thing, every one of these moves reaches the compositor.

The compositor moves while you drag

Position, scale, rotation and mode go into the running session the moment you change them. What you are looking at is not a preview of the result — it is the result.

A change that can black out a screen has 15 seconds

It is only kept if you say so. A click elsewhere, a focus change or simply waiting are not a yes. The timeout always puts it back, because the person who cannot see anymore cannot answer either.

It comes back exactly like this

The arrangement is written into your kanshi config by a real scfg parser that edits the file in place — your comments, your other profiles and anything it does not recognise survive the save.

The safety net

The question you can only answer if it worked

Changing a mode or switching an output off can leave a screen black — and someone who sees nothing cannot take it back. So the app asks, on the screen, and waits.

Only a positive answer keeps the change. Not a click on the dimmed canvas, not a focus change, and above all not the clock running out. Doing nothing is the safe move — which is the whole point, because doing nothing is exactly what happens when you cannot see the question.

Try it: keep it, put it back, or just let the countdown finish.

Setup 1
DP-12560 × 1440
DP-22560 × 1440
Saved. These 2 screens come back exactly like this.
Everything else

Small app, decided details

Version 2.0 deleted ten preferences, a 248px rail and the first-run wizard. What is left is the part that had to be there — and each of these is a decision, not an option you have to find.

Smart snapping

Guide lines like a design tool, corner alignment on top, bottom and centre — and a magnet that backs off once you have escaped it twice in the same drag.

Hotplug aware

Plug a screen in or pull it out and the canvas refreshes itself. A drag that a hotplug invalidated is cancelled, never committed to the wrong output.

Identify displays

One button flashes a large pulsing number onto every screen, so you know which rectangle on the canvas is the panel on your left.

Mirror onto another output

Point one screen at another through wl-mirror. Mirrored tiles take a colour of their own, because mirroring is a relationship between two screens and not a selection.

Workspaces, if you want them

Optionally spread sway workspaces 1–9 across your monitors, interleaved or grouped. Off by default — a first launch never reshuffles the desk you already have.

Setups, not config blocks

Capture the screens you have now, rename them, forget them. Switching uses kanshictl reload where it exists, so re-applying no longer flickers the screen.

It will not lock you out

The last enabled output cannot be disabled. Not a warning dialog, not a preference — the app simply refuses, because there is no good reason to allow it.

Light, dark, and your accent

The theme follows the system, and the accent colour is read from sway's client.focused so the app agrees with the window manager it sits next to.

Compositors

It picks its backend at startup

swaymsg where sway is actually running, wlr-randr everywhere else in the wlroots family. If neither is there, it stays useful as an offline profile editor rather than refusing to start.

CompositorBackendLive applyMirror · identify · workspaces
swayswaymsgyesEverything
Hyprland · Wayfire · niri · other wlrootswlr-randryesLayout only
GNOME on Waylandnot supported yetnoOffline editor

sway needs a SWAYSOCK that points at a live socket — having the sway tools installed is not enough, so a non-sway session with them lying around lands on the wlr-randr path on purpose. Mirroring, identify banners and workspace placement are sway-specific because they go through sway IPC, swaynag and wl-mirror.

Install

Three ways in

You need a Wayland session and kanshi with a working config at ~/.config/kanshi/config. Everything else the app brings along.

Debian and Ubuntu users: the APT route is the one that keeps updating. The other two are for when you would rather build it yourself.

Registers apt.nurkert.de as a source, so kanshi_gui updates with the rest of the system instead of needing you to remember it.

curl -fsSL https://apt.nurkert.de/install/kanshi-gui | sudo sh

Then launch it with kanshi_gui — or from your application menu.

Arrange the screens once.
Then stop thinking about it.

curl -fsSL https://apt.nurkert.de/install/kanshi-gui | sudo sh
Read the source, open an issue