contents

Window rules#

Rules match windows and apply effects. Each window-rule { } node needs at least one match; matchers are regexes in KDL raw strings.

window-rule {
    match title=#"^Minecraft"# is-xwayland=#false
    exclude title=#"launcher"#
    open-on-workspace 6
    opacity 0.98
    allow-tearing #true
}

window-rule {
    match app-id=#"^foot$"# title=#"^scratch"#
    open-floating #true
    default-size 800 600
    open-centered
    animation "slide" dir="top"
}

Matching#

Selectors AND together within a match node and OR across multiple match nodes, and any matching exclude node vetoes the rule:

SelectorMatches
app-idregex against the app id (X11 class for XWayland windows)
titleregex against the window title
is-xwaylandX11 windows (#true) or native Wayland (#false)
is-floatingcurrent floating state
is-fullscreencurrent fullscreen state

Regexes use the lightweight regex-lite dialect and are validated when the config parses; a bad pattern is a config error. Rules apply in file order: scalar effects (workspace, size, opacity) let the later match win, boolean effects accumulate.

The classic no-capture use is keeping your Discord DMs off stream:

window-rule {
    match app-id=#"^discord$"#
    no-capture
}

On your screen the window is normal; every screenshot, recording, and cast sees an opaque black box in its place (rounded to match), and even the close-animation replay stays blacked out. Pixels never leave the compositor.

Effects#

All thirteen effects work today. The open-* family positions the window once, when it maps, and stays as mapped; every other effect is re-resolved on running windows by burrow reload, so a rule edit lands on the apps you already have open. no-anim and animation cover both the open and the close.

EffectTypeDoes
open-floatingboolstart floating (or #false to force tiling)
open-on-workspacenumbermap on that workspace (1-based; creates it if needed)
default-sizetwo intsinitial floating size
open-centeredflagcenter a floating window
opacity0..1per-window opacity
allow-tearingboollet this window tear when fullscreen, same as the surface requesting it
no-animflagskip this window's open and close animations
animationstyleoverride the open/close style, same grammar as animation styles
roundingpx 0..200override the decoration corner radius for this window
shadowboolopt this window out of (or back into) the drop shadow
dimboolopt this window out of (or back into) dim-inactive
blurboolgive this window the blurred backdrop; blur is opt-in per window
no-captureflagblack the window out of every capture path: screenshots, recordings, and casts

Layer rules#

Layer rules target layer surfaces (bars, launchers, wallpaper tools) by namespace, and their effect today is the blurred backdrop:

layer-rule {
    match namespace=#"^quickshell:bar"#
    blur
    ignore-alpha 0.2
}

match namespace is a regex, same dialect as window rules, and multiple match nodes OR together. Three effects:

  • blur hands the surface the cached backdrop blur (it needs decoration { blur { } } switched on). ignore-alpha masks the blur to the pixels where the surface's own alpha is at or above the threshold (0..1), so a pill-shaped bar blurs only under its pills; unset blurs the whole rect. The mask needs an ARGB buffer, since XRGB surfaces pin alpha to one.
  • no-anim skips the surface's open and close animations. Shells that remap their layer surfaces on every state change flicker through the popin otherwise; this rule keeps them still.