Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Roadmap

Ordering is intent, not a schedule. The docs hold what exists, DECISIONS.md why. Rust owns platform connections, validation, secrets, resource lifetimes, input and rendering; Lua owns composition, appearance and orchestration. A feature one config lacks is not an engine gap.

Next

Defects or missing pieces a config cannot work around.

None open.

Later

Wanted, but each needs a consumer or a decision first.

ItemWhy / what’s leftADR
Greeter (#8)Mantle as a greetd login screen, inside whatever compositor greetd starts for it. Needs a session-launch command—
Output actions (#9)windows has six actions; screens have none. Pick the actions, then settle niri/Hyprland differences and revert0119, 0247
Text field editing (#10, #15)The caret has no stop inside a ligature, and IME needs the field’s surface focused, so a parent-focused popup gets none. The secure field keeps end-only editing and no IME, so an input method never sees the draft0236, 0312
Wayland and input extras (#12, #17, #18)No shortcut inhibition, touch gestures, or cross-app drag and drop—
Window capture backends (#13, #16)capture.window accepts Hyprland windows IDs. Niri needs a toplevel capture source; wlr needs an exact bridge from its connection-local IDs0247, 0248

Won’t do

ItemInsteadADR
Native FFT or audio peak meteringStream Cava output into state and draw it0316
Weather, currency, geolocation, HTTP, sockets or watched file contentsprocess.run streaming curl, socat or tail -f, then json.decode; file.read reads a file once; folders watches folders—
MPRIS remote artworkcurl the player’s art_url into a cache file through process.run and draw that path0036
Generic IPC state read, subscription or per-panel commandsAn action that returns the value, read with mantle call; mantle set and toggle write state0197
Child stdin, cwd or envprocess.run("env", { "-C", dir, "K=V", cmd }); sh -c for one-shot stdin0175, 0188
Per-surface idle inhibitionidle:inhibit while the surface shows, release_inhibit when it hides—
Clipboard capabilityprocess.detach("wl-copy", { text }): a selection needs a process that stays alive to serve it0188
Video encoding or global input captureA recorder or input backend under session_process, streamed in0175
Wallpaper capabilityA "background"-layer panel, an image with async/retain/transition, folders for the folder, persistent_table for the choice0055
Rust widgets (sliders, calendars, launchers, settings)Lua components over existing nodes—
Framework settings schemapersistent_table with config-declared files—
Deferred surface loaderWayland objects are created when shown; the Lua CPU budget guards one signal resolve, not a whole evaluation0157
Shaders over the desktop behind a surfaceThe compositor owns those pixels. effect.shader reads what this surface painted, a node’s subtree; the input-less shader node and image.transition keep their contracts0184, 0253, 0336
Display manager (PAM as root, sessions, seats)greetd; see Greeter—
X11 or i3The target is a Wayland session shell—