OpenNiri-Windows is a scrollable tiling window manager for Windows 10/11, built in Rust.
It brings the Niri-style horizontal workspace model to native Windows without replacing DWM.
Most Windows tilers are tree/BSP-driven. OpenNiri-Windows is scroll-first:
- Windows are arranged on a horizontal strip.
- Your monitor acts as a viewport over that strip.
- Navigation remains spatially consistent as windows are added.
- You move through workspace context instead of constantly rebuilding split trees.
- Keyboard-driven users who manage many windows every day.
- Engineers, analysts, operators, and creators on single or multi-monitor setups.
- Teams that want an open-source Windows tiler with transparent architecture and Rust codebase.
Implemented now:
- Multi-monitor workspaces with monitor-aware focus and move commands
- Global hotkeys with live config reload
- Floating and fullscreen toggles
- Width presets (
Alt+1/2/3) and equalize (Alt+0) - Smooth scroll animations, snap hints, and touchpad gestures (experimental, off by default)
- Optional focus-follows-mouse
- System tray actions (pause/reload/open config/open logs/exit)
- Workspace persistence and safer shutdown/recovery behavior
- Safe mode for troubleshooting (
--safe-mode) - Built-in diagnostics (
openniri-cli doctor)
OpenNiri-Windows is alpha and under active development.
What this means in practice:
- Core behavior is implemented and tested in CI.
- UX is currently keyboard/config-first (no full GUI setup flow yet).
- Some Windows-managed/system windows can reject movement or styling operations.
- Current release state (as of 2026-02-08): no tagged public release yet, so source build is the primary install path.
- Open GitHub Releases
- If a tagged release is available, download the latest
.ziparchive - Extract
openniri.exeandopenniri-cli.exeto a folder - (Optional) Add the folder to your
PATH - Generate a default config:
openniri-cli init - Start the daemon:
openniri-cli run
Prerequisites: Rust GNU toolchain (stable-x86_64-pc-windows-gnu) and MinGW linker
rustup toolchain install stable-x86_64-pc-windows-gnu
git clone https://github.com/AdEx-Partners-DE/OpenNiri-Windows.git
cd OpenNiri-Windows
cargo +stable-x86_64-pc-windows-gnu build --release
cargo +stable-x86_64-pc-windows-gnu run -p openniri-cli -- init
cargo +stable-x86_64-pc-windows-gnu run -p openniri-cli -- runThe workspace is configured for GNU (x86_64-pc-windows-gnu) in .cargo/config.toml, and binaries are placed in target/release/.
| Step | Command | What It Does |
|---|---|---|
| Create config | openniri-cli init |
Writes a default config.toml with comments |
| Start daemon | openniri-cli run |
Launches the window manager in the background |
| Check status | openniri-cli status |
Shows version, monitors, windows, uptime |
| Toggle pause | openniri-cli toggle-pause (alias: pause) |
Pauses/resumes tiling without stopping the daemon |
| Run diagnostics | openniri-cli doctor |
Checks binary, config, daemon, and system state |
| Stop daemon | openniri-cli stop |
Requests shutdown, waits for teardown confirmation, and runs local emergency restore if confirmation fails |
| Emergency local restore | openniri-cli emergency-uncloak (alias: restore-windows) |
Best-effort local visibility restore without daemon IPC |
| Reload config | openniri-cli reload |
Applies config changes without restarting |
If the desktop becomes unresponsive or focus gets trapped, use non-destructive recovery first:
openniri-cli panic-revert
openniri-cli status # must fail (timeout OR "Daemon is not running...") before rerun
If panic-revert cannot confirm daemon response, it now also executes a local visibility restore path automatically.
openniri-cli stop now uses the same local restore safety net when shutdown confirmation is ambiguous.
You can also use openniri-cli recover as a short alias for panic-revert.
If no terminal is reachable, use tray Emergency: Uncloak All Windows and then Exit.
Start safe mode only after shutdown is confirmed:
openniri-cli run --safe-mode
For a full walkthrough, see docs/GETTING_STARTED.md. For incident recovery details, see docs/SUPPORT_PLAYBOOK.md.
Most Win+letter combinations are reserved by Windows 11 (Win+L can never be registered), so the defaults use Alt, like GlazeWM. Existing config files keep whatever bindings they contain. Hotkeys that cannot be registered are logged by name and the rest stay active.
| Key | Action |
|---|---|
Alt+H / Alt+L |
Focus left / right |
Alt+J / Alt+K |
Focus down / up |
Alt+Shift+H / Alt+Shift+L |
Move column left / right |
Alt+Ctrl+H / Alt+Ctrl+L |
Shrink / grow column |
Win+Ctrl+Escape |
Emergency visibility restore + daemon panic-revert |
Win+Alt+H / Win+Alt+L |
Focus monitor left / right |
Win+Alt+Shift+H / Win+Alt+Shift+L |
Move window to monitor left / right |
Alt+Shift+Q |
Close focused window |
Alt+F |
Toggle floating |
Alt+Shift+F |
Toggle fullscreen |
Alt+1 / Alt+2 / Alt+3 |
Set width to 1/3, 1/2, 2/3 |
Alt+0 |
Equalize all column widths |
Alt+Shift+R |
Refresh (re-enumerate windows) |
openniri-cli autostart enableThis writes a Registry entry under HKCU\Software\Microsoft\Windows\CurrentVersion\Run that launches the daemon on login. To disable:
openniri-cli autostart disableConfig file:
%APPDATA%\openniri\config\config.toml
State data:
%APPDATA%\openniri\data\workspace-state.json
Daemon logs:
%TEMP%\openniri-daemon.log%TEMP%\openniri-daemon.err.log
OpenNiri-Windows is a Rust workspace:
| Crate | Responsibility |
|---|---|
openniri-core-layout |
Platform-agnostic layout engine |
openniri-platform-win32 |
Win32 integration and window operations |
openniri-ipc |
Named-pipe command/response protocol |
openniri-daemon |
Runtime event loop and state management |
openniri-cli |
User-facing command line interface |
Technical docs:
- Getting Started - Step-by-step walkthrough
- Configuration - Full config reference with examples
- Troubleshooting - Common issues and debugging guide
- Specification - Design specification
- Architecture - Architecture overview
- Windows Constraints - Win32 platform constraints
OpenNiri-Windows is a window controller, not a compositor.
- DWM remains the compositor.
- Elevated or protected windows may reject placement/styling changes.
- Behavior can vary across app frameworks (Win32/WPF/Electron/UWP).
See CONTRIBUTING.md.
GPL-3.0. See LICENSE.