Paneru
A sliding, tiling window manager for MacOS.
Install / Use
/learn @karinushka/PaneruREADME
Paneru
A sliding, tiling window manager for MacOS.
About
Paneru is a MacOS window manager that arranges windows on an infinite strip, extending to the right. A core principle is that opening a new window will never cause existing windows to resize, maintaining your layout stability.
Each monitor operates with its own independent window strip, ensuring that windows remain confined to their respective displays and do not "overflow" onto adjacent monitors.
<video src="https://github.com/user-attachments/assets/cbc2e820-635f-408b-923a-6cb47c44704c"></video>
Why Paneru?
- Niri-like Behavior on MacOS: Inspired by the user experience of [Niri], Paneru aims to bring a similar scrollable tiling workflow to MacOS.
- Works with MacOS workspaces: You can use existing workspaces and switch between them with keyboard or touchpad gestures - with a separate window strip on each. Drag and dropping windows between them works as well.
- Focus follows mouse on MacOS: Very useful for people who would like to avoid an extra click.
- Sliding windows with touchpad: Using a touchpad is quite natural for navigation of the window pane.
- Native macOS tabs support: Applications like Ghostty use these, so Paneru manages them on the layout strip like other windows.
- Optimal for Large Displays: Standard tiling window managers can be suboptimal for large displays, often resulting in either huge maximized windows or numerous tiny, unusable windows. Paneru addresses this by providing a more flexible and practical arrangement.
- Improved Small Display Usability: On smaller displays (like laptops), traditional tiling can make windows too small to be productive, forcing users to constantly maximize. Paneru's sliding strip approach aims to provide a better experience without this compromise.
Inspiration
The fundamental architecture and window management techniques are heavily inspired by [Yabai], another excellent MacOS window manager. Studying its source code has provided invaluable insights into managing windows on MacOS, particularly regarding undocumented functions.
The innovative concept of managing windows on a sliding strip is directly inspired by [Niri] and [PaperWM.spoon].
Installation
Recommended System Options
-
Like all non-native window managers for MacOS, Paneru requires accessibility access to move windows. Once it runs you may get a dialog window asking for permissions. Otherwise check the setting in System Settings under "Privacy & Security -> Accessibility".
-
Check your System Settings for "Displays have separate spaces" option. It should be enabled - this allows Paneru to manage the workspaces independently.
-
Multiple displays. Paneru is moving the windows off-screen, hiding them to the left or right. If you have multiple displays, for example your laptop open when docked to an external monitor you may experience weird behavior. The issue is that when MacOS notices a window being moved too far off-screen it will relocate it to a different display - which confuses Paneru! The solution is to change the spatial arrangement of your additional display - instead of having it to the left or right, move it above or below your main display. A similar situation exists with Aerospace window manager.
-
Off-screen window slivers. Because macOS will forcibly relocate windows that are moved fully off-screen, Paneru keeps a thin sliver of each off-screen window visible at the screen edge. The
sliver_widthandsliver_heightoptions control the size of this sliver. This is a workaround for a macOS limitation, not a design choice.
Installing from Crates.io
Paneru is built using Rust's cargo. It can be installed directly from
crates.io or if you need the latest version, by fetching the source from Github.
$ cargo install paneru
Installing from Github
$ git clone https://github.com/karinushka/paneru.git
$ cd paneru
$ cargo build --release
$ cargo install --path .
It can run directly from the command line or as a service. Note, that you will need to grant acessibility priviledge to the binary.
Installing with Homebrew
If you are using Homebrew, you can install from the formula with:
$ brew install karinushka/paneru/paneru
Or by first adding the tap and then installing by name:
$ brew tap karinushka/paneru
$ brew install paneru
Installing with Nix
Add the paneru flake to your inputs.
# flake.nix
inputs.paneru = {
url = "github:karinushka/paneru";
inputs.nixpkgs.follows = "nixpkgs";
}
Home Manager
Paneru provides a home manager module to install and configure paneru.
[!NOTE] You still need to enable accessibility permissions in the macOS settings the first time paneru is launched or any time it is updated.
# home.nix
{ inputs, ... }:
{
imports = [
inputs.paneru.homeModules.paneru
];
services.paneru = {
enable = true;
# Equivalent to what you would put into `~/.paneru` (See Configuration options below).
settings = {
options = {
preset_column_widths = [
0.25
0.33
0.5
0.66
0.75
];
animation_speed = 4000;
};
swipe = {
gesture = {
fingers_count = 4;
direction = "Natural";
};
};
bindings = {
window_focus_west = "cmd - h";
window_focus_east = "cmd - l";
window_focus_north = "cmd - k";
window_focus_south = "cmd - j";
window_swap_west = "alt - h";
window_swap_east = "alt - l";
window_swap_first = "alt + shift - h";
window_swap_last = "alt + shift - l";
window_center = "alt - c";
window_resize = "alt - r";
window_fullwidth = "alt - f";
window_manage = "ctrl + alt - t";
window_stack = "alt - ]";
window_unstack = "alt + shift - ]";
quit = "ctrl + alt - q";
};
};
};
}
Standalone Package
Although we strongly recommend using home manager, the paneru flake also exposes a standalone package.
{ inputs, ... }:
{
# nix-darwin configuration (configuration.nix)
# system-wide
environment.systemPackages = [ inputs.paneru.packages.${pkgs.system}.paneru ]
# or per-user
users.users."<name>".packages = [ inputs.paneru.packages.${pkgs.system}.paneru ]
}
Configuration
Paneru checks for configuration in following locations:
$HOME/.paneru$HOME/.paneru.toml$XDG_CONFIG_HOME/paneru/paneru.toml
Additionally it allows overriding the location with $PANERU_CONFIG environment variable.
You can use the following basic configuration as a starting point. For a complete guide to all available options, keybindings, and window rules, see the Configuration Guide.
# basic .paneru.toml
[options]
focus_follows_mouse = true
mouse_follows_focus = true
[bindings]
window_focus_west = "cmd - h"
window_focus_east = "cmd - l"
window_resize = "alt - r"
window_center = "alt - c"
quit = "ctrl + alt - q"
Live reloading
Configuration changes made to your ~/.paneru file are automatically reloaded
while Paneru is running. This is useful for tweaking keyboard bindings and
other settings without restarting the application.
Running as a service
$ paneru install
$ paneru start
Running in the foreground
$ paneru
Sending Commands
Paneru exposes a send-cmd subcommand that lets you control the running
instance from the command line via a Unix socket (/tmp/paneru.socket). Any
command that can be bound to a hotkey can also be sent programmatically:
$ paneru send-cmd <command> [args...]
Available commands
| Command | Description |
| -------------------------- | ------------------------------------------------ |
| window focus <direction> | Move focus to a window in the given direction |
| window swap <direction> | Swap the focused window with a neighbour |
| window center | Center the focused window on screen |
| window resize | Cycle through preset_column_widths |
| window grow | Grow to the next preset width |
| window shrink | Shrink to the previous preset width |
| window fullwidth | Toggle full-width mode for the focused window |
| window manage | Toggle managed/floating state |
| window equalize | Distribute equal heights in the focused stack |
| window stack | Stack the focused window onto its left neighbour |
| window unstack | Unstack the focused window into its own column |
| window nextdisplay | Move the focused window to the next display |
| window snap | Snap the focused window into the visible viewport |
| mouse nextdisplay | Warp the mouse pointer to the next display |
| printstate | Print the internal ECS state to the debug log |
| quit | Quit Paneru |
Where <direction> is one of: west, east, north, south, first, last.
Examples
# Move focus one window to the right.
$ paneru send-cmd window focus east
# Swap the current window to the left.
$ paneru send-cmd window swap west
# Center and resize in one shot (two separate calls).
$ paneru send-cmd window center && paneru send-cmd window resize
# Cycle backward through preset widths.
$ paneru send-cmd window shrink
# Jump to the left-most window.
$ paneru send-cmd window focus first
Scripting ideas
Because send-cmd works over a Unix sock
Related Skills
node-connect
340.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
340.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
84.1kCommit, push, and open a PR
