niri doesn't run on macOS, and it can't. It's a Wayland compositor, and macOS doesn't let anything replace the program that draws its windows. What you can have on a Mac is niri's layout: columns on a strip that scrolls sideways, where opening a window never shrinks the others. Seven Mac apps do that today. We make one of them, Ribbon.
If you want a pick before the detail: on macOS 26 Tahoe, try OmniWM first, because it's free and copies niri the most closely. On macOS 14 or 15, if you'd rather keep native Spaces, try Ribbon. If you live in Hammerspoon, use PaperWM.spoon. Further down there's a niri-keys-to-Mac map and a config.kdl translation table.
Facts were checked on 1 November 2026 against each project's README or site, and niri's own default-config.kdl. We make Ribbon.
What niri is (and why it can't run on a Mac)
niri is a scrollable-tiling Wayland compositor for Linux, GPL-3.0. The latest release is v26.04 (April 2026). Each monitor gets an endless horizontal strip of columns, and each column holds one or more windows. Workspaces are dynamic and stack vertically. It also has an overview, tabbed columns and touchpad gestures.
A compositor is the program that actually draws windows on screen. On Linux you can choose it. On macOS, WindowServer is the compositor, and Apple doesn't let you replace it. So every Mac "niri" is a different kind of program: an app that uses the Accessibility API to move and resize ordinary macOS windows into a niri-like arrangement. That has consequences:
| niri on Linux | niri-style apps on macOS |
|---|---|
| Draws every window itself | Asks each app's window to move and resize |
| Animations are smooth because it renders them | Animations depend on how quickly each app responds |
| Every window obeys its layout | Some windows refuse (fixed-size dialogs, some games and installers), so they float |
| Its own workspaces | Either macOS Spaces or the app's own emulated workspaces |
Configured in config.kdl | GUI settings, or TOML/Lua, depending on the app |
| Overview built in | Some apps have one (OmniWM, Maki), some don't |
The 7 Mac options
| # | App | Price | macOS | Config | Workspaces | Notable |
|---|---|---|---|---|---|---|
| 1 | OmniWM | Free (GPL-2.0) | 26+, Apple silicon | GUI + TOML | Own workspaces (1 Space per display recommended) | Niri + dwindle layouts, overview, vertical-monitor rows |
| 2 | Ribbon (ours) | From $12 one-time | 14+, Apple silicon | GUI + TOML | Native macOS Spaces | Width presets ¼ to full, centring modes, stacks, tabs, grids |
| 3 | Maki | $19 one-time, 14-day trial | 26+ | GUI | Several strips per display, stacked vertically, plus a strip per Space | Overview, CLI, MCP server |
| 4 | ChainYourMac | From $19.99 one-time | 13+, Apple silicon | GUI | macOS Spaces integration | Pinned columns, centring modes |
| 5 | Paneru | Free (MIT) | Not stated | TOML or Lua | Native Spaces plus experimental virtual workspaces | CLI query commands |
| 6 | Nehir | Free (GPL-2.0) | Not stated | TOML | Own workspaces with hotkeys | Younger project |
| 7 | PaperWM.spoon | Free (MIT) | Hammerspoon's | Lua | Native Spaces | Lives inside Hammerspoon |
Also worth knowing:
- Glidro (paid, macOS 13+, Apple silicon) and SlideScroll (free, MIT, macOS 13+, Apple silicon) are two more strip apps that we found but didn't profile in depth.
- A few unrelated apps share the name "Ribbon". Ours is meetribbon.app.
1. OmniWM: the most niri features, free, Tahoe only
OmniWM copies niri closely. Containers scroll left and right on horizontal monitors and become rows that scroll up and down on vertical ones. It has an overview, tabbed containers and a second engine, Hyprland-style dwindle, which you can choose per workspace. It needs Apple silicon, macOS 26 or later, Accessibility and Input Monitoring. It uses its own workspaces. Known limitations · Ribbon vs OmniWM.
2. Ribbon: the niri strip without replacing macOS
Ribbon gives each display a strip. New windows open beside the focused one. ⌃⌥R cycles widths like niri's Mod+R, through ¼, ⅓, ½, ⅔, ¾ and full, and you can edit the list in ~/.config/ribbon/ribbon.toml. The setting is even called preset_column_widths, because our engine borrows niri's vocabulary. center_focused_column works the same way too: "always", "on-overflow" (our default) or "never". Columns can stack or show tabs. It works inside native macOS Spaces, so Mission Control and the Spaces swipe behave as usual. It uses Accessibility only, keeps SIP on and runs on macOS 14+ on Apple silicon. What it lacks compared with niri: an overview, vertical workspaces and a default-column-width setting. How the strip works.
3. Maki: native Swift, Tahoe-only, with an overview
Maki is a Swift app that looks closest to niri's model of vertical workspaces: "each display can have several strips, stacked from top to bottom". It has stacks, tabs, floating windows, saved layouts, a 3- or 4-finger swipe, a CLI, a maki:// URL scheme, Raycast script commands and an MCP server. Its default focus keys are ⌃⌥H/J/K/L. It uses public APIs only and asks for Accessibility, plus Screen Recording for its overview. It costs $19 once after a 14-day trial, and needs macOS 26 or later.
4. ChainYourMac: lots of dials, macOS 13+
A paid strip app with a SwiftUI app and a Rust engine, for Apple silicon. It has center-focused-column modes (never, on overflow, always) that mirror niri's center-focused-column, and it can pin a column to a screen edge, which Ribbon can't. $19.99 for one Mac, with no refunds. Ribbon vs ChainYourMac.
5. Paneru: free, config-file driven, native Spaces
Paneru is a "sliding, tiling" manager with one strip per monitor. It works with native Spaces and has experimental virtual workspaces, TOML or Lua config, a CLI with JSON queries, and Homebrew installs. MIT, v0.5.2 (October 2026). It's the closest free option for people who want a dotfile.
6. Nehir: free, TOML, early
Nehir arranges windows in niri-style columns, with config in ~/.config/nehir. GPL-2.0, v0.5.1 (June 2026). It's early, so check recent activity before you rely on it.
7. PaperWM.spoon: inside Hammerspoon
PaperWM.spoon brings PaperWM's scrolling model (niri's older cousin) to Hammerspoon in Lua. Its window_ratios default of 1/3, 1/2 and 2/3 matches niri's presets. Swipe gestures are off until you set swipe_fingers. See PaperWM for Mac.
Your niri keys on a Mac
niri's default Mod is Super, which you'd usually map to ⌘ on a Mac. But ⌘ belongs to apps on macOS, so most Mac strip apps use ⌃⌥ instead. Here is niri's default config mapped to Ribbon's defaults. Ribbon's Vim style swaps the arrows for H/J/K/L, which makes the muscle memory almost identical.
| niri default | niri action | Ribbon (Arrows style) | Ribbon (Vim style) |
|---|---|---|---|
| Mod+H / Mod+L | focus-column-left / right | ⌃⌥← / ⌃⌥→ | ⌃⌥H / ⌃⌥L |
| Mod+J / Mod+K | focus-window-down / up | ⌃⌥↓ / ⌃⌥↑ | ⌃⌥J / ⌃⌥K |
| Mod+Ctrl+H / L | move-column-left / right | ⌃⌥⇧← / ⌃⌥⇧→ | ⌃⌥⇧H / ⌃⌥⇧L |
| Mod+R | switch-preset-column-width | ⌃⌥R | ⌃⌥R |
| Mod+F | maximize-column | ⌃⌥F (full width) | ⌃⌥F |
| Mod+C | center-column | ⌃⌥C | ⌃⌥C |
| Mod+BracketLeft | consume window into the column on the left | ⌃⌥S (stack into the left column) | ⌃⌥S |
| Mod+Period | expel window from column | ⌃⌥⇧S (unstack) | ⌃⌥⇧S |
| Mod+W | toggle-column-tabbed-display | ⌃⌥T | ⌃⌥T |
| Mod+V | toggle-window-floating | ⌃⌥Space | ⌃⌥Space |
| Mod+1…9 | focus-workspace N | ⌃⌥1…9 focuses column N (use macOS ⌃1…9 for Spaces if enabled) | same |
| Mod+U / Mod+I | focus-workspace-down / up | No equivalent; use macOS Spaces | – |
| Tap Mod by itself | toggle-overview | No equivalent; use Mission Control | – |
Every Ribbon action can be re-recorded in Settings → Shortcuts. Try them live on the interactive shortcuts page, or see the full list.
Your niri config on a Mac
niri config.kdl option | niri default | Ribbon | Notes |
|---|---|---|---|
preset-column-widths | 1/3, 1/2, 2/3 | preset_column_widths = 0.25, 0.33, 0.5, 0.66, 0.75, 1.0 | Editable in ribbon.toml. Set [0.333, 0.5, 0.667] for niri's exact stops |
default-column-width | 1/2 | No equivalent | New windows keep the size they opened at until you press ⌃⌥R |
center-focused-column | "never" | center_focused_column = "on-overflow" | Same three values. Also in Settings → Focus behaviour. ⌃⌥C centres on demand |
gaps | 16 | gap_inner / gap_outer = 8 | Settings slider from 0 to 64 pt |
set-column-width "±10%" | Mod+Minus / Mod+Equal | Cycle widths with ⌃⌥R; match widths with ⌃⌥B | |
window rules (open-floating) | per app | Float any window (⌃⌥Space); apps that refuse resizes are flagged after two attempts | |
| per-output strips | yes | yes, one strip per display (multiple displays) | |
| touchpad gestures | 3-finger swipe | fingers_count = 3 by default, or 4; Option + two-finger scroll also works (gestures) | Turn off macOS's own three-finger gestures first, or set fingers to Off and use Option + scroll |
Multiple monitors and Spaces
niri gives each monitor its own strip and its own workspaces. On macOS, turn on "Displays have separate Spaces" (System Settings → Desktop & Dock) for any of these apps, then pick a model:
- Native Spaces (Ribbon, Paneru, PaperWM.spoon, Maki): each Space keeps its own strip. Mission Control and Spaces swipes keep working.
- Emulated workspaces (OmniWM, Nehir): closer to niri's dynamic workspaces, but you mostly stop using macOS Spaces.
Ribbon sends a window to the next display with ⌃⌥N. More in multiple displays.
Which should you use?
- You want niri as faithfully as possible, and you're on Tahoe: OmniWM (free) or Maki (paid, with vertical strips).
- You're on macOS 14 or 15: Ribbon, Paneru or PaperWM.spoon.
- You're on macOS 13: ChainYourMac, Glidro or PaperWM.spoon.
- You want a dotfile like
config.kdl: Paneru, Nehir, OmniWM's TOML, or PaperWM.spoon's Lua. - You want a settings window and native Spaces: Ribbon.
Bottom line
You can't have niri on a Mac, but you can have its best idea. Pick the app that matches your macOS version and whether you want a dotfile or a settings window. If that's macOS 14+ with a settings window, try Ribbon.