KiwiDeskKiwiDesk
A tiling window manager that feels like macOS, not a Linux terminal hack

Tiling that thinks in flat arrays

KiwiDesk manages windows in flat arrays, not i3-style trees — fully Lua-configurable, with seven layouts to switch between. And it never disables SIP.

MIT-licensed ↗ · written in Swift and Lua · signed and notarized · macOS 14+, Apple silicon

🥝 Version 1.1.2

Compare with yabai, AeroSpace and Rift

“Tiling managers were always a nerd's toy. I wanted to make them intuitive for everyone – it should just work, like that.”

“I wanted a window manager that works with you — not one you have to tell how to work.”

— Maikel Hajiabadi, The Mind Behind KiwiDesk
Meet the kiwi

Watch your windows tidy themselves

Ten playful seconds with our mascot, happily arranging a screenful of windows into place — the KiwiDesk way, just with a little extra charm.

Click to play — 10 seconds 🥝

“Fair warning: it's about as oddly satisfying as watching kiwis stack kiwis. You'll open windows on purpose, just to watch them snap into place.”

— Maikel, who still stops to watch the kiwis stack
Why KiwiDesk

Built around one idea, done well

A flat, one-dimensional window model — and everything fast, scriptable, and safe that falls out of it.

Flat arrays, not trees

Every Space is a flat window list. Layouts are pure functions over that array — no tree surgery, ever.

Seven layouts

bsp, stack, scrolling (PaperWM), monocle, grid, track, and floating. Switch between them instantly.

Lua configuration

A sandboxed Lua 5.5 VM reads ~/.config/KiwiDesk/init.lua. A broken config can’t freeze your windows — a 500 ms watchdog guards it.

CLI + socket IPC

Script everything. Stream events to SketchyBar, JankyBorders, or your own tools over a socket.

Smooth animations

One display link per monitor, so mixed 60 / 120 Hz setups each animate at their own native cadence.

No SIP disabling

No kernel extension. Modal keybindings run through Carbon — no Input Monitoring permission, no keylogger.

Sticky windows

A sticky window follows you across every Space — or just the one screen it lives on. A mark on the window and a badge in the Space Bar show you which.

VoiceOver and keyboard

Every control announces its name and its value under VoiceOver, and Settings can be driven entirely from the keyboard — with macOS’s Keyboard navigation on.

Native tabs stay put

Switch or merge tabs in Finder, Safari or Terminal and your layout holds. To a window manager every macOS tab is a separate window — where tiling usually breaks.

The seven layouts

One key away, each time

Every layout is a pure function over the same flat array — so switching is instant and predictable.

BSP

Binary space partitioning: each new window halves a pane.

Stack

A master zone beside a stack column.

Scrolling

Niri / PaperWM scrolling columns or rows.

Monocle

Focused window maximized, rest behind.

Grid

Dynamic or rigid rows × columns.

Track

Columns or rows; every resize has one true target.

Floating

The macOS default, left untouched.

Configuration

Script it in Lua

Prefer text to sliders? Drop real Lua into ~/.config/KiwiDesk/init.lua and it takes over — layouts, gaps, keybindings, all as code, running in a sandboxed Lua 5.5 VM behind a 500 ms watchdog so a typo can never freeze your windows.

init.lua
-- ~/.config/KiwiDesk/init.lua
KiwiDesk.set_gap_global(10)
KiwiDesk.set_mode("music", "floating")

-- one flat array per space, tidy by default
KiwiDesk.bind("cmd+alt+left", function()
    KiwiDesk.focus("left")
end)
Command line

Drive it from the terminal

Every action is a command. Bind them to keys, script them, or stream live events over a Unix socket into SketchyBar, JankyBorders, or your own tools.

“The day my window manager became scriptable, my desktop started running itself. I haven't dragged a window since.”

— Maikel, who taught the kiwis to tidy up after themselves
zsh — kiwidesk
$ kiwidesk set_mode monocle
$ kiwidesk focus left
$ kiwidesk get_state
# stream live events (feed SketchyBar, your own tools…)
$ kiwidesk subscribe space_change

“Even though I'm perfectly comfortable in the terminal, I got tired of having to constantly track container nesting just to arrange my windows the way I want. KiwiDesk keeps everything flat. No unnecessary overhead, no distractions: just pure focus on my projects.”

Quick start

Install KiwiDesk

Prefer a package manager? One command, and the kiwidesk CLI lands on your PATH. Either way KiwiDesk keeps itself up to date from there.

Read the Docs

The signed, notarized disk image is the same app — after installing it that way you link the kiwidesk CLI onto your PATH yourself, which the CLI guide covers.

zsh — install
$ brew install --cask kiwicanopy/tap/kiwidesk
# the kiwidesk CLI lands on your PATH
Download now

MIT-licensed ↗ · written in Swift and Lua · signed and notarized · macOS 14+, Apple silicon

Or build it from source
zsh — build
$ git clone https://github.com/KiwiCanopy/KiwiDesk.git
$ cd KiwiDesk
$ swift build -c release
# for contributors — Homebrew is the easy path
Ready when you are

Give your screen a little peace

Download KiwiDesk, or install it with Homebrew — it’s the same signed build either way, and it keeps itself up to date from there.

MIT-licensed ↗ · written in Swift and Lua · signed and notarized · macOS 14+, Apple silicon

KiwiDesk is free and open source — a star on GitHub helps other people find it.

“They say an apple a day — but the kiwi's got more vitamins and bigger plans... 🥝”