# niri changelog > A scrollable-tiling Wayland compositor that arranges windows on an infinite strip. - Vendor: niri - Category: Operating Systems - Platforms: Linux - Official site: https://github.com/YaLTeR/niri - Tracked by: What's New (https://whatsnew.fyi/product/niri) - Harvested from: GitHub (YaLTeR/niri) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. ## Releases ### v26.04 - Date: 2026-04-25 - Version: v26.04 - Original notes: https://github.com/niri-wm/niri/releases/tag/v26.04 - Permalink: https://whatsnew.fyi/product/niri/releases/v26.04 - Labels: Platforms: Linux - **added** — Implement blur for windows and layer-shell components through the ext-background-effect Wayland protocol - **added** — Add window-rule and layer-rule configuration options for background-effect with blur and xray settings - **added** — Add layer matcher to window and layer rules for filtering by layer type - **changed** — Move niri repository from personal account to GitHub organization at github.com/niri-wm - **changed** — Update minimum supported Rust version to 1.85 - **changed** — Remove hardcoded /usr/bin/ path from niri.service binary path Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize. As you may have noticed, niri now lives in a [GitHub org](https://github.com/niri-wm) rather than my (@YaLTeR) personal account. The primary reason was the ability to give out issue triage permissions: I'd like to give a **massive thanks** to @Sempyos for triaging *all* of our issues and pull requests, answering many, many questions, and helping people diagnose their problems with niri. We've also moved a few niri-adjacent projects to the GitHub org, like the [awesome-niri](https://github.com/niri-wm/awesome-niri) list of related projects maintained by @Vortriz and a new [artwork](https://github.com/niri-wm/artwork) repo by @bluelinden and @HumpityDumpityDumber—two of the creators of our project logo. In the artwork repo, you can find a badge and several [wallpapers](https://github.com/niri-wm/artwork/tree/main/wallpapers), including two stunning 3D works created by @Duncan-Rose in Blender: | pool | cut | | --- | --- | | ![](https://github.com/niri-wm/artwork/blob/main/wallpapers/Niri%20pool.png?raw=true) | ![](https://github.com/niri-wm/artwork/blob/main/wallpapers/Niri%20cut.png?raw=true) | The main niri repo also flew past 20,000 stars in February! 🌟 Thanks everyone for support. > [!NOTE] > Packagers: > - our minimum supported Rust version is now 1.85. > - `niri.service` no longer hardcodes `/usr/bin/` in the niri binary path (thanks @Axlefublr). > - @markK24 restructured the dinit service files: https://github.com/niri-wm/niri/commit/3bfa4a71ffb4457ce092454dfad6938f70028c28 Now with introductions out of the way, here are the improvements from the last release. image ##### Blur It's here. The most requested niri feature by far. Our highest upvoted issue on GitHub. After tireless fork maintenance by @visualglitch91 and @Naxdy, blur is in mainline niri for everyone to use! image Windows and layer-shell components can request blur through the [`ext-background-effect`](https://wayland.app/protocols/ext-background-effect-v1) Wayland protocol with no extra niri configuration. Many already do: - [Dank Material Shell](https://danklinux.com/) v1.4.5: enable background blur [in settings](https://danklinux.com/docs/dankmaterialshell/compositor-blur) - [Noctalia](https://noctalia.dev/) shell: enable in settings and [see docs](https://docs.noctalia.dev/getting-started/compositor-settings/niri/#blur) - [Vicinae](https://vicinae.com/) launcher - [foot](https://codeberg.org/dnkl/foot/) terminal v1.26: set `blur=true` in colors config - [kitty](https://sw.kovidgoyal.net/kitty/) terminal v0.46.2: set `background_blur 1` - [Ghostty](https://ghostty.org/) terminal: will have support in v1.4 Toolkits: - [Quickshell](https://quickshell.org/): will have support in v0.3 - [winit](https://github.com/rust-windowing/winit): will have support in v0.31 For apps that don't support `ext-background-effect` yet, you can enable blur through the niri config: ```kdl // Enable blur behind the Alacritty terminal. window-rule { match app-id="^Alacritty$" background-effect { blur true } } // Enable blur behind the fuzzel launcher. layer-rule { match namespace="^launcher$" background-effect { blur true } } ``` Keep in mind that niri-configured blur needs the right [`geometry-corner-radius`](https://niri-wm.github.io/niri/Configuration%3A-Window-Rules.html#geometry-corner-radius), and it won't work with complex surface shapes. See the [Window Effects](https://niri-wm.github.io/niri/Window-Effects.html) wiki page _[Truncated at 4000 characters — full notes: https://github.com/niri-wm/niri/releases/tag/v26.04]_ ### v25.11 - Date: 2025-11-29 - Version: v25.11 - Original notes: https://github.com/niri-wm/niri/releases/tag/v25.11 - Permalink: https://whatsnew.fyi/product/niri/releases/v25.11 - Labels: Platforms: Linux - **added** — Alt-Tab recent windows switcher with live window previews, window titles, and support for windows blocked from screencasts - **added** — Alt-Tab can scope windows by current workspace or output using W or O keys - **added** — Alt-Tab supports switching between windows of current application with Alt-` or Mod-` keybinds - **added** — Window focus_timestamp field and WindowFocusTimestampChanged event in niri IPC for custom desktop components - **added** — True Wayland maximize support allowing single window to occupy entire working area with no gaps or struts - **changed** — Un/fullscreen transitions are now fully animated with fading black backdrop and smooth rounded corner transitions - **changed** — Windows no longer jump up and down when un/fullscreening even with animations disabled - **changed** — Support for libdisplay-info 0.3 - **fixed** — Enable checked arithmetic in release builds to catch overflow errors Two weeks ago, Cloudflare had a major outage that took down a good half of the internet. Their [postmortem](https://blog.cloudflare.com/18-november-2025-outage/) included a snippet of Rust code with an `unwrap()`, causing much internet discourse. Now it is my turn to release Rust software with a healthy dose of `unwrap()`s, `assert!`s, and checked arithmetic enabled in release builds. Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize. Here are the improvements from the last release. > [!NOTE] > Packagers: niri now supports libdisplay-info 0.3. Most niri packages updated this dependency back in September using a patch—this patch is no longer necessary. ##### Alt-Tab After multiple major iterations and a lot of work by @rustn00b, we have an Alt-Tab recent windows switcher! https://github.com/user-attachments/assets/4996d0be-638f-403b-b111-89a343d50c00 It's got live window previews, window titles that fade if they're too long, and supports [windows blocked out from screencasts](https://yalter.github.io/niri/Screencasting.html#block-out-windows)—they will draw as black rectangles with their titles hidden. Just like in GNOME, there's a small delay to drawing the interface, so that quickly hitting Alt-Tab will switch to the previous window with no visual disturbance. There are some interesting design differences compared to Alt-Tab in other desktops. On niri, I expect it's common to have multiple terminals open, so Alt-Tab must go by windows (not by apps), and the previews must be big enough for you to be able to pick the right window. So, instead of a panel showing all windows at once, we have a scrolling layout with a few large previews. Then, since niri is primarily tiling, you might frequently focus intermediate windows while navigating the workspace. Think pressing Super a few times to reach some window towards the end, or moving the mouse across the screen with [`focus-follows-mouse`](https://yalter.github.io/niri/Configuration%3A-Input.html#focus-follows-mouse). These intermediate windows shouldn't "pollute" the Alt-Tab list, so we have a small debounce delay before a focused window is marked as recent. Workspaces in niri can get *long* (especially if you forget how many terminals you open), so our Alt-Tab can scope windows by current workspace or by current output by pressing W or O. The default binds are AltTab / ModTab to switch across all windows, and Alt\` / Mod\` to switch between windows of the current application. Note that if you bound something else to those keys, your existing binds will take precedence. The [recent windows configuration](https://yalter.github.io/niri/Configuration%3A-Recent-Windows.html#overview) wiki page explains how to change these key bindings, as well as everything else: open delay, debounce, window preview size, and so on. ![](https://github.com/user-attachments/assets/d2f94c9a-4e2c-4f05-bbbf-bc82d13a8b7f) Finally, the niri IPC now exposes the window [`focus_timestamp`](https://yalter.github.io/niri/niri_ipc/struct.Window.html#structfield.focus_timestamp) and an event stream [event](https://yalter.github.io/niri/niri_ipc/enum.Event.html#variant.WindowFocusTimestampChanged), so you can use the recent windows list in your own desktop components and scripts. ##### Un/fullscreen animations The transitions for windows going to and from fullscreen are now fully animated. No more windows jumping and growing to fullscreen size in a single frame. The black backdrop fades in and out and grows if needed, and [`clip-to-geometry`](https://yalter.github.io/niri/Configuration%3A-Window-Rules.html#clip-to-geometry) rounded corners smoothly transition between square and circular during this animat _[Truncated at 4000 characters — full notes: https://github.com/niri-wm/niri/releases/tag/v25.11]_ ### v25.08 - Date: 2025-08-30 - Version: v25.08 - Original notes: https://github.com/niri-wm/niri/releases/tag/v25.08 - Permalink: https://whatsnew.fyi/product/niri/releases/v25.08 - Labels: Platforms: Linux - **added** — Niri now has a logo designed as a candle with four versions: full-sized, simple full-sized, icon, and simple icon - **added** — Integrate xwayland-satellite for automatic X11 support with on-demand spawning and automatic restart - **added** — Add xwayland-satellite configuration option for non-standard binary locations - **added** — Enable X11 apps to be put into spawn-at-startup without startup race conditions - **added** — Implement screen reader support Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize. A month ago, on July 31st, we hit 10,000 stars on GitHub! Thanks everyone for your support. 😄 Also, on August 10, niri turned two years old since the [initial commit](https://github.com/YaLTeR/niri/commit/ad3c3f8cefd38d2bf26b466d8e34eccde3bca443). With introductions out of the way, here are the improvements from the last release. > [!NOTE] > Packagers: > > - Niri still requires libdisplay-info 0.2 (not 0.3). When libdisplay-info-rs [updates its requirement](https://github.com/Smithay/libdisplay-info-rs/issues/15), you will likely be able to bump it in niri with no other changes. > - Some tests now require surfaceless EGL to be available at test time. If this is problematic, you can ignore them with `cargo test -- --skip=::egl`. > - The wiki contents have moved from `wiki/` to `docs/wiki/`. > - We have a new [Integrating niri](https://yalter.github.io/niri/Integrating-niri.html) wiki page with information on integrating niri into distributions, which you may find helpful. ##### A logo After many, *many* ideas and discussions (first on Matrix, then [on GitHub](https://github.com/YaLTeR/niri/discussions/1605)), and several cool design proposals, niri now has logo! ![niri logo](https://github.com/user-attachments/assets/07d05cd0-d5dc-4a28-9a35-51bae8f119a0) It's a candle! The logo comes in four versions: full-sized, simple full-sized, icon, and simple icon. The simple versions are single-color and suitable for smaller sizes. | | full-sized | icon | |---|:---:|:---:| | normal | ![](https://github.com/user-attachments/assets/07d05cd0-d5dc-4a28-9a35-51bae8f119a0) | ![](https://github.com/user-attachments/assets/8891e257-05d1-4e49-965d-906ecdc37fdc) | | simple | ![](https://github.com/user-attachments/assets/4b972b50-e539-4955-a73c-8113de9a78a5) | ![](https://github.com/user-attachments/assets/f616db56-aa73-47da-b8ed-1e882fc65e32) | The logo is intentionally recolorable, and you might've already seen several versions across our wiki, Matrix, and Discord. In fact, there's [a webpage](https://nirilogo.raurutuchr.ink) that lets you quickly adjust the color and download an SVG. Big thanks to @ixxie, @bluelinden, and @HumpityDumpityDumber for creating and iterating on this design. ##### New wiki Thanks to @chinatsu, we have a new interface to browse our wiki! Check it out: https://yalter.github.io/niri/ The main improvement over GitHub Wiki is the interactive full-text search. ![Screenshot of the search in the new wiki.](https://github.com/user-attachments/assets/86a40066-c79d-4eaf-a2c0-b58ede8d34b2) The site uses [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/), and we retained full compatibility with GitHub Wiki, meaning all existing links keep working. All wiki pages will continue to be deployed to both the new site and the GitHub Wiki. The new site allows us to make various customizations. For example, @chinatsu made all of our "Since: version" annotations render as badges and link to the corresponding release notes. ![Screenshot of a Since badge.](https://github.com/user-attachments/assets/531c6439-a30c-4e12-a67c-3980b0afa34f) Also, thanks everyone for several suggestions and test wikis in the [GitHub discussion](https://github.com/YaLTeR/niri/discussions/1830)! ##### xwayland-satellite integration There are still plenty of apps, and notably games, that use X11 and thus require Xwayland to work. Setting this up has been a common stumbling block for new niri users, because unlike most other compositors, [we don't integrate Xwayland](https://yalter.github.io/niri/FAQ.html#why-doesnt-niri-integrate-xwayland-like-other-compositors). This niri release solves that problem by integrating [xwayland-satellite](https://github.com/Supreeeme/xwayland-satellite). Make sure xway _[Truncated at 4000 characters — full notes: https://github.com/niri-wm/niri/releases/tag/v25.08]_ ### v25.05.1 - Date: 2025-05-25 - Version: v25.05.1 - Original notes: https://github.com/niri-wm/niri/releases/tag/v25.05.1 - Permalink: https://whatsnew.fyi/product/niri/releases/v25.05.1 - Labels: Platforms: Linux - **fixed** — Handle layer surfaces unmapped through a null buffer commit by sending an initial configure as necessary - **fixed** — Prevent unmapped layer surfaces from blocking popups from appearing - **fixed** — Remove brief hover events when the cursor is hidden - **fixed** — Remove brief cursor hovers when a hidden cursor warps - **changed** — Rename un/set/toggle-urgent actions to un/set/toggle-window-urgent - **fixed** — Ensure screen redraws on niri msg set-window-urgent and other urgency actions - **fixed** — Fix numlock activating only after pressing another modifier key - **fixed** — Fix incorrect reporting of tablet pen tilt - **fixed** — Fix certain clients like fcitx causing frequent keyboard keymap events to clients This is a hotfix release for [niri v25.05](https://github.com/YaLTeR/niri/releases/tag/v25.05). * Fixed handling of layer surfaces unmapped through a null buffer commit: they will now receive an initial configure as necessary (thanks @alex-huff). This makes the [kitty quick access terminal](https://sw.kovidgoyal.net/kitty/kittens/quick-access-terminal/) work. * Fixed unmapped layer surfaces preventing popups from appearing (thanks @alex-huff). * Fixed brief hover events when the cursor is [hidden](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#hide-when-typing) (thanks @Duncaen). Also fixed brief cursor hovers when a hidden cursor warps (i.e. with `warp-mouse-to-focus` or with `focus-monitor-right` etc.). * Renamed `un/set/toggle-urgent` to `un/set/toggle-window-urgent`, their intended name. This was my oversight. This change is not config-breaking because these actions aren't bindable, but it does mean you need to change the name when calling `niri msg action`. I went ahead with this break because I don't believe these actions are used anywhere yet (and others confirmed that). * Fixed screen not always redrawing on `niri msg set-window-urgent` and other urgency actions. * Updated Smithay: * Fixed [`numlock`](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#num-lock) activating only after pressing another modifier key (thanks @erdii). * Fixed incorrect reporting of tablet pen tilt. * Fixed certain clients like fcitx causing frequent keyboard keymap events to clients. ### v25.05 - Date: 2025-05-17 - Version: v25.05 - Original notes: https://github.com/niri-wm/niri/releases/tag/v25.05 - Permalink: https://whatsnew.fyi/product/niri/releases/v25.05 - Labels: Platforms: Linux - **added** — Overview feature that zooms out workspaces and windows for navigation and dragging, accessible via toggle-overview bind, top-left hot corner, or four-finger touchpad swipe - **added** — Mouse and touchpad controls in overview including left-click dragging, right-click scrolling, and two-finger scrolling for workspace navigation - **added** — Touchscreen support in overview with one-finger scrolling and long-press window dragging - **added** — Ability to drag-and-drop windows to new workspaces above, below, or between existing workspaces - **added** — Separate background drawn under each workspace to support the spatial model - **added** — backdrop-color settings globally and per-output for overview background customization - **added** — place-within-backdrop layer rule to position content in the overview backdrop area - **added** — IPC request and event for monitoring overview open state - **added** — Dynamic screencast target that allows changing what is streamed via set-dynamic-cast-window, set-dynamic-cast-monitor, and clear-dynamic-cast-target binds - **added** — wait-for-frame-completion-in-pipewire debug flag to fix screencasting glitches on NVIDIA - **changed** — Default config now spawns waybar at startup - **changed** — Backgrounds now move together with workspaces due to being tied to the spatial model - **changed** — Top layer-shell layer and interactively dragged windows now render on top of background and bottom-layer popups - **changed** — Pointing device interactions in overview made easier with mouse and touchpad gesture support Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize. Here are the improvements from the last release. > [!NOTE] > Packagers: the niri default config now spawns [waybar](https://github.com/Alexays/Waybar) at startup so as not to start with a blank desktop. Please consider adding Waybar as a recommended dependency (or changing it to some other bar). ##### The Overview The big new thing in niri v25.05 is the Overview. It zooms out your workspaces and windows to let you see what's going on at a glance, navigate, and drag windows around, all without having to touch the keyboard. https://github.com/user-attachments/assets/379a5d1f-acdb-4c11-b36c-e85fd91f0995 You can open it with the `toggle-overview` bind, via the new top-left hot corner, or using a touchpad four-finger swipe. While in the overview, all keyboard shortcuts keep working, while pointing devices get easier: - Mouse: left click and drag windows to move them, right click and drag to scroll workspaces left/right, scroll to switch workspaces (no holding Mod required). - Touchpad: two-finger scrolling that matches the normal three-finger gestures. - Touchscreen: one-finger scrolling, or one-finger long press to move a window. https://github.com/user-attachments/assets/7d9deada-dfb5-4cad-93f2-23b0d72a7877 Drag-and-drop will scroll the workspaces up/down in the overview, and will activate a workspace when holding it for a moment. Combined with the hot corner, this lets you do a mouse-only DnD across workspaces. https://github.com/user-attachments/assets/5f09c5b7-ff40-462b-8b9c-f1b8073a2cbb By the way, this new drag-and-drop hold will also bring floating windows to the top outside the overview. You can drag-and-drop a window to a new workspace above, below, or between existing workspaces. https://github.com/user-attachments/assets/b76d5349-aa20-4889-ab90-0a51554c789d To make the spatial model work for the overview, niri now draws a separate background under each workspace. For layer-shell tools, the *background* and *bottom* layers zoom out together with the workspaces, while the *top* and *overlay* layers remain on top of the overview. Make sure to put your bar on the *top* layer. The background behind the workspaces in the overview is called the *backdrop*. There are new `backdrop-color` settings both [globally in the `overview {}` section](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#backdrop-color) and [per-output](https://github.com/YaLTeR/niri/wiki/Configuration:-Outputs#backdrop-color). If you want something more interesting in the backdrop, there's a new [`place-within-backdrop`](https://github.com/YaLTeR/niri/wiki/Configuration:-Layer-Rules#place-within-backdrop) layer rule. You can use it on a wallpaper tool showing a blurred version of your background, for example. ![image](https://github.com/user-attachments/assets/adcf7a97-8dd4-4264-9149-ea406ef25bcc) Since backgrounds are now tied to workspaces, they will also move together with workspaces. If you don't like this, you can combine `place-within-backdrop` with a transparent [`background-color`](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#background-color) to get the stationary wallpaper back. Check [the overview wiki page](https://github.com/YaLTeR/niri/wiki/Overview#backdrop-customization) for an example configuration. There, you will also find how to change the overview zoom level or disable the hot corner. There have also been smaller spatial model fixes to accommodate the overview. For example, the top layer-shell layer and the interactively dragged window now render on top of the background- and bottom-layer popups. Finally, @CharlieQLe added an IPC [request](https://yalter.github.io/niri/niri_ipc/enum.Request.html#variant.OverviewState) and [event](https://yalter.github.io/niri/niri_ipc/ _[Truncated at 4000 characters — full notes: https://github.com/niri-wm/niri/releases/tag/v25.05]_ ### v25.02 - Date: 2025-02-22 - Version: v25.02 - Original notes: https://github.com/niri-wm/niri/releases/tag/v25.02 - Permalink: https://whatsnew.fyi/product/niri/releases/v25.02 - Labels: Platforms: Linux - **added** — Columns can now present windows as tabs instead of vertically stacked tiles - **added** — Add toggle-column-tabbed-display action to switch a column to tabbed mode - **added** — Add focus-window-top and focus-window-bottom actions to focus the topmost or bottommost window in a column - **added** — Add focus-window-down-or-top and focus-window-up-or-bottom actions to cycle navigation between windows in a column - **added** — Add focus-window-in-column action to focus a specific window by index - **added** — Tab indicator can be customized and moved to top, bottom, or right of the column - **added** — Windows can open as tabbed columns by default globally or via window rule - **added** — Niri can now draw shadows behind windows - **added** — Shadows can be customized with properties like softness, spread, offset, and color globally and per-window - **added** — Shadows work on layer-shell surfaces and can be enabled via layer rules - **added** — View can now be scrolled left and right during drag-and-drop operations by moving the mouse near the monitor's edge - **added** — Drag-and-drop view scrolling also triggers when dragging a window in the tiling layout - **added** — Add is-window-cast-target=true window rule to match windows targetted by individual-window screencast - **changed** — Test infrastructure no longer requires RAYON_NUM_THREADS=1 on heavily multithreaded CPUs Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize. Here are the improvements from the last release. > [!NOTE] > Packagers: I fixed the problem where some tests required `RAYON_NUM_THREADS=1` on a heavily multithreaded CPU. Please remove that variable if you had it set, so that we don't miss any new bugs. https://github.com/user-attachments/assets/a9e37678-5783-4de0-b2c7-a26094cd635f ##### Tabbed columns Columns can now present windows as tabs, rather than vertically stacked tiles. This is useful when you have limited vertical space, or when you frequently switch between two large windows and want to avoid scrolling. Add this new bind to your config to switch a column to tabbed mode: ```kdl binds { Mod+W { toggle-column-tabbed-display; } } ``` This is *the only* new bind you will need. All other keyboard and mouse navigation works exactly the same as with regular columns: switch tabs with `focus-window-down/up`, add or remove windows with `consume-window-into-column`/`expel-window-from-column`, and so on. (Thanks @elkowar for this wonderful UX idea!) https://github.com/user-attachments/assets/5b357895-bcf3-42eb-a2e1-2b220d63d0c9 There are a few new actions that help navigate the tabs. All of them also work on regular columns. - `focus-window-top/bottom` focuses the topmost or the bottommost window in a column. - `focus-window-down-or-top` and `focus-window-up-or-bottom` cycle the navigation so the focus jumps from the last to the first window and vice versa. - `focus-window-in-column ` focuses a specific window by index. The tab indicator can be customized in several ways and moved to top/bottom/right of the column. See [the wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#tab-indicator) for more details. ![Tab indicator at the top of the column.](https://github.com/user-attachments/assets/cf8d1308-da36-4327-bbc6-dbb7a1f751d0) You can also make windows open as tabbed columns by default [globally](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#default-column-display) or with a [window rule](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#default-column-display). This goes well with the `hide-when-single-tab` setting for the tab indicator. ##### Shadows Niri can now draw shadows behind windows. Apart from being a nice aesthetic effect, shadows help to delineate floating and otherwise overlapping windows. They are especially useful when you [disable](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#prefer-no-csd) or [clip away](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#clip-to-geometry) client-side decorations (which commonly include shadows of their own). ![Shadows help to tell windows apart.](https://github.com/user-attachments/assets/c32f1911-4ef2-42d3-9b13-5c9db0268190) Niri shadows are not enabled by default to not clash with the shadows coming from client-side decorations. Turning them on is simple enough: ```kdl // Enable shadows. layout { shadow { on } } // Also ask windows to omit client-side decorations, so that // they don't draw their own window shadows. prefer-no-csd ``` You can customize properties like softness (blur radius), spread, offset, and color, both [globally](https://github.com/YaLTeR/niri/wiki/Configuration:-Layout#shadow) and [for individual windows](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#shadow). Like borders and focus rings, shadows will follow the window corner radius that you set via [`geometry-corner-radius`](https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules#geometry-corner-radius). ![Hard shadows example.](https://github.com/user-attachments/assets/18f6e622-652c-47a0-8f21-6805f21d7169) Shadows also work on layer-shell surfaces. Due to the higher _[Truncated at 4000 characters — full notes: https://github.com/niri-wm/niri/releases/tag/v25.02]_ ### v25.01 - Date: 2025-01-11 - Version: v25.01 - Original notes: https://github.com/niri-wm/niri/releases/tag/v25.01 - Permalink: https://whatsnew.fyi/product/niri/releases/v25.01 - Labels: Platforms: Linux - **added** — Floating windows support with auto-float for dialogs and fixed-size windows - **added** — Actions for focusing floating or tiling layout and moving windows between them - **added** — Window rule matchers and rules for floating windows including is-floating, open-floating, and default-floating-position - **added** — Mouse right-click dragging to move windows between floating and tiling layouts - **changed** — Switch to year.month versioning scheme instead of semantic versioning - **changed** — Minimum required Rust version is now 1.80 - **added** — Environment variables NIRI_BUILD_VERSION_STRING and NIRI_BUILD_COMMIT to override version and commit during builds - **changed** — Floating windows are positioned relative to monitor size and automatically kept within monitor bounds - **changed** — Floating windows are restored to their previous size and position when moved back from tiling layout Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize. Here are the improvements from the last release... hang on, how come we jumped from v0.1 all the way to v25? Starting now, niri ~~escapes [ZeroVer](https://0ver.org)~~ is switching to year.month versioning. In **25.01**, the "25" is year 2025, and "01" is month 01 (January). So version 25.01 tells you that this release was tagged in January of 2025. Hotfix releases will use the third component. For example, the first hotfix for the 25.01 release would be called 25.01.1. There are a few reasons for this change. - For niri, semver isn't very useful. Big and small features are added every release, and so far we've managed to avoid any breaking changes to the config file. Calendar versioning at least tells you how old of a version you're running. - v0.1.x left no place for a hotfix version. I couldn't even put v0.1.10.1 into `Cargo.toml` because it has four components instead of three. The new versioning has just two components, leaving one extra for the hotfix version. - I feel like niri is now sufficiently featureful to graduate from v0.1. :) I expanded the [Status section](https://github.com/YaLTeR/niri/blob/main/README.md#status) of the README to cover some of the frequently asked "is this thing supported" questions. Similar versioning is also used in other projects like [Helix](https://github.com/helix-editor/helix), [NixOS](https://nixos.org) and [Ubuntu](https://ubuntu.com/). With this change, the niri releases remain unscheduled: once every few months, and not bound to any particular cycle. Whenever I feel that it's a good time for a new version. > [!NOTE] > Packagers: niri now requires Rust 1.80. Also, there are new environment variables to override the niri version string and commit: `NIRI_BUILD_VERSION_STRING` and `NIRI_BUILD_COMMIT`. The new [Packaging niri](https://github.com/YaLTeR/niri/wiki/Packaging-niri) wiki page shows how to use them, along with everything else important for packaging. > > New niri tests need `XDG_RUNTIME_DIR` to be set. You can use `export XDG_RUNTIME_DIR="$(mktemp -d)"`. > > If some tests fail with `Err::AlreadyInUse` on a heavily multi-threaded CPU, set `RAYON_NUM_THREADS=1`. This is tracked in #953. ##### Floating windows Floating windows are here! It took a big refactor and a good month of hard work, but the most *liked* niri feature request is done. ![](https://github.com/user-attachments/assets/8bfa023f-3a8f-4482-bade-7d01c334ae95) Like other WMs, niri will auto-float dialogs and fixed-size windows. With no extra configuration, this release does away with most of the annoying dialog scrolling. https://github.com/user-attachments/assets/d560582c-07fd-4fcb-bf86-9ed305df515f
Opening LibreOffice no longer causes the view to shift an ultrawide worth to the right.

Being a scrolling WM, there were several options and design decisions to consider for how floating windows should work. I opted for a setup familiar from other tiling WMs: floating windows are on a separate "layer" that always shows on top of the tiled windows, and the floating layout does not scroll. Each workspace/monitor has its own floating layout, just like each workspace/monitor has its own tiling layout. ![](https://github.com/user-attachments/assets/4bc2f71e-3d2f-490e-a7f2-3fdce98dd67f)
Finally, you can properly showcase your scrollable-tiling WM setup.

There's a surprising number of features and small details that go into a good floating experience. Things like correct parent-child stacking, focus-follows-mouse activating but not raising the window, or restoring the floating size and position after moving the window to the tiling layout and back. https://github.com/user-attachments/assets/376ef176-c546-400e-a977- _[Truncated at 4000 characters — full notes: https://github.com/niri-wm/niri/releases/tag/v25.01]_ ### v0.1.10.1 - Date: 2024-11-13 - Version: v0.1.10.1 - Original notes: https://github.com/niri-wm/niri/releases/tag/v0.1.10.1 - Permalink: https://whatsnew.fyi/product/niri/releases/v0.1.10.1 - Labels: Platforms: Linux - **fixed** — Scrolling not working when the mouse {} or touchpad {} section is omitted from the config file - **changed** — Mouse cursor now shows up on scroll which makes scrolling work when the cursor was hidden - **fixed** — Crash when holding Space in the screenshot UI - **added** — Touch-dragging with held Mod is now bound to interactive window move This is a hotfix release for [niri v0.1.10](https://github.com/YaLTeR/niri/releases/tag/v0.1.10). * Fixed scrolling not working when the `mouse {}` or `touchpad {}` section is omitted from the config file. * Made the mouse cursor show up on scroll which makes scrolling work when the cursor was hidden (thanks @r-vdp). * Fixed a crash when holding Space in the screenshot UI. * Bound touch-dragging with held Mod to interactive window move. ### v0.1.10 - Date: 2024-11-09 - Version: v0.1.10 - Original notes: https://github.com/niri-wm/niri/releases/tag/v0.1.10 - Permalink: https://whatsnew.fyi/product/niri/releases/v0.1.10 - Labels: Platforms: Linux - **added** — Interactive window moving by dragging windows by title bars or while holding Mod - **added** — Windows rubber-band before being dragged out to prevent accidental layout changes - **added** — Interactive moving and resizing on touchscreen - **added** — Pointer location hint request implementation for locked pointer movement - **added** — Bindings for laptop lid opening/closing and tablet mode switching - **added** — Automatic disabling of internal laptop monitor when closing the lid - **added** — Cursor hiding options including hide when typing and hide after inactivity period - **added** — Pointer shows up on mouse button press - **added** — Trackball input config section - **added** — Scroll-button setting for mice, touchpads, trackpoints, and trackballs - **added** — Scroll-factor setting for mice and touchpads to adjust scrolling speed - **added** — Window --id argument to niri msg action consume-or-expel-window-left/right and IPC - **added** — Explicit power-on-monitors action - **added** — Support for running niri as a dinit service - **added** — Disable-monitor-names debug config flag as a workaround for crashes with identical monitor reporting - **changed** — Tablet input no longer follows monitor rotation - **changed** — GTK Access portal is now explicitly set in niri-portals.conf - **changed** — Active workspace is now preserved across monitor disconnects and reconnects - **changed** — Pointer stays hidden on programmatic and keyboard-triggered movement - **fixed** — Fixed focus-window-up-or-column-right focusing left instead of right - **fixed** — Fixed animation jump when expelling a narrower window from a column with uneven window widths - **fixed** — Fixed logind power key inhibit file descriptor leaking into spawned processes - **fixed** — Fixed window close view position restoration triggering for unfocused windows - **fixed** — Fixed crash when an output disappears immediately after connecting - **fixed** — Fixed used xdg-activation token memory leak - **fixed** — Fixed lock screen clients hanging when no monitors are enabled - **fixed** — Fixed memory leak when locking the screen in Smithay - **fixed** — Fixed occasional visual freezing of GTK and other apps in Smithay - **fixed** — Fixed regression where increasing output scale in v0.1.9 did not propagate to some clients Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize. Here are the improvements from the last release. ##### Interactive window moving While not full-blown floating window support quite yet, this is an important step towards that. You can now move windows by dragging them by title bars, or anywhere while holding Mod. https://github.com/user-attachments/assets/b0c36fc3-d4ca-459b-819b-fc7ee223a3d7 To prevent accidental layout changes, the windows rubber-band a little before you drag them out. https://github.com/user-attachments/assets/7c50c95b-56fe-4d21-b659-ad8cd7f4fad7 Furthermore, I made both interactive moving and resizing work on a touchscreen. https://github.com/user-attachments/assets/275f27fd-8c26-40a9-82c9-0cd975a96688 Thanks to @Pajn for implementing a fairly complete proof-of-concept of this feature! ##### Locked pointer location hint @sodiboo implemented the pointer location hint request. Apps like Blender use it to tell the compositor the final location after a locked pointer movement so that the compositor can update its own pointer location to match it. https://github.com/user-attachments/assets/76e92efb-7c93-4b1f-876e-fbc61912f7ea ##### Laptop lid and tablet mode switch bindings Thanks to @cmeissl, you can now bind commands to laptop lid opening/closing and tablet mode switching. You can use this to automatically enable an on-screen keyboard when a convertible laptop enters tablet mode. See the [switch events wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Switch-Events) for more information and examples. Additionally, I implemented disabling of the internal laptop monitor when closing the lid. So your workspaces will automatically move to the external screen. If for some reason this breaks for you, set the new `keep-laptop-panel-on-when-lid-is-closed` [debug config](https://github.com/YaLTeR/niri/wiki/Configuration:-Debug-Options) flag. ##### Pointer hiding @yzy-1 implemented new cursor hiding options: hide when typing (on any key press), and hide after a set inactivity period. See [the wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Miscellaneous#hide-when-typing) for more details. ```kdl cursor { hide-when-typing // Or, after a timeout: // hide-after-inactive-ms 1000 } ``` To complement this, there are a few improvements to the hidden pointer behavior. The pointer will now show up on mouse button press, and on the contrary, it will stay hidden on programmatic and keyboard-triggered movement, like focusing a different monitor, or when using `warp-mouse-to-focus`. ##### Input configuration improvements Thanks to @tazjin, @chillinbythetree and @elipp for: - Adding a `trackball` input config section. - Adding a `scroll-button` setting to mice, touchpads, trackpoints, and trackballs. - Adding a `scroll-factor` setting to mice and touchpads that you can use to speed up or slow down scrolling. See the [input config wiki page](https://github.com/YaLTeR/niri/wiki/Configuration:-Input#pointing-devices) for more information. ##### Other improvements in this release - Tablet input no longer follows the monitor rotation: you need to rotate your graphics tablet together with your monitor. This makes convertible laptops work properly; this is also how input works on other desktop environments. Thanks @cmeissl. - The GTK Access portal is now explicitly set in `niri-portals.conf`, which makes it work. It is required for applications requesting PipeWire webcam and microphone access, such as the Firefox package on Fedora 41. Thanks @cmeissl. - The `niri-ipc` crate is now [published to crates.io](https://crates.io/crates/niri-ipc). - Active workspace is now preserved across monitor disconnects and reconnects. - Added a window `--id` argument to `niri msg action cons _[Truncated at 4000 characters — full notes: https://github.com/niri-wm/niri/releases/tag/v0.1.10]_ ### v0.1.9 - Date: 2024-09-14 - Version: v0.1.9 - Original notes: https://github.com/niri-wm/niri/releases/tag/v0.1.9 - Permalink: https://whatsnew.fyi/product/niri/releases/v0.1.9 - Labels: Platforms: Linux - **added** — Implement event stream in IPC that lets you continuously listen to compositor events like workspace or window changes - **added** — Add unique IDs to IPC windows and workspaces with ability to address specific windows or workspaces by ID - **added** — Add niri msg windows command to list all windows with their IDs - **added** — Add --id argument to window commands to target a specific window - **added** — Add niri msg action focus-window --id action - **added** — Add niri msg keyboard-layouts command - **added** — Document programmatic access to the niri IPC socket - **added** — Set up online rustdoc for the niri-ipc crate - **added** — Implement preset-window-heights layout option and switch-preset-window-height bind - **changed** — Make all unit Action enum variants struct variants in JSON, a breaking change to ensure future backward compatibility - **changed** — Rework window height distribution so columns of two or more windows always try to match monitor height - **changed** — Make resizing one window resize all other windows in a column proportionally - **changed** — Change default bind for resetting window height to Mod+Ctrl+R - **changed** — Use libdisplay-info to display actual monitor names instead of generic identifiers - **fixed** — Fix windows in a column occasionally snapping to a smaller size when resizing - **security** — niri now requires libdisplay-info Niri is a scrollable-tiling Wayland compositor. Windows are arranged in columns on an infinite strip going to the right. Opening a new window never causes existing windows to resize. Here are the improvements from the last release. > [!NOTE] > Packagers: niri now requires libdisplay-info. ##### New IPC functionality In this release, I designed and implemented an [event stream](https://github.com/YaLTeR/niri/wiki/IPC#event-stream) in niri's IPC which lets you continuously listen to compositor events like workspace or window changes. The event stream enables taskbar applications to make correct and efficient widgets for niri. I implemented the [niri modules](https://github.com/Alexays/Waybar/wiki/Module:-Niri) for workspaces, focused window, and keyboard layout in Waybar, available in its fresh [0.11.0 release](https://github.com/Alexays/Waybar/releases/tag/0.11.0). Pull requests are open for [yambar](https://codeberg.org/dnkl/yambar/pulls/405) and [ironbar](https://github.com/JakeStanger/ironbar/pull/726) thanks to their contributors. https://github.com/user-attachments/assets/6fe9fc99-9246-45e3-a3b2-48ec79282cdd IPC windows and workspaces now have unique IDs, and all individual window and workspace actions can address a specific window or workspace by its ID. On the command line, a new `niri msg windows` command lists all windows with their IDs, and window commands accept an `--id ` argument to target a specific window, for example: ``` $ niri msg action fullscreen-window --id 2 ``` Also, there's a new `niri msg action focus-window --id ` action and a new `niri msg keyboard-layouts` command. I wrote some documentation on the [programmatic access](https://github.com/YaLTeR/niri/wiki/IPC#programmatic-access) to the niri IPC socket. I also set up an [online rustdoc](https://yalter.github.io/niri/niri_ipc/) for the niri-ipc crate where I documented every IPC type and request. Please refer there when working with the niri IPC. Unfortunately, while adding ID arguments to IPC actions, I discovered a backward incompatibility trap in serde-json. The default enum representation—externally tagged—prevents you from changing a unit variant to a struct variant, because the representation gains an extra dictionary. `"FullscreenWindow"` becomes `{"FullscreenWindow":{}}`, and the former does not parse with the new definition. I decided to make a JSON breaking change, converting all unit `Action` enum variants to struct variants (with or without fields). I doubt anyone used them directly through JSON since these actions could only address the focused window or column. All enum variants that already had fields are unchanged, and the `niri msg` CLI is also unaffected. With this breaking change out of the way, any further JSON additions should remain backward compatible, so that existing scripts and programs communicating with niri will keep working with new niri versions. ##### Height distribution changes One common complaint about niri's layout was the ability to make a multi-window column not "add up" to the total height of the monitor. The behavior was also fairly unobvious: with two windows in a column, you resize one, and the other resizes along as expected. Then, you resize the other, but the first window doesn't react. It felt like a bug. Last time there was a design problem (unwanted scrolling with focus-follows-mouse), we quickly found a solution by brainstorming in a Discussion. So, I made a big write-up about window heights in https://github.com/YaLTeR/niri/discussions/593. While there hasn't been much *discussion*, the act of laying out in writing all considerations and constraints had spawned a potential solution in my mind, which turned out to work quite well. In this release, I reworked the window height distribution to do the *expected thing* in more cases. A column of two or more windows will always try to match the monitor height, as long as the minimum window sizes allow _[Truncated at 4000 characters — full notes: https://github.com/niri-wm/niri/releases/tag/v0.1.9]_