A small native tiling window manager for macOS.
It tiles normal document windows with a dwm-style master-stack layout and emulates workspaces by moving inactive workspace windows offscreen. It uses Swift, public macOS APIs, and zero runtime dependencies. It does not require SIP changes.
Inspired by dwm and AeroSpace.
brew install --cask basuev/parket/parketOpen parket from Applications. On first launch, parket opens the Accessibility prompt. Grant access, then choose Recheck in the permission window or Recheck Accessibility from the menubar.
Homebrew is the normal install path. Release zips use ad-hoc signing.
- macOS 14+
- Apple Silicon
- Accessibility permission
| Key | Action |
|---|---|
Option + 1-9 |
Switch workspace |
Option + Shift + 1-9 |
Move focused window to workspace |
Option + J/K |
Focus next or previous window |
Option + Return |
Swap focused window with master |
Option + Tab |
Switch to last active workspace |
Option + M |
Toggle monocle layout |
Option + , / Option + . |
Focus previous or next monitor |
Option + Shift + , / Option + Shift + . |
Move window to previous or next monitor |
Command+Tab remains the macOS app switcher. If it selects a window on another parket workspace, parket opens that workspace and focuses the selected window.
Menubar commands: Pause Tiling, Retile Now, Pause and Restore Windows, Open Config, Copy Diagnostic Report, Reload Config.
- 9 workspaces per display.
- Master-stack and monocle layouts.
- One native tab group counts as one tileable window.
- Panels, dialogs, minimized windows, fullscreen windows, and dead AX elements stay out of workspace state.
- Recovery actions bring tracked windows back onscreen.
Edit ~/.config/parket/config.toml. All fields are optional.
workspace_count = 9
master_ratio = 0.55
modifier = "option"
[bindings]
focus_next = "j"
focus_prev = "k"
swap_master = "return"
toggle_layout = "m"
last_workspace = "tab"
[[custom]]
key = "shift+return"
command = "open -n -a Terminal"Bindings use the configured modifier key. Prefix a key with shift+ to add Shift. See config.example.toml for supported key names and defaults.
Use Reload Config from the menubar after editing.
make install
open /Applications/parket.appRun the required local gate:
make checkmake check runs formatting, policy checks, tests, and a release build. See Tests/Smoke/README.md for AX smoke checks and docs/benchmarks.md for latency runs.
brew update
brew upgrade --cask basuev/parket/parketSource install:
git pull
make installSource installs replace only Contents/MacOS/parket, so Accessibility permission survives the update.
brew uninstall --cask basuev/parket/parket
rm -rf /Applications/parket.appSource checkout:
make uninstallThe latency harness measures hotkey dispatch to the expected visible, focused fixture window.
Latest local two-display matrix, 2026-06-14:
| Scenario | parket | AeroSpace |
|---|---|---|
| Default focus p95 | 9.5 ms | 29.7 ms |
| Multi-monitor focus p95 | 15.2 ms | 38.9 ms |
| Native-tabs scenario | Passed | Failed correctness |
See docs/benchmarks.md for the full matrix, run notes, and claim wording.
Use issues for reproducible bugs, app compatibility reports, and scoped feature proposals. Good reports include macOS version, install method, affected apps, steps to reproduce, and the diagnostic report when relevant.
PRs should be small, pass make check, and preserve the project constraints: public macOS APIs, no runtime dependencies, small native code, recoverable window movement.
MIT