A non-monolithic Wayland compositor https://isaacfreund.com/software/river/
Find a file
Isaac Freund bc0b0d5b77
All checks were successful
builds.sr.ht/alpine Job completed
builds.sr.ht/archlinux Job completed
builds.sr.ht/freebsd Job completed
XkbBinding: restore assertion in pressed()
This assertion was removed by accident in the previous commit.
2026-03-16 11:04:15 +01:00
.builds ci: stop running redundant jobs on every git.sr.ht push 2026-02-19 19:26:16 +01:00
.forgejo/issue_template forgejo: add use case issue template 2026-03-14 14:03:12 +01:00
common doc: use the REUSE licensing specification [1] 2026-01-01 16:41:52 +00:00
contrib doc: use the REUSE licensing specification [1] 2026-01-01 16:41:52 +00:00
doc river: remove hardcoded Ctrl+Alt+Delete keybinding 2026-03-05 11:02:02 +01:00
LICENSES doc: use the REUSE licensing specification [1] 2026-01-01 16:41:52 +00:00
logo doc: use the REUSE licensing specification [1] 2026-01-01 16:41:52 +00:00
protocol docs: improve protocol wording 2026-03-12 15:56:52 +01:00
river XkbBinding: restore assertion in pressed() 2026-03-16 11:04:15 +01:00
.editorconfig editorconfig: remove dead code 2026-01-01 17:01:10 +00:00
.gitignore doc: use the REUSE licensing specification [1] 2026-01-01 16:41:52 +00:00
.mailmap doc: use the REUSE licensing specification [1] 2026-01-01 16:41:52 +00:00
build.zig protocol: add river_output_v1.set_presentation_mode 2026-03-05 11:02:01 +01:00
build.zig.zon deps: update to tagged releases 2026-03-15 15:51:02 +01:00
CODE_OF_CONDUCT.md doc: fix last missing © symbols 2026-01-01 16:59:16 +00:00
CONTRIBUTING.md doc: fix last missing © symbols 2026-01-01 16:59:16 +00:00
PACKAGING.md doc: fix last missing © symbols 2026-01-01 16:59:16 +00:00
README.md docs: add missing commas in readme 2026-03-15 15:12:17 +01:00

Overview

River is a non-monolithic Wayland compositor. Unlike other Wayland compositors, river does not combine the compositor and window manager into one program. Instead, users can choose any window manager implementing the river-window-management-v1 protocol.

Read my blog post, Separating the Wayland Compositor and Window Manager, for an in-depth explanation.

There is a list of compatible window managers on our wiki.

If you are looking for the old dynamic tiling version of river, see river-classic.

Features

River defers all window management policy to a separate window manager implementing the river-window-management-v1 protocol. This includes window position/size, pointer/keyboard bindings, focus management, window decorations, desktop shell graphics, and more.

River itself provides frame perfect rendering, good performance, support for many Wayland protocol extensions, robust Xwayland support, the ability to hot-swap window managers, and more.

The river-window-management-v1 protocol and other river protocol extensions are stable. We do not break window managers.

Motivation

Why split the window manager to a separate process? I aim to:

  • Significantly lower the barrier to entry for writing a Wayland window manager.
  • Allow implementing Wayland window managers in high-level garbage collected languages without impacting compositor performance and latency.
  • Allow hot-swapping between window managers without restarting the compositor and all Wayland programs.
  • Promote diversity and experimentation in window manager design.

Building

Note: If you are packaging river for distribution, see PACKAGING.md.

To compile river first ensure that you have the following dependencies installed. The "development" versions are required if applicable to your distribution.

  • zig 0.15
  • wayland
  • wayland-protocols
  • wlroots 0.19
  • xkbcommon 1.12 or newer
  • libevdev
  • pixman
  • pkg-config
  • scdoc (optional, but required for man page generation)

Then run, for example:

zig build -Doptimize=ReleaseSafe --prefix ~/.local install

To enable Xwayland support pass the -Dxwayland option as well. Run zig build -h to see a list of all options.

Usage

River can either be run nested in an X11/Wayland session or directly from a tty using KMS/DRM. Simply run the river command.

On startup river will run an executable file at $XDG_CONFIG_HOME/river/init if such an executable exists. If $XDG_CONFIG_HOME is not set, ~/.config/river/init will be used instead.

Usually this executable is a shell script which starts the user's window manager and any other long-running programs.

For complete documentation see the river(1) man page.

Donate

If my work on river adds value to your life and you'd like to support me financially you can find donation information here.

Licensing

This project follows the REUSE Specification, all files have SPDX copyright and license information.

In overview:

  • River's source code is released under the GPL-3.0-only license.
  • River's Wayland protocols are released under the MIT license.
  • River's logo and documentation are released under the CC-BY-SA-4.0 license.