Tiling that feels like it shipped with macOS. Settings instead of config files, seven layouts incl. PaperWM-style scrolling, native Desktops kept intact, Lua underneath. Accessibility only, never SIP.
See the code
Flat arrays instead of i3 trees · configured in Lua · seven layouts · never disables SIP.
Start simple. Grow without limits. KiwiDesk tiles your windows the moment you install it — no config required. When you want more, go deeper: custom Lua, profiles, advanced layouts, per-space rules. Powerful when you reach for it, never in your way.

KiwiDesk is written in Swift and configured in Lua. It pairs robust window tracking with smooth, spring-based animations, runs as an ordinary app with no kernel extension, and never requires disabling System Integrity Protection.
It feels like it shipped with macOS. Most tiling window managers on the Mac are a Linux idea carried over — a config file, a reload, a terminal, and for some of them SIP switched off. KiwiDesk is a Mac app first: a real Settings window with sliders and live previews, shortcuts that don't fight macOS's own, a mouse that still works, your native Desktops left exactly as they are, and the Accessibility permission and nothing else. Same tiling power — the platform's own feel.
Flat arrays instead of i3 trees. Classic tiling window managers organize windows in split-container trees — powerful, but hard to predict and hard to script. KiwiDesk keeps every space as a flat, one-dimensional list of windows. Layouts are pure functions over that list:
| Layout | Behavior |
|---|---|
bsp | Binary space partitioning (each new window halves a pane) |
stack | Master zone + stack column (master_count) |
scrolling | Niri/PaperWM-style scrolling columns or rows |
monocle | Focused window maximized, rest behind it |
grid | Dynamic (auto-balanced) or rigid rows × columns |
track | Resizable columns (or rows) with per-track control |
floating | macOS default behavior, untouched |
Switching layouts instantly rearranges the same window list with a different formula — no tree surgery, no lost state.
Every layout is fully reconfigurable. Each one carries its own
optional parameters — bsp's split ratios and strategy, stack's
master count, ratio and side, scrolling's column width and
direction, grid's dimensions and fill, track's per-track sizes
— so the shape a layout opens in is yours to set, once, as the
default. Tune them in the Settings app or in Lua, globally or per
space; most tiling window managers give you a layout's formula and
nothing to bend it with.
define_layer)
and smart app switching (pull_or_spawn) via Carbon — zero Input
Monitoring needed.kiwidesk subscribe).monocle maximizes a window on the
current space instead of throwing it onto a far-right Desktop.⌘Tab black holes: pull_or_spawn opens the app, pulls its
windows front-and-center, then cycles them on repeated presses.Requirements: macOS 14 or later, on Apple silicon.
brew install --cask kiwicanopy/tap/kiwidesk
Or download the .dmg — the
same signed, notarized app; the cask additionally puts the kiwidesk
CLI on your PATH. Either way KiwiDesk keeps itself up to date.
On first launch a wizard walks you through the Accessibility permission, then tiles your windows straight away. Everything past that — Settings, the CLI, Lua — is in the Quick Start.
For contributors, or to run an unreleased commit. Requirements: macOS 14+, Xcode 16+ / Swift 6.
git clone https://github.com/KiwiCanopy/KiwiDesk.git
cd KiwiDesk
swift build -c release
.build/release/KiwiDesk # run the app
Full docs live at kiwidesk.kiwicanopy.com (searchable, light/dark):
KiwiDesk is built to be contributor-friendly (including for AI coding agents — small files, strict lint, exhaustive tests). See CONTRIBUTING.md and AGENTS.md.
./scripts/install-hooks.sh # once after cloning
swift test # the full suite
KiwiDesk needs only the Accessibility permission. It never asks you to disable SIP and never requests Input Monitoring. To report a vulnerability, see SECURITY.md.
Business Source License 1.1: the source is public, and using KiwiDesk is free — at home and at work. Offering, selling, bundling or hosting KiwiDesk or a derivative as a product or service needs a commercial license. Each version converts to the MIT License four years after it is first published. Versions published before 1.3.0 were released under MIT and stay MIT. Bundles Lua 5.5 (MIT) and Sparkle (MIT); their notices are in ACKNOWLEDGEMENTS, which the app carries beside its license text and opens from Settings ▸ About.
"KiwiDesk" and the KiwiDesk logo are trademarks of Maikel Hajiabadi; the license grants no right to them.
KiwiDesk's source is public. If you like it, leave a ⭐ — it is the one thing that helps other people find it.
Swift
94.0%
Python
2.3%
Astro
1.5%
Tiling that feels like it shipped with macOS. Settings instead of config files, seven layouts incl. PaperWM-style scrolling, native Desktops kept intact, Lua underneath. Accessibility only, never SIP.
See the code
Flat arrays instead of i3 trees · configured in Lua · seven layouts · never disables SIP.
Start simple. Grow without limits. KiwiDesk tiles your windows the moment you install it — no config required. When you want more, go deeper: custom Lua, profiles, advanced layouts, per-space rules. Powerful when you reach for it, never in your way.

KiwiDesk is written in Swift and configured in Lua. It pairs robust window tracking with smooth, spring-based animations, runs as an ordinary app with no kernel extension, and never requires disabling System Integrity Protection.
It feels like it shipped with macOS. Most tiling window managers on the Mac are a Linux idea carried over — a config file, a reload, a terminal, and for some of them SIP switched off. KiwiDesk is a Mac app first: a real Settings window with sliders and live previews, shortcuts that don't fight macOS's own, a mouse that still works, your native Desktops left exactly as they are, and the Accessibility permission and nothing else. Same tiling power — the platform's own feel.
Flat arrays instead of i3 trees. Classic tiling window managers organize windows in split-container trees — powerful, but hard to predict and hard to script. KiwiDesk keeps every space as a flat, one-dimensional list of windows. Layouts are pure functions over that list:
| Layout | Behavior |
|---|---|
bsp | Binary space partitioning (each new window halves a pane) |
stack | Master zone + stack column (master_count) |
scrolling | Niri/PaperWM-style scrolling columns or rows |
monocle | Focused window maximized, rest behind it |
grid | Dynamic (auto-balanced) or rigid rows × columns |
track | Resizable columns (or rows) with per-track control |
floating | macOS default behavior, untouched |
Switching layouts instantly rearranges the same window list with a different formula — no tree surgery, no lost state.
Every layout is fully reconfigurable. Each one carries its own
optional parameters — bsp's split ratios and strategy, stack's
master count, ratio and side, scrolling's column width and
direction, grid's dimensions and fill, track's per-track sizes
— so the shape a layout opens in is yours to set, once, as the
default. Tune them in the Settings app or in Lua, globally or per
space; most tiling window managers give you a layout's formula and
nothing to bend it with.
define_layer)
and smart app switching (pull_or_spawn) via Carbon — zero Input
Monitoring needed.kiwidesk subscribe).monocle maximizes a window on the
current space instead of throwing it onto a far-right Desktop.⌘Tab black holes: pull_or_spawn opens the app, pulls its
windows front-and-center, then cycles them on repeated presses.Requirements: macOS 14 or later, on Apple silicon.
brew install --cask kiwicanopy/tap/kiwidesk
Or download the .dmg — the
same signed, notarized app; the cask additionally puts the kiwidesk
CLI on your PATH. Either way KiwiDesk keeps itself up to date.
On first launch a wizard walks you through the Accessibility permission, then tiles your windows straight away. Everything past that — Settings, the CLI, Lua — is in the Quick Start.
For contributors, or to run an unreleased commit. Requirements: macOS 14+, Xcode 16+ / Swift 6.
git clone https://github.com/KiwiCanopy/KiwiDesk.git
cd KiwiDesk
swift build -c release
.build/release/KiwiDesk # run the app
Full docs live at kiwidesk.kiwicanopy.com (searchable, light/dark):
KiwiDesk is built to be contributor-friendly (including for AI coding agents — small files, strict lint, exhaustive tests). See CONTRIBUTING.md and AGENTS.md.
./scripts/install-hooks.sh # once after cloning
swift test # the full suite
KiwiDesk needs only the Accessibility permission. It never asks you to disable SIP and never requests Input Monitoring. To report a vulnerability, see SECURITY.md.
Business Source License 1.1: the source is public, and using KiwiDesk is free — at home and at work. Offering, selling, bundling or hosting KiwiDesk or a derivative as a product or service needs a commercial license. Each version converts to the MIT License four years after it is first published. Versions published before 1.3.0 were released under MIT and stay MIT. Bundles Lua 5.5 (MIT) and Sparkle (MIT); their notices are in ACKNOWLEDGEMENTS, which the app carries beside its license text and opens from Settings ▸ About.
"KiwiDesk" and the KiwiDesk logo are trademarks of Maikel Hajiabadi; the license grants no right to them.
KiwiDesk's source is public. If you like it, leave a ⭐ — it is the one thing that helps other people find it.
Swift
94.0%
Python
2.3%
Astro
1.5%