[mirror] A non-monolithic Wayland compositor
4,282
stars
1,750
commits
Zig
primary language
Sep 13, 2026
updated
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.
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.
Why split the window manager to a separate process?
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.
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.
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.
See also:
river(1) man pageUse of generative AI/LLMs is strictly forbidden for all contributions to river.
This includes bug reports and comments on the issue tracker.
See ARCHITECTURE.md for an overview of the code base.
See CONTRIBUTING.md for information on submitting patches.
If my work on river adds value to your life please consider setting up a recurring donation through liberapay. This is the best way to make river's development sustainable in the long term.
You can also support me with a one-time or monthly donation on github sponsors or ko-fi though I prefer liberapay as it is run by a non-profit.
Thank you for your support!
River is funded in part through the NGI0 Commons Fund, a fund established by NLnet with financial support from the European Commission's Next Generation Internet programme.
Learn more at the NLnet project page.
This project follows the REUSE Specification, all files have SPDX copyright and license information.
In overview:
(top 30 of 69)
Zig
99.7%
[mirror] A non-monolithic Wayland compositor
4,282
stars
1,750
commits
Zig
primary language
Sep 13, 2026
updated
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.
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.
Why split the window manager to a separate process?
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.
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.
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.
See also:
river(1) man pageUse of generative AI/LLMs is strictly forbidden for all contributions to river.
This includes bug reports and comments on the issue tracker.
See ARCHITECTURE.md for an overview of the code base.
See CONTRIBUTING.md for information on submitting patches.
If my work on river adds value to your life please consider setting up a recurring donation through liberapay. This is the best way to make river's development sustainable in the long term.
You can also support me with a one-time or monthly donation on github sponsors or ko-fi though I prefer liberapay as it is run by a non-profit.
Thank you for your support!
River is funded in part through the NGI0 Commons Fund, a fund established by NLnet with financial support from the European Commission's Next Generation Internet programme.
Learn more at the NLnet project page.
This project follows the REUSE Specification, all files have SPDX copyright and license information.
In overview:
(top 30 of 69)
Zig
99.7%