Limitations
kiln is a proof of concept with three honest kinds of gaps: things the model excludes on purpose, things simply not built yet, and things external tools expect that the protocol list does not grant. Where a workaround exists, it is linked.
The drawing vocabulary
kiln draws rectangles, rounded corners, borders, images, text, and color. That is the complete list, and it is deliberate: the vocabulary is what Clay declares and the C renderer reconciles, with no escape hatch into arbitrary painting.
Not available as drawing primitives: gradients, arcs, rings, and circles (so no radial progress bars or pie charts), rotation and mirroring, drop shadows, shapes beyond the rounded rectangle, and per-window opacity. There is no Lua canvas and no cairo access; a config cannot paint pixels, only declare nodes. The escape hatch is an image: kiln.asset renders SVG (including kiln.asset.gradient) to cached PNGs, which is how the default desktop gets its gradient wallpaper and its glyphs. A surprising number of widgets fit the vocabulary directly, but if your aesthetic depends on painting at declare time, kiln cannot draw it today.
Current gaps
These are unbuilt, not refused:
- No pointer warp. A config cannot move the cursor, so focus-follows policies that warp the pointer to the focused client are not expressible.
- Floating clients do not honor size hints. Min, max, and increment size hints are not read: a floating terminal resizes freely instead of in cell steps, a dialog can be squeezed below its minimum, and the only floor is the uniform
theme.min_size. - Bars are full-width top or bottom struts. No vertical bars, no floating pill bars, no margins or partial width. A pill can be declared as a float, but a float reserves no workarea. See A bar from scratch for what bars can do.
Protocol support for external tools
What works, today, with stock tools:
- Screen capture: screencopy is implemented, so grim, slurp, wf-recorder, and OBS's wlroots capture all work. See Screenshots.
- Color temperature: gamma control is implemented; wlsunset and gammastep work.
- Session locking: external lockers work via the session lock protocol, alongside kiln's native lock. See Lockscreen and idle.
- Layer-shell (panels, launchers, OSDs), xdg-activation (focus handoff), and foreign-toplevel (taskbars, window switchers).
What does not:
- No wlr-output-management. kanshi, wdisplays, and similar display configurators cannot talk to kiln. Output configuration is done from your config with
core.outputinstead, which covers a static setup well; see Multi-monitor. - No output power management. wlopm and dpms-style tools have no protocol to use. Disabling an output from config via
core.output.set_enabledis the available lever. - No virtual keyboard or pointer. wtype, ydotool's Wayland path, and remote-input tools cannot inject input.
Input configuration is global
kiln.input settings (acceleration, natural scrolling, tap-to-click, and the rest) apply to every device. There are no per-device settings, so a laptop with an external mouse cannot give the touchpad and the mouse different acceleration profiles. Single-pointer setups lose nothing. See Input devices.
External widget libraries
Widget libraries written for other compositors will never load in kiln: the imperative drawing machinery they are built against does not exist here, by design, and no compatibility layer is planned. Their outcomes are often reachable anyway: the standard forms (progress bars, sliders, toggles) ship on kiln.widgets, and the rest usually reduce to a poll plus a declaration; see Data widgets for both paths. For what carries over from AwesomeWM and what does not, see kiln vs SomeWM.