Skip to content

kavau/atrium

Repository files navigation

atrium

A lightweight display manager, built for Linux multiseat setups. Discovers seats via logind, shows a greeter on each seat, handles user authentication, and hands off to an independent user session per seat.

Screenshots

User selection
Greeter with default theme
Password entry
Password entry - prism theme
Ghibli theme
ghibli theme

Why atrium?

The Linux kernel and low-level system stack are fully capable of multiseat operation: udev handles device assignment, logind manages independent user sessions per seat, and Wayland compositors work with whatever devices logind gives them. The weak link has always been the display manager. Existing ones usually treat multiseat as an afterthought, with implementations that are brittle and difficult to get working reliably.

atrium is designed around multiseat from the start, focusing on correct seat discovery, VT handling, and isolated session management. The project targets a modern Linux stack using systemd/logind, PAM, and a Wayland graphical environment. The lack of historical baggage keeps atrium's code base lean and tractable.

What is multiseat?

A multiseat setup allows multiple users to work on a single computer at the same time. By connecting multiple monitors, keyboards, and mice, each user gets their own separate desktop and a fully isolated user session. Great for co-working or multiplayer gaming. Each seat requires its own GPU (integrated graphics, a discrete card, or a USB graphics adapter all work).

For instructions how to configure your hardware for multiseat, see doc/multiseat-setup.md.

Status

post-v0.4 - fully functional but still in early development.

atrium runs well as a daily-driver display manager. The core workflow (seat discovery, user authentication, session lifecycle management) is fully operational. That said, atrium has been tested on a limited range of hardware and distributions, so expect some rough edges.

See doc/architecture.md for a detailed design overview.

What's new since v0.4

  • Live config reload - sudo systemctl reload atrium reloads the daemon configuration and restarts all idle seats. This way each greeter also picks up its new config.

What's new since v0.3

  • Support for greeter background images - set background-image in /etc/atrium-greeter.conf to an image path, or to a directory to pick a random image on each greeter launch.
  • Greeter themes - set theme in /etc/atrium-greeter.conf to a theme .css file in order to override built-in colors and styles. A handful of themes are shipped with atrium and installed in /usr/local/share/atrium/themes.
  • Architectural redesign - making atrium's core architecture simpler and more robust. The changes are purely internal and should not be visible to the user.

What's new since v0.2

  • Runtime config files - /etc/atrium.conf and /etc/atrium-greeter.conf replace the compile-time src/defs.h.
  • Session discovery - atrium scans /usr/share/wayland-sessions/ and /usr/local/share/wayland-sessions/ for desktop sessions.
  • Wallet/keyring auto-unlock - KWallet and GNOME Keyring are unlocked automatically at login if the relevant PAM module packages are installed.

Supported Distros

  • Arch-based (Arch, CachyOS, EndeavourOS, Manjaro)
  • Debian-based (Debian, Ubuntu, Linux Mint, Pop!_OS)
  • Fedora¹ (SELinux accomodation included)

¹ On Fedora, wallet/keyring auto-unlock is currently not working.

Other systemd-based distros should work - the only distro-specific piece is the PAM stack. Adapt one of the provided PAM configs as needed.

Non-systemd-based distros (Artix, Void, Devuan): atrium does not directly depend on systemd init - it only needs logind for seat management. If you run elogind, it should work with some changes to meson.build and the PAM config, and a service file for your init system. This is entirely untested, but I'd be happy to hear how it goes if you try it.

The following desktop environments have been tested: GNOME, KDE Plasma, COSMIC, Sway, Niri. Any Wayland compositor with a session file in /usr/share/wayland-sessions should work - this list reflects what has been verified.

If atrium works on your setup, please consider adding a quick note to the Compatibility Reports issue. If it doesn't, please file a bug report.


Installation

1. Install dependencies

  • libsystemd (or libelogind) - logind session management
  • libudev - seat discovery
  • libpam - user authentication
  • gtk4 - greeter UI
  • cage - Wayland compositor hosting the greeter
  • meson, ninja - build system

On Debian/Ubuntu:

sudo apt install libsystemd-dev libudev-dev libpam0g-dev libgtk-4-dev cage meson ninja-build

On Arch/CachyOS:

sudo pacman -S systemd pam gtk4 cage meson ninja

On Fedora:

sudo dnf install systemd-devel pam-devel gtk4-devel cage gcc meson ninja-build \
    policycoreutils-python-utils checkpolicy

(policycoreutils-python-utils and checkpolicy are needed to set up the SELinux contexts and policy module.)

2. Build and install

meson setup build -Ddist=<your-distro>   # arch, debian, fedora
ninja -C build
sudo ninja -C build install

The -Ddist option (required) selects the correct PAM stack for the target distribution. Possible values for dist are: arch (for Arch/CachyOS), debian (for Debian/Ubuntu), or fedora (for Fedora).

3. Configure

This step can usually be skipped - the defaults work for a standard single-seat or multiseat setup.

  • /etc/atrium.conf — daemon settings: greeter command, ignored seats, optional compositor override, among others.
  • /etc/atrium-greeter.conf — greeter UI settings: idle blanking timeout, background image, theming etc.

Each config file is heavily commented; consult them for the full set of available keys and their meaning. Missing config files or keys fall back onto compiled-in defaults. More information can be found in doc/configuration.md.

4. Enable and start

Multiseat setups: seat assignment must be configured with loginctl attach before starting atrium. Without this step only a single seat exists. See doc/multiseat-setup.md for a step-by-step guide.

First note which display manager is currently active, so you can restore it if needed:

readlink /etc/systemd/system/display-manager.service

This will output a path such as /usr/lib/systemd/system/gdm.service, which means gdm is running, and can be re-enabled with systemctl enable gdm.

Now disable the current display manager, and enable atrium:

sudo systemctl disable gdm   # substitute your current display manager
sudo systemctl enable atrium

Then reboot. atrium will start on boot and launch a greeter on every configured seat.

If things go wrong, please take a look at doc/troubleshooting.md.

5. Uninstall

To fully remove atrium, switch to another display manager first (so the next boot still has a graphical login), then run the provided script.

sudo systemctl disable atrium
sudo systemctl enable gdm   # substitute your previous display manager
sudo tools/uninstall.sh

Further Reading

Community

Reporting Issues

Bug reports and feature requests are welcome. Please open an issue on GitHub and include:

  • A description of the problem or request.
  • Relevant journal output (sudo journalctl -u atrium -b).
  • Your distro, kernel version, and hardware configuration (incl. graphics drivers; especially for multiseat-related issues).

License

GPL-2.0 — see LICENSE.

About

A Wayland display manager for Linux with first-class multiseat support.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages