PlasmaZones

Window snapping, tiling and scrolling for KDE Plasma.

Three placement modes in one daemon. Snap windows into zones you drew, let an algorithm tile them for you, or scroll them along an endless strip — every monitor picks its own. Built on the Phosphor library suite, it is scriptable, themeable, and Wayland-native.

Hero screenshot src/assets/plasmazones/editor.png
The layout editor. Named zones designed visually, with normalized coordinates so the same layout works at any screen size.

Features

Snapping

Hold a modifier while dragging any window. Zones light up, and dropping a window into one fills it. The modifier is configurable (Alt, Meta, Ctrl+Alt, Alt+Shift, Alt+Meta, Ctrl+Alt+Meta), and Ctrl+Alt over two adjacent zones snaps across both. Keyboard users skip the drag with Meta+Ctrl+1 through Meta+Ctrl+9.

Tiling

Windows place themselves as they open, with no drag and no zones to draw. 27 algorithms ship in-box — master-and-stack, BSP, columns, grid, spiral, monocle, Krohnkite-style deck stacking — written in sandboxed Luau. Per-side inner and outer gaps, smart-gaps when only one window is tiled, and hot-reload for custom .luau in ~/.local/share/plasmazones/algorithms/.

Scrolling

Windows form columns on an endless strip, modeled on niri, and the screen is a window onto it — opening a window never resizes the ones you have. Columns cycle through width presets, share or tab their windows, and consume or expel between each other. The strip runs side to side or top to bottom to match the monitor, and Meta+wheel moves along it.

One mode per screen

Each monitor runs the mode you assign it, scoped per virtual desktop and per activity, so a widescreen can scroll while the laptop panel tiles. Meta+Shift+T cycles the focused screen through whichever modes you have enabled, and any mode can be turned off entirely.

26 built-in layouts, custom editor

Grids, BSP and fibonacci, master+stack, portrait / ultrawide / super-ultrawide variants, priority grids. The visual editor draws custom zones freehand with grid snapping, undo/redo, and per-zone colors. Coordinates are normalized, so one layout works at any screen size.

Virtual screens

Subdivide a physical monitor into 2–10 virtual screens with drag-to-resize boundaries. Each gets its own layout, placement mode, and settings. Swap with Meta+Ctrl+Shift+arrows.

Three shader families

27 overlay shaders draw zone highlights, snap previews, and drag ghosts; 24 surface packs blur, frost, border, and tint the windows themselves; 94 animation packs cover open, close, minimize, tab, and desktop-switch transitions. All GLSL, all hot-reloading from ~/.local/share/plasmazones/.

Window rules

Match on class, title, active layout, screen orientation, and more, then act on placement, floating, opacity, borders, animations, scroll speed, and per-app behavior in every mode.

Snap assist

After you drop a window into a zone, empty zones show thumbnails of other windows for one-click follow-up placement.

Global shortcuts

Snap, switch zones, move windows, cycle layouts, drive the strip — bound through KGlobalAccel, with an XDG Portal fallback in the portable build.

See it in action

Tiles auto-swap placeholder → real image as soon as the PNG lands under src/assets/plasmazones/ with the listed filename. No code edit needed.

Install

Packages for Arch, Fedora, openSUSE and Nix, a portable tarball for immutable systems, or a source build. Needs Plasma 6.7+ on Wayland.

Arch Linux (AUR)

yay -S plasmazones-bin

Fedora (COPR)

sudo dnf copr enable fuddlesworth/PlasmaZones
sudo dnf install plasmazones

All install methods → openSUSE, Nix, portable tarball, source build, requirements, and the post-install step.

Galleries

Every built-in, rendered from the same metadata the daemon reads at runtime.

Learn

Extend it

Layouts, algorithms, scrolling templates, and all three shader families are user-extensible. Custom content goes in ~/.local/share/plasmazones/ and hot-reloads on save.

Advanced

Built on Phosphor

Every major subsystem is its own library. Fixes land once and reach every consumer, and third-party code can depend on only the pieces it needs.