PaperWM for Mac: your two real options
PaperWM itself is a GNOME Shell extension, so it can't run on a Mac. To get its scrolling layout on macOS you have two kinds of choice: PaperWM.spoon, a free Lua plugin for Hammerspoon that you configure in a text file, or a native app like Ribbon that you set up in a settings window.
Why there's no real PaperWM for macOS
PaperWM lives inside GNOME Shell. It relies on GNOME's window manager, Mutter, to draw and place windows. macOS has no GNOME Shell and doesn't let apps take over how windows are drawn. What a Mac app can do is move and resize other apps' windows through the Accessibility API, and that's enough to rebuild the strip.
Option 1: PaperWM.spoon
PaperWM.spoon is a plugin for Hammerspoon, the free Lua automation tool for macOS. It's inspired by GNOME's PaperWM and copies its main ideas:
- A horizontal strip of columns for each Space and each screen.
- Width cycling through a list of ratios (golden-ratio steps by default).
- "Slurp" a window into a column and "barf" it back out.
- Columns can be shown stacked like an accordion.
- A floating layer, split screen, and multi-screen support.
- An optional trackpad swipe to scroll the strip, off until you set
swipe_fingers.
It's free, MIT-licensed and actively maintained. Hammerspoon needs macOS 13 or later. You install it by cloning the repo into ~/.hammerspoon/Spoons/ and adding three lines to init.lua; the PaperWM.spoon setup guide has the steps.
Things to know:
- You'll be editing Lua. Options like gaps, widths and per-app widths live in
init.lua. Hammerspoon does nothing until you write a config. - The defaults use ⌥⌘. That clashes with some app shortcuts. ⌥⌘I, for example, also opens the developer tools in Safari and Chrome. You can rebind everything.
- One default clash. In the shipped defaults, refresh and "cycle height" are both on ⌥⌘⇧R.
- Off-screen windows stay partly visible. macOS won't let a window move fully off-screen, so tiled windows outside the view sit in a thin clickable margin at the edges. The README calls this out.
- Multiple screens should be stacked vertically in Display settings so windows don't bleed onto the neighbour.
Option 2: a native app (Ribbon)
Ribbon is a paid Mac app built for this one layout. Instead of a Lua file, every option has a control in a settings window: gap, centring mode, width presets, focus border, swipe fingers, floating rules. The trackpad swipe is on from the start and moves the strip with your fingers. A Mac Setup page checks for macOS settings that would get in the way, such as Stage Manager or a full-screen swipe on three fingers.
It runs on macOS 13 Ventura and later on Apple silicon (M1 or later), uses native Spaces with one strip per Space and per display, and needs only the Accessibility permission. Its window engine is built on Paneru, which is MIT-licensed and free if you'd rather use a TOML file and the terminal.
The trade-offs: Ribbon costs $9.99 once for one Mac, it's closed source, and it can't be scripted the way Hammerspoon can. All sales are final with no refunds (see the terms), so try the strip in the live demo first.
Keys compared
PaperWM on GNOME uses Super. PaperWM.spoon moves that to ⌥⌘. Ribbon uses ⌃⌥.
| Action | PaperWM (GNOME) | PaperWM.spoon | Ribbon |
|---|---|---|---|
| Focus left / right | Super+Left / Right | ⌥⌘← / ⌥⌘→ | ⌃⌥← / ⌃⌥→ (or H / L) |
| Move window left / right | Super+Ctrl+Left / Right | ⌥⌘⇧← / ⌥⌘⇧→ (swap) | ⌃⌥⇧← / ⌃⌥⇧→ |
| First / last window | Super+Home / End | Not in defaults | ⌃⌥⌘← / ⌃⌥⌘→ |
| Cycle width | Super+R | ⌥⌘R | ⌃⌥R |
| Full width | Super+F | ⌥⌘F | ⌃⌥F |
| Centre | Super+C | ⌥⌘C | ⌃⌥C |
| Wider / narrower | Super++ / Super+- | Not in defaults | ⌃⌥= / ⌃⌥- |
| Pull into column | Super+I | ⌥⌘I (slurp) | ⌃⌥] or ⌃⌥[ |
| Push out of column | Super+O | ⌥⌘O (barf) | ⌃⌥⇧] or ⌃⌥⇧[ |
| Cycle height | Super+Shift+R | ⌥⌘⇧R | No presets; ⌃⌥⇧= / ⌃⌥⇧- |
| Float | Scratch layer, Ctrl+Super+Escape | ⌥⌘⇧Esc | ⌃⌥T |
| Tabbed or stacked column | Not listed | ⌥⌘⇧S (stack) | ⌃⌥⇧T (tabs) |
| Switch workspace | Super+PageUp / PageDown | ⌥⌘1–⌥⌘9 | macOS ⌃← / ⌃→ |
| Move window to workspace | Ctrl+Super+PageUp / PageDown | ⌥⌘⇧1–⌥⌘⇧9 | No shortcut; Mission Control |
Pros and cons at a glance
| PaperWM.spoon | Ribbon | |
|---|---|---|
| Price | Free, MIT | $9.99 once, closed source |
| Setup | Install Hammerspoon, clone, write Lua | Install the app, allow Accessibility |
| Settings | init.lua | Settings window |
| Scripting | Full Lua through Hammerspoon | ribbon:// URLs and a CLI |
| Trackpad swipe | Opt-in, configured in Lua | On by default, 3 or 4 fingers |
| Spaces | Native Spaces, a strip each | Native Spaces, a strip each |
| Minimum macOS | 13 (Hammerspoon) | 13 Ventura |
| Support | GitHub issues | Email the developer |
Choose PaperWM.spoon if you already use Hammerspoon, like keeping config in dotfiles, or want to script the layout. It's a capable tool and costs nothing.
Choose Ribbon if you want the layout working in ten minutes without writing code, and you'd rather adjust it with switches than with Lua.
Other free choices exist too. OmniWM and Nehir follow niri more than PaperWM; niri vs PaperWM explains the difference. For the whole field, see the best scrolling window managers for Mac. When you're ready, Ribbon is on the buy page.
FAQ
Does PaperWM work on macOS?
No. PaperWM is a GNOME Shell extension and needs GNOME. On a Mac you can use PaperWM.spoon, a Hammerspoon plugin inspired by it, or a native app like Ribbon.
Is PaperWM.spoon free?
Yes. PaperWM.spoon and Hammerspoon are both free and MIT-licensed. You do need to configure them in Lua.
Does PaperWM.spoon support trackpad swipes?
Yes, but it's off by default. Set PaperWM.swipe_fingers to 2, 3 or 4 in your init.lua to turn it on.
Can I use PaperWM.spoon and Ribbon together?
No. Two window managers moving the same windows fight each other. Stop one before starting the other.
Do I need to disable SIP for either?
No. Ribbon needs only the Accessibility permission and works with System Integrity Protection on. PaperWM.spoon's install steps don't involve SIP either.