Architecture

July 29, 2026 · View on GitHub

This is a high level overview of the structure of river's code base.

See also the doc/internal directory for in-depth documentation of complex corners of the code base. If you are struggling to understand some part of river's code and feel like it should have documentation in that directory, feel free to open an issue.

Window Management State Machine

At the heart of river lies the window management state machine specified in the river-window-management-v1 protocol and described in an introductory blog post and FOSDEM talk. If you have not yet familiarized yourself with the state machine, that should be your first step.

In river's code base the state machine is implemented in WindowManager. The three core objects in the state machine are Window, Output, and Seat. Each of these files contain manageStart(), manageFinish(), renderStart(), and renderFinish() functions which progress the state machine, with the top level WindowManager.zig calling into the subordinate objects.

Input

The top level code handling input (e.g. from keyboard or pointer hardware) is located in InputManager. InputDevice represents a single hardware or virtual input source. Each InputDevice is assigned to exactly one Seat, which is exposed to Wayland clients and the window management state machine.

Output

The top level code handling output (i.e. compositing and displaying buffers on your monitor) is located in OutputManager. Individual output devices are represented by the Output type. For frame perfection, all changes to rendered state are double-buffered and synchronized with the window management state machine.