A scrollable-tiling Wayland compositor. https://matrix.to/#/#niri:matrix.org
Find a file
Ivan Molodetskikh 19e55a2df0
Some checks failed
CI / freebsd (push) Has been cancelled
CI / test (push) Has been cancelled
CI / check feature combinations (push) Has been cancelled
CI / alpine musl (push) Has been cancelled
CI / randomized and slow tests (push) Has been cancelled
CI / visual tests (push) Has been cancelled
CI / msrv (push) Has been cancelled
CI / clippy (push) Has been cancelled
CI / rustfmt (push) Has been cancelled
CI / fedora (push) Has been cancelled
CI / nix (push) Has been cancelled
CI / publish-wiki (push) Has been cancelled
CI / publish-docs (push) Has been cancelled
Don't override IME grab with popup keyboard grab
Fixes menu in Telegram. Some weird behavior is still possible e.g. with
gtk4-widget-factory and dropdowns on entries, but things seem to be
slightly less broken this way.
2025-12-20 14:11:02 +03:00
.github dependabot: Add cooldown 2025-12-18 13:39:30 +03:00
docs wiki: Clarify that environment isn't imported to systemd 2025-12-20 08:33:02 +03:00
niri-config Implement include optional=true (#3022) 2025-12-20 05:04:18 +00:00
niri-ipc Bump MSRV to 1.85, upgrade deps 2025-12-18 11:54:07 +03:00
niri-visual-tests Bump MSRV to 1.85, upgrade deps 2025-12-18 11:54:07 +03:00
resources cap the max volume to 100% (1.0) 2025-11-21 14:36:10 +03:00
src Don't override IME grab with popup keyboard grab 2025-12-20 14:11:02 +03:00
.gitattributes .gitattributes: Update img path 2025-08-29 09:15:21 +03:00
.gitignore Add Nix Flake (#77) 2024-01-10 22:43:46 -08:00
Cargo.lock Update Smithay (DnD rework, primary GPU improvement) 2025-12-18 13:17:35 +03:00
Cargo.toml Bump MSRV to 1.85, upgrade deps 2025-12-18 11:54:07 +03:00
clippy.toml Deal with Clippy warnings 2024-07-28 11:41:09 +03:00
CONTRIBUTING.md contributing: Add a section on how to get PR reviewed more quickly 2025-12-05 23:21:54 +03:00
flake.lock nix: Bump flake.lock 2025-09-18 11:26:11 +03:00
flake.nix Revert "revert nushell completion for flake.nix" 2025-09-18 11:26:11 +03:00
LICENSE Add LICENSE 2023-08-10 14:50:51 +04:00
niri.spec.rpkg rpkg: Add explicit libwayland-server dependency 2025-12-09 22:02:36 +03:00
README.md README: Add logo 2025-08-30 15:18:41 +03:00
rustfmt.toml Add rustfmt.toml and reformat 2023-08-10 14:49:38 +04:00
typos.toml Fix typos in comments 2025-11-29 10:05:44 +03:00

niri

A scrollable-tiling Wayland compositor.

Matrix GitHub License GitHub Release

Getting Started | Configuration | Setup Showcase

niri with a few windows open

About

Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize.

Every monitor has its own separate window strip. Windows can never "overflow" onto an adjacent monitor.

Workspaces are dynamic and arranged vertically. Every monitor has an independent set of workspaces, and there's always one empty workspace present all the way down.

The workspace arrangement is preserved across disconnecting and connecting monitors where it makes sense. When a monitor disconnects, its workspaces will move to another monitor, but upon reconnection they will move back to the original monitor.

Features

Video Demo

bce834b0-f205-434e-a027-b373495f9729

Also check out this video from Brodie Robertson that showcases a lot of the niri functionality: Niri Is My New Favorite Wayland Compositor

Status

Niri is stable for day-to-day use and does most things expected of a Wayland compositor. Many people are daily-driving niri, and are happy to help in our Matrix channel.

Give it a try! Follow the instructions on the Getting Started page. Have your waybars and fuzzels ready: niri is not a complete desktop environment. Also check out awesome-niri, a list of niri-related links and projects.

Here are some points you may have questions about:

  • Multi-monitor: yes, a core part of the design from the very start. Mixed DPI works.
  • Fractional scaling: yes, plus all niri UI stays pixel-perfect.
  • NVIDIA: seems to work fine.
  • Floating windows: yes, starting from niri 25.01.
  • Input devices: niri supports tablets, touchpads, and touchscreens. You can map the tablet to a specific monitor, or use OpenTabletDriver. We have touchpad gestures, but no touchscreen gestures yet.
  • Wlr protocols: yes, we have most of the important ones like layer-shell, gamma-control, screencopy. You can check on wayland.app at the bottom of each protocol's page.
  • Performance: while I run niri on beefy machines, I try to stay conscious of performance. I've seen someone use it fine on an Eee PC 900 from 2008, of all things.
  • Xwayland: integrated via xwayland-satellite starting from niri 25.08.

Media

niri: Making a Wayland compositor in Rust · December 2024

My talk from the 2024 Moscow RustCon about niri, and how I do randomized property testing and profiling, and measure input latency. The talk is in Russian, but I prepared full English subtitles that you can find in YouTube's subtitle language selector.

An interview with Ivan, the developer behind Niri · June 2025

An interview by a German tech podcast Das Triumvirat (in English). We talk about niri development and history, and my experience building and maintaining niri.

A tour of the niri scrolling-tiling Wayland compositor · July 2025

An LWN article with a nice overview and introduction to niri.

Contributing

If you'd like to help with niri, there are plenty of both coding- and non-coding-related ways to do so. See CONTRIBUTING.md for an overview.

Inspiration

Niri is heavily inspired by PaperWM which implements scrollable tiling on top of GNOME Shell.

One of the reasons that prompted me to try writing my own compositor is being able to properly separate the monitors. Being a GNOME Shell extension, PaperWM has to work against Shell's global window coordinate space to prevent windows from overflowing.

Tile Scrollably Elsewhere

Here are some other projects which implement a similar workflow:

Contact

Our main communication channel is a Matrix chat, feel free to join and ask a question: https://matrix.to/#/#niri:matrix.org

We also have a community Discord server: https://discord.gg/vT8Sfjy7sx