Baike.dev
All toolsAI codingTrendingOpen sourceNewsSubmit
Log in
< Back to tools
P

paneru

> 编程语言
Open source

A sliding, tiling window manager for MacOS.

1.9K stars0 likes0 views
WebsiteGitHub

About

A sliding, tiling window manager for MacOS.

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.

https://github.com/user-attachments/assets/cbc2e820-635f-408b-923a-6cb47c44704c

(Video by @emreekici3 - https://github.com/emreekici3/dotfiles)

https://github.com/user-attachments/assets/793e7eaa-7909-4086-8380-1fb7861f8780

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.
  • Virtual Workspaces (Experimental): Group your windows into tasks by stacking multiple horizontal strips (rows) within a single space. Use native macOS workspaces for broad segregation (e.g., 'Work', 'Personal') and virtual workspaces to stay organized within each context.
  • Menu bar workspace indicator: Shows the currently active virtual workspace in the macOS menu bar.
  • Copy Window Rule: A menu bar entry that puts a ready-to-paste [windows] configuration rule for the focused window on the clipboard, so you never have to guess an app's bundle id.
  • Startup session restore: Restores managed window layouts, virtual workspaces, and display assignments from the last saved state when Paneru starts.
  • 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. An option exists (horizontal_mouse_warp) which can make a vertical arrangement of displays "feel" horizontal.

  • 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_width and sliver_height options 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 .

By default, Paneru builds with the embedded Lua runtime using a vendored LuaJIT compiled from source, requiring no system-wide Lua installation or pkg-config setup.

If you prefer to link against a system- or version-manager-installed Lua (e.g. via mise, asdf, or Homebrew), disable default features and pass --features lua, making sure PKG_CONFIG_PATH contains the directory with luajit.pc:

# When using mise:
$ PKG_CONFIG_PATH="$(mise where luajit)/lib/pkgconfig:$PKG_CONFIG_PATH" cargo build --release --no-default-features --features lua

# When using Homebrew:
$ cargo build --release --no-default-features --features lua

It can run directly from the command line or as a service. Note that you will need to grant accessibility privileges to the binary.

Installing with Homebrew

If you are using Homebrew, you can install from the formula with:

$ brew install paneru

Or by first adding the tap and then installing by name:

$ brew tap karinushka/paneru
$ brew install paneru

Installing with Nix

See nix/README.md.

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. If none of these files exists, Paneru creates $XDG_CONFIG_HOME/paneru/paneru.toml with the built-in defaults on first launch.

A Lua script ($XDG_CONFIG_HOME/paneru/init.lua, $HOME/.paneru.lua, or $PANERU_LUA) replaces the TOML rather than layering on top of it: when one exists, no paneru.toml is read, created, or watched.

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"

Alternatively, the embedded Lua runtime can declare the entire configuration via paneru.setup{...}, making the TOML file optional — see the Lua Scripting Guide:

-- init.lua
paneru.setup {
  options = { focus_follows_mouse = true, mouse_follows_focus = true },
  bindings = {
    ["window focus west"] = "cmd - h",
    ["window focus east"] = "cmd - l",
    ["quit"] = "ctrl + alt - q",
  },
}

Live reloading

Changes made to the active configuration file are automatically reloaded while Paneru is running. This is useful for tweaking keyboard bindings and other settings without restarting the application.

Startup session restore

Paneru saves managed window layout state to the user state directory ($XDG_STATE_HOME/paneru/state.json, usually ~/.local/state/paneru/state.json) and loads it when Paneru starts. During the startup restore window, Paneru matches reopened windows to the saved session and restores their layout placement, virtual workspace row, and display assignment where possible.

Restore is startup-only. After the configured startup grace period expires, new or unmatched windows follow the normal configuration and window-rule behavior. Saved windows that are not present are ignored by default and the restored layout is compacted around the windows that were found. The behavior is configured with [restore]; see the Session Restore section in the configuration guide.

Running as a service

$ paneru install
$ paneru start

Installing an app launcher

To start Paneru from Spotlight, Alfred, Raycast, or another application launcher, install the lightweight app wrapper:

$ paneru install-app

This creates $HOME/Applications/Paneru.app. Opening the app starts the installed Paneru launch agent and exits immediately. Remove the wrapper with:

$ paneru uninstall-app

Running in the foreground

$ paneru

Sending Commands

Paneru exposes a send-cmd subcommand that lets you control the running instance from the command line over a Mach service (com.github.karinushka.paneru). 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|number|managed|unmanaged> Move focus by direction, column number, managed or unmanaged
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 vertical resize Cycle a stacked window through preset_stack_heights
window vertical grow Grow a stacked window to the next preset height
window vertical shrink Shrink a stacked window to the previous preset height
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 balance Make all columns match the focused window width
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 nextdisplaysend Move the window to the next display but stay here
window virtual <dir> Switch to the previous/next virtual workspace
window virtualnum <n> Switch directly to numbered virtual workspace
window virtualmove <dir> Move the window to a different virtual workspace
window virtualmovenum <n> Move the window to numbered virtual workspace and follow it
window virtualsend <dir> Send the window to a virtual workspace but stay
window virtualsendnum <n> Send the window to numbered virtual workspace but stay
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 Pa

Issues· 0 open

View all issuesOpen on GitHub

No open issues yet, or sync has not completed.

> Tags

Rust

No comments yet. Be the first to share.

> Details

PublishedAug 1, 2026
UpdatedSep 17, 2026
Category编程语言
PricingOpen source

> Related tools

T
TypeScript
JavaScript 的超集,为前端与全栈提供静态类型
P
Python
通用编程语言,广泛用于 Web、数据与 AI
G
Go
Google 推出的简洁高效系统语言