spool

$ spool focus-right

A scrolling window manager for macOS.

Windows sit side by side on one endless strip. A new window never makes the other windows smaller. You move the view with the keyboard, a trackpad swipe or the CLI.

  • Free
  • Source on GitHub
  • CLI with JSON state
  • macOS 13 or later

Try it. Click the strip, then press → or ⌃⌥L.Swipe the strip left or right.

your display
minimap

    Open a few windows. Watch the widths list: only the new column has a new width. On a phone, swipe the strip or use the buttons. This page models the idea. The real app moves real windows.

    The idea

    Scroll the view. Keep the size.

    A tiling manager cuts the screen into pieces. Open one more window and every piece gets smaller. Spool does not cut. It lays windows on a strip that is wider than the display.

    Grid

    The screen is shared. Each new window takes a part.

    Strip

    Each window keeps its width. The view moves.

    Animation of the strip. Focus moves right. A new window opens to the right of the focused one. The other windows keep their width.
    The same picture is in the README. The dashed frame is your screen.

    No shrinking

    Opening a window never makes the other windows smaller. The strip gets longer. Your windows keep their width.

    One strip each

    Every display and every Space has its own strip. The strips come back after you restart the app.

    Move the view

    Use a key, a trackpad swipe or a CLI command. Springs move the view. A new key press changes the target of the move in progress, so the view never stops and starts again.

    Install

    Build it. Run it. One permission.

    There is no download. You build Spool from source. You need macOS 13 or later and the Xcode Command Line Tools.

    # once: xcode-select --install
    git clone https://github.com/fskroes/Spool.git
    cd Spool
    SPOOL_UPDATES=off SIGN_IDENTITY=- make install
    open /Applications/Spool.app
    1. make install builds dist/Spool.app, signs it ad hoc and copies it to /Applications. When you cannot write to /Applications, it uses ~/Applications: then open ~/Applications/Spool.app. It also links the spool tool to ~/.local/bin. If that folder is not on your PATH, the install prints the line to add to ~/.zshrc.
    2. Open the app. The guide at first launch asks for the Accessibility permission.
    3. Grant Accessibility in System Settings > Privacy & Security > Accessibility. It is the only permission Spool needs.

    Why SIGN_IDENTITY=-? The release signing identity is only on the maintainer's Mac. Without it, a plain make install stops with "the local signing identity is not found". SIGN_IDENTITY=- signs your build ad hoc instead.

    Why SPOOL_UPDATES=off? Every build from this repository reads Packaging/updates.env and checks the maintainer's update feed on github.com. An update from that feed has the maintainer's signature, so your Mac would see a different app and Spool would lose the Accessibility permission. SPOOL_UPDATES=off builds an app with no update feed. It makes no network requests. To update, run git pull and the same make install again.

    An ad hoc build gets a new signature each time you rebuild. After each rebuild, click Settings > Mac Setup > Reset Permission and turn Spool on again. With an Apple Development or Developer ID identity from Xcode, use SIGN_IDENTITY="<name or SHA-1>" make install instead. Details: docs/INSTALL.md.

    Status: personal signing, not notarized, build from source. The source is public, but there is no license file yet.

    Shortcuts

    Control and Option. Plain Option stays free.

    All default shortcuts use ⌃⌥, so Option still types accented characters. Shift means move. Command means to the end.

    Focus

    Left
    ⌃⌥H ⌃⌥←
    Right
    ⌃⌥L ⌃⌥→
    Up in stack
    ⌃⌥K ⌃⌥↑
    Down in stack
    ⌃⌥J ⌃⌥↓
    First / last
    ⌃⌥⌘← ⌃⌥⌘→
    Place 1 to 8
    ⌃⌥1 to ⌃⌥8
    Last place
    ⌃⌥9

    Move

    Column left
    ⌃⌥⇧H
    Column right
    ⌃⌥⇧L
    Window up in stack
    ⌃⌥⇧K
    Window down in stack
    ⌃⌥⇧J
    To first place
    ⌃⌥⇧⌘←
    To last place
    ⌃⌥⇧⌘→

    Width and stacks

    Cycle preset widths
    ⌃⌥R
    Full width
    ⌃⌥F
    Wider / narrower
    ⌃⌥= ⌃⌥-
    Center column
    ⌃⌥C
    Stack into left / right
    ⌃⌥[ ⌃⌥]
    Tabbed column
    ⌃⌥⇧T
    Start / stop
    ⌃⌥Q

    Trackpad: swipe left or right with 4 fingers, or with 3 when you choose that in Settings. Lift with speed to fling. The strip stops on a column edge. Every shortcut can be changed in Settings > Shortcuts. Full list: docs/SHORTCUTS.md.

    Automation

    A CLI that agents and scripts can read.

    The spool tool sends one request to the running app. It prints nothing when a command works. Add --json to get the full state for a script.

    spool focus-right
    spool state
    spool state --json | jq -r '.state.displays[].columns[][].bundleID'
    spool stats
    # the same commands as a URL
    open -g spool://focus-right
    open spool://settings/shortcuts

    Example output of spool state, from docs/CLI.md

    Engine: running. Accessibility: granted.
    Focused: Terminal "zsh" (window 202)
    Display: Built-in Retina Display (on, space 5)
      [1] Safari "Apple" | [2*] Terminal "zsh" + Notes

    * marks the focused column. + joins the windows of a stacked column. spool stats shows live frame write times, Spool's own part of them, command latency and the slowest apps. Raycast: the folder Integrations/Raycast has Script Commands for the main commands and a "Spool State" command. The jq line needs jq (brew install jq). More: docs/CLI.md.

    Speed

    Measured, with the budget next to it.

    Numbers from make bench on 2026-10-13. Apple silicon, macOS 26, load average 4.8. Your Mac will differ, so run the bench yourself.

    Bar length is the measured time as a share of the budget from docs/SPEC.md.
    MetricBudgetMeasuredShare of budget
    Layout and placement of 50 columns, per frame< 50 µs6.3 µs
    Frame write, 6 apps with 2 ms AX latency each, p95 of 100 rounds< 4 ms3.18 ms
    Spool's part of that frame write, p95< 1 ms0.12 ms

    Writing the same six frames one after the other takes 18.1 ms. Spool writes to each app on its own queue and keeps only the newest frame for a busy app. When all windows are at rest there is no timer and no display link. The rest of a frame write is the time apps and WindowServer need to answer the AX calls. Spool cannot make that shorter. Details: README.

    Features

    What is in the box.

    • Endless horizontal strip per display and per Space
    • Spring animations that follow a new key press at once
    • Minimap of the strip when the view moves
    • Stacks and tabbed columns
    • Preset widths, full width, wider and narrower
    • Center the focused column: never, on overflow, always
    • Trackpad swipe with 3 or 4 fingers, with fling and snap
    • Drag a window to a new place; resize from an edge sets the width
    • Multi-monitor, one strip each
    • Per-app rules: tile, float, fixed place
    • Focus border and dimming of other windows
    • Launch at login; the strips come back after a restart
    • Every shortcut can be changed
    • Local metrics and spool report

    Honest status

    What you should know first.

    Is there a download?

    No. Releases are signed with a personal certificate and are not notarized, so they are for the owner's own Macs. You build Spool from source with make install.

    Why not a plain make install?

    The release signing identity is only on the maintainer's Mac, so a plain make install stops for everyone else. The install section explains the ad hoc build.

    What does Spool send out?

    Spool measures its own speed, cost and problems on your Mac. The metrics never leave your Mac. They keep no window titles and no keys. You can turn the metrics off in Settings > General. The only network use is the Sparkle update check. A plain make install turns it on and checks the maintainer's feed on github.com. The install command on this page uses SPOOL_UPDATES=off, so that build makes no network requests.

    Is it open source?

    Not yet. The source is public on GitHub, but the repository has no license file. Until a license is added, the default copyright rules apply.

    Are there known limits?

    Window focus uses private SkyLight calls, as other window managers on macOS do. Trackpad swipes use the private MultitouchSupport framework. A future macOS can change them. Spool then falls back to normal app activation for focus.

    Can I use it on a work Mac?

    If your employer manages the Mac, ask IT first. See the install guide, section "Use on a managed work Mac".

    Was it called Striple?

    Yes. Spool had the name Striple before. make install replaces Striple, and Spool moves your settings at its first start. See the install guide, section "Upgrade from Striple".

    Is it a copy of another app?

    No. Spool is a clean-room app. It follows the public descriptions of niri and PaperWM and the public feature pages of similar macOS apps. No third-party binary was decompiled.