Tiling for macOS
A Hyprland-style tiling window manager for the Mac. Your real app windows — kitty, Safari, Finder, anything — arranged in a dwindle layout with gaps, across ten virtual workspaces that live in the macOS menu bar.
On Linux, a tiling compositor like Hyprland places every window for you: no dragging, no overlapping, no hunting for the one underneath. The keyboard moves focus, swaps windows and switches workspaces, and the whole layout is one plain config file.
Shoji brings that way of working to macOS, for the apps you already use. It doesn't replace the Mac's desktop or ask you to turn off System Integrity Protection. It arranges ordinary windows through the Accessibility API, keeps them clear of the menu bar and the Dock, and gets out of the way when you quit — every window comes back on screen.
New windows split the focused tile, alternating sides, with inner and outer gaps. Drag a border to resize; drop a tile on another to swap them.
Ten virtual workspaces, shown as numbered pills next to the clock. Switching is instant — no macOS Spaces animation, no private APIs.
Hyprland's bindings on ⌥ (or ⌃⌥, or ⌘): focus, move, resize, float, fullscreen, pin and send windows to workspaces. ⌥-drag moves any window.
shoji.conf is hyprland.conf-style — binds, window rules, floating workspaces, startup programs. It reloads on save and shows errors in a banner.
The Lucent theme set — Catppuccin, Tokyo Night, Gruvbox, Nord, Rosé Pine and more. A theme also sets kitty's colours, the wallpaper, Dark or Light mode and the accent colour.
Two companion apps: Linux VMs from cloud images on Apple's Virtualization framework (⌥M), and Docker containers and images (⌥O).
Mod is ⌥ Option by default. ⌥/ shows every binding.
| ⌥ ↩ | Terminal (kitty) |
|---|---|
| ⌥ ⇧ D | App launcher |
| ⌥ ← → ↑ ↓ | Move focus |
| ⌥ ⇧ ← → ↑ ↓ | Swap windows |
| ⌥ ⌃ ← → ↑ ↓ | Resize |
| ⌥ 1 … 0 | Go to workspace |
| ⌥ ⇧ 1 … 0 | Send window to workspace |
| ⌥ F · ⌥ ⌃ V · ⌥ J | Fullscreen · float · flip the split |
| ⌥ Q | Close window |
| ⌥ M · ⌥ O · ⌥ I | Machines · Containers · Stats |
| ⌥ , | Settings |
Everything you'd expect from hyprland.conf, in
~/.config/shoji/shoji.conf. The first start writes a
commented file listing every key, dispatcher and rule.
# your own bindings ($mod follows the modifier in Settings) bind = $mod, T, exec, open -na kitty --args htop bind = $mod SHIFT, B, exec, open -na "Google Chrome" # window rules windowrule = float, app:Calculator windowrule = workspace 3 silent, app:Mail windowrule = size 1100 700, app:kitty, title:^htop # a floating workspace, and programs to start once per login workspace = 9, floating exec-once = open -ga Docker
/Applications.
brew install --cask kitty, or from
sw.kovidgoyal.net/kitty.
Containers also needs Docker.
Use a single macOS Space — Shoji's workspaces take their place. Only the main display is managed for now. To quit, press ⌥⇧M or use the menu-bar menu; every window comes back on screen.
One disk image with the installer for all three apps. Apple silicon, macOS 13 Ventura or later. No developer tools needed.