Your niri config.kdl, translated for macOS

Updated 2026-10-22 · by the maker of Ribbon

No Mac app reads config.kdl, but most of niri's layout and input options have a direct twin in Ribbon's settings window. Below, each option sits next to the Ribbon setting that does the same job, with an honest note wherever macOS has nothing to offer.

How Ribbon's settings are organised

niri keeps everything in one KDL file that reloads when you save it. Ribbon keeps everything in a settings window, and changes apply as soon as you flip a switch. The pages you'll use are:

If you haven't installed Ribbon yet, the setup guide covers the permission and trackpad settings first.

layout {}

gaps

layout {
    gaps 16
}

Ribbon: Gap between windows, in pixels. The default is 8. The same gap is used between windows and at the screen edges, so gaps 16 becomes 16 in Ribbon.

center-focused-column and always-center-single-column

layout {
    center-focused-column "on-overflow"
    always-center-single-column
}

Ribbon: Centre the focused column, with three choices that match niri's word for word: Never, On overflow and Always. niri defaults to "never"; Ribbon defaults to On overflow, so set it to Never if you want niri's stock behaviour.

There's no separate switch for always-center-single-column. You can centre any column on demand with ⌃⌥C, which is niri's Mod+C.

preset-column-widths

layout {
    preset-column-widths {
        proportion 0.33333
        proportion 0.5
        proportion 0.66667
    }
}

Ribbon: Column width presets, edited as percentages. The defaults are 25, 33, 50, 66, 75 and 100%. Delete the ones you don't use to get niri's three-step cycle. ⌃⌥R cycles forward like Mod+R. A Width presets wrap around toggle decides whether the cycle loops back to the first preset. Fixed pixel widths (fixed 1200) have no equivalent; presets are proportions only.

preset-window-heights has no twin. In a stack you change heights step by step with ⌃⌥⇧= and ⌃⌥⇧-, and ⌃⌥0 makes them equal again.

default-column-width and default-column-display

layout {
    default-column-width { proportion 0.5; }
    default-column-display "tabbed"
}

Ribbon has no setting for the width a new column opens at, and columns don't open tabbed by default. Press ⌃⌥R after a window opens to pick a width, and ⌃⌥⇧T to turn a column into tabs.

focus-ring and border

layout {
    focus-ring {
        width 4
        active-color "#7fc8ff"
        inactive-color "#505050"
    }
}

Ribbon: Focus border. Turn it on or off, set the width, and pick a colour, with a separate colour for Dark Mode. There are no gradients and no inactive colour. The nearest thing to an inactive colour is Dim inactive windows, which darkens every unfocused window by 0 to 100%.

niri's border (drawn around every window, shrinking it to make room) has no equivalent. Ribbon only marks the focused window.

struts and shadow

layout {
    struts {
        left 64
        right 64
    }
}

Neither struts nor shadow has a direct twin. Ribbon's gap applies evenly at every edge, and there's no setting to keep a slice of the neighbouring window peeking in. macOS draws its own window shadows, and window managers can't change them through the Accessibility API.

input {}

input {
    focus-follows-mouse max-scroll-amount="0%"
    warp-mouse-to-focus
    touchpad {
        tap
        natural-scroll
    }
}

niri scrolls the view with a three-finger swipe out of the box. Ribbon does too, and its options sit under Swipe fingers (Off, 3 or 4, default 3), with Natural direction, Continuous swipe (let the strip scroll past the last window) and Sensitivity. For the swipe to reach Ribbon, macOS's "Swipe between full-screen applications" must not be on three fingers. The setup guide shows where to change it.

niri's Mod+WheelScrollRight/Left becomes Ribbon's Scroll-wheel modifier: hold ⌥ (or ⌘, ⌃ or fn) and scroll sideways to slide the strip.

window-rule {}

window-rule {
    match app-id=r#"firefox$"# title="^Picture-in-Picture$"
    open-floating true
}

Ribbon: Window rules. Pick a running app and it always floats. Calculator and System Settings float by default, and dialogs and fixed-size windows float on their own. Rules match whole apps, not titles, and there's no regex. The other rule properties, such as open-on-output, open-on-workspace, open-maximized, a per-app default-column-width, block-out-from and geometry-corner-radius, have no equivalent.

output, animations and workspaces

output "eDP-1" {
    scale 2
    position x=1280 y=0
}
animations {
    slowdown 2.0
}

The full table

niri optionRibbon equivalent
gapsGap between windows
center-focused-columnCentre the focused column: Never / On overflow / Always
always-center-single-columnNo equivalent (⌃⌥C on demand)
preset-column-widthsColumn width presets (proportions only)
preset-window-heightsNo equivalent (step resize in a stack)
default-column-widthNo equivalent
default-column-displayNo equivalent (⌃⌥⇧T per column)
focus-ringFocus border (width, colour, Dark Mode colour)
focus-ring inactive colourDim inactive windows (closest)
borderNo equivalent
strutsNo equivalent
shadowNo equivalent (macOS draws shadows)
focus-follows-mouseFocus follows mouse
warp-mouse-to-focusMouse follows focus
touchpad, keyboardmacOS System Settings
Touchpad swipe gestureSwipe fingers, Natural direction, Sensitivity
window-rule + open-floatingWindow rules (per app)
Other window-rule propertiesNo equivalent
outputmacOS Displays settings
animationsAnimation speed (one spring for everything)
WorkspacesmacOS Spaces, one strip each
bindsShortcuts page
Live reloadSettings apply instantly

Two things Ribbon has that niri's config doesn't: Restore the layout after a restart, and an Advanced field where power users can append raw engine TOML in Paneru's syntax. Most people never need the second one.

Before you buy

If the gaps, presets and centring above cover what your config.kdl did, you'll feel at home. If you rely on struts, per-app widths or niri's workspaces, look at the free options in niri for Mac and Ribbon vs OmniWM too. Try the strip in the live demo, then buy Ribbon if it fits.

FAQ

Can Ribbon import my niri config.kdl?

No. Ribbon has no KDL importer. Most layout options take a minute to copy across by hand using the table above.

Does Ribbon have center-focused-column?

Yes. "Centre the focused column" offers Never, On overflow and Always, the same three choices as niri. Ribbon's default is On overflow.

Can I set fixed pixel column widths like niri's fixed option?

No. Ribbon's width presets are proportions of the screen. You can add, remove and edit them, but not in pixels.

Is there an equivalent of niri's struts?

No. Ribbon uses one gap value between windows and at the screen edges, with no extra outer margins.

Does Ribbon have a config file I can keep in my dotfiles?

Not in the niri sense. Settings live in the app's settings window. Power users can append raw engine TOML in the Advanced field, but there's no full text config.

Keep reading