# ReGreet: a clean greetd greeter for Wayland written in Rust

> ReGreet is a GTK 4 login screen for greetd built in Rust with the Relm4 toolkit, aimed at Wayland compositors such as Sway, Hyprland or Cage. It handles session discovery, remembers the last user and is customised through GTK theming and CSS rather than a configuration panel.

**rharish101/ReGreet** — Clean and customizable greeter for greetd

- Repository: https://github.com/rharish101/ReGreet
- Stars: 830 · Forks: 42
- Language: Rust
- License: GPL-3.0
- Published: 2026-10-20 · Updated: 2026-10-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/rharish101-regreet

## A greetd greeter that runs under a Wayland compositor

ReGreet is a clean and customizable GTK based greeter for greetd, written in Rust using the Relm4 toolkit for the user interface. The README is explicit that it is meant to be run under a Wayland compositor such as Sway, and the requirements list Cage, Sway and Hyprland as the compositors it expects.

That positioning is the whole point. greetd is a minimal display manager, and it does not draw a login screen of its own. Instead it launches a greeter as a separate process, and that greeter talks back to greetd over its IPC channel to perform the actual authentication and session launch. ReGreet is that greeter, and the greetd_ipc crate at version 0.10 is the dependency that carries the conversation.

The lineage is documented rather than hidden. ReGreet is based on Max Moser's LightDM Elephant greeter, which was itself based on Matt Fischer's example LightDM greeter. The change of display manager is the significant part of that lineage: the interface was reused, the protocol behind it was replaced.

The audience is a user running a tiled Wayland setup who wants the login screen to look like the rest of the desktop rather than like a separate application, and who is willing to install a stack of dependencies to get it.

## Session discovery, overrides and the remembered user

The session and user handling is where a login screen either works or annoys people, and the feature list is specific about it.

The greeter shows a dropdown of existing users together with their X11 and Wayland sessions, and it also allows manual entry of a username and a session command for the cases where a user is not listed. It respects the Hidden and NoDisplay fields in session files, and it respects the XDG_DATA_DIRS environment variable when it looks for them. It picks up the first found session with a given name and type, which means a session file you provide earlier in the search path can override one the system supplies.

It remembers the last authenticated user, selects the last used session per user automatically, and can skip the selection step entirely and go straight to the last user and their last session. Environment variables can be set for the sessions it creates, which is how a user lands in an environment with the variables they need rather than the ones the display manager happens to export.

Reboot and poweroff commands are configurable per init system, which matters on a system where those commands are not the plain reboot and poweroff names. The state that makes the last user memory work lives in a state directory, and logs go to their own directory.

## Customisation through GTK theming and CSS, not a settings panel

ReGreet is themed the way a GTK application is themed. The customisation list covers the background image, the clock, the GTK theme, dark mode, the icon theme, the cursor theme, cursor blink on and off, and the font. On top of that, custom CSS files are supported for anything the theme does not reach.

This is the opposite design from a greeter with a preferences screen, and it has a practical consequence for the person deploying it. There is no configuration UI to click through, so the look of the login screen is set by the system GTK theme and by CSS, and it therefore matches whatever the desktop uses by construction. A distribution that ships a coherent set of GTK themes gets a coherent login screen with little work.

The screenshots in the README use the Canta GTK theme in dark mode with the Roboto font, which is a good indication of what the result looks like out of the box.

For images the requirements list Glycin, whose supported formats depend on the plugins installed, and GStreamer for animated backgrounds and video. So a static background needs Glycin, and a moving one needs GStreamer and the codec plugins, which is worth knowing before you promise a video login background on a minimal installation.

## Building from source and the paths fixed at compile time

The manual installation route is a Cargo release build:

```bash
cargo build --release
```

Rust 1.85.0 or later is needed for compilation only, not at runtime. The packaging metadata confirms the floor, with the package built on the 2024 edition and rust-version set to 1.85.

The interesting part of the build is what it bakes in. The compilation configures the greeter with the directories it will look in, and each of those can be changed with an environment variable at build time. GREETD_CONFIG_DIR defaults to /etc/greetd and points at the configuration directory used by greetd. STATE_DIR defaults to /var/lib/regreet and is where the ReGreet state and cache are stored. LOG_DIR defaults to /var/log/regreet. SESSION_DIRS defaults to /usr/share/xsessions:/usr/share/wayland-sessions as a colon separated list of directories to search for session files. X11_CMD_PREFIX defaults to startx /usr/bin/env, the prefix used to launch the X server for X11 sessions, and REBOOT_CMD defaults to reboot.

Because these are compile time settings, a distribution packager chooses them once and the values are fixed in the shipped binary. A self compiler who wants different paths has to rebuild with the variables set, which is worth knowing before assuming the defaults apply to a non standard root filesystem.

## Distribution packages for Arch and a NixOS module

Arch Linux is the best documented route, and the README is careful about who maintains what. ReGreet is in the official repositories as greetd-regreet, and in the AUR as greetd-regreet-git. The maintainer states plainly that they only maintain the AUR package and that the package in the Arch repositories is maintained by someone else.

The AUR package is installed with an AUR helper:

```bash
paru -S greetd-regreet-git
```

or the repository package with pacman:

```bash
pacman -S greetd-regreet
```

NixOS support comes through a module rather than a package. For a minimal setup you add programs.regreet.enable = true; to the NixOS configuration file, and for the full set of options you search for regreet on NixOS Search. The module approach means the greeter is described declaratively and rebuilt with the system configuration, which fits how that distribution expects software to be managed.

There is also a systemd-tmpfiles.conf in the repository, which is how the state and log directories get created with the right ownership at boot rather than by hand.

The repository also carries a regreet.sample.toml file and a REUSE.toml alongside a LICENSES/ directory, so the licensing of every file is declared in the SPDX style that the REUSE tooling expects.

## The dependency floor and the greetd IPC boundary

The requirements list is long, and the README adds a note with the right tone: a greetd greeter that constantly fails is not much fun.

Beyond greetd itself you need GTK 4.16 or later, D-Bus, and AccountsService, which is where the greeter gets the list of system users. Glycin and GStreamer cover images as described earlier. Rust is only needed to build. The Cargo dependency list maps onto these needs neatly, with gtk4 at 0.10 with the v4_8 feature, relm4 at 0.10 for the declarative interface, greetd_ipc at 0.10 with the tokio-codec feature, zbus at 5.10.0 for D-Bus with the tokio feature and default features off, and tokio at 1.43 for the async runtime, plus glycin 3.0.8 for image loading.

The rest of the dependency list is ordinary application plumbing. chrono and chrono-tz handle the clock, localzone and sys-locale handle the user's timezone and locale, freedesktop_entry_parser reads the desktop entry files, clap provides the command line interface with its derive feature, toml and serde handle configuration, and tracing with tracing-subscriber and tracing-appender and file-rotate produce the rotating logs that the LOG_DIR setting points at.

The boundary that matters operationally is that greetd and the greeter are separate processes. The greeter can crash, and the session launch depends on the greeter talking to greetd correctly, so a mismatch in versions between a system greetd and a self built ReGreet is a plausible source of a login screen that appears and does nothing.

## Where ReGreet is the wrong tool

Several situations point elsewhere.

If your system runs LightDM, this is the wrong greeter, and the reason is architectural rather than cosmetic. A LightDM greeter is a theme loaded by the LightDM greeter process, and it is bound to LightDM's own API and configuration. ReGreet instead runs as its own GTK application, speaks the greetd IPC protocol, and is configured by compile time paths and environment variables. Switching display managers to use it is a migration, not a theme swap.

If you are on X11 with no Wayland compositor, ReGreet is awkward. It can start X11 sessions through the X11_CMD_PREFIX, but the greeter itself is designed to run under a compositor, and the compositor list in the requirements is Wayland only.

The demo mode is the pragmatic escape hatch for anyone evaluating it. The feature list includes running ReGreet without greetd at all, which is described as a way to make development easier, and it means you can work on the interface, the themes and the CSS without touching the display manager of a machine you are still using.

The last limitation is the least obvious. Because the state directory holds the remembered last user and the cache, and because those paths are set at compile time, a system that relocates /var or runs a read only root needs a rebuilt binary or a matching layout. Packaged distributions handle that for you; a hand built binary inherits the problem.

## Conclusion

Adopt ReGreet if you run greetd on a Wayland compositor and want a login screen that looks like the rest of your desktop, with session handling that follows the XDG conventions rather than a proprietary config. Do not adopt it on X11 only systems or where LightDM is already the display manager, since the design follows the greetd IPC model and the session launch path differs. Verify three things first: that every listed dependency is present on the machine, because a greeter that fails to start leaves you without a login screen; which environment variables your distribution overrides, since the paths for the config, state and log directories are fixed at compile time; and that the session files on your system are picked up from the directories you expect. The licence is GPL-3.0-or-later, the latest release is 0.5.0 dated 2026-07-17, and the last push was on 2026-07-17.

## FAQ

### What is ReGreet and what display manager does it work with?

ReGreet is a clean and customizable GTK based greeter for greetd, written in Rust using Relm4. It is meant to run under a Wayland compositor such as Sway, Hyprland or Cage.

### How do I install ReGreet on Arch Linux?

The official repositories carry greetd-regreet, installed with pacman -S greetd-regreet, and the AUR carries greetd-regreet-git, installed with an AUR helper such as paru -S greetd-regreet-git. The maintainer notes that they only maintain the AUR package.

### What do I need to build ReGreet from source?

Rust 1.85.0 or later, and the runtime dependencies: greetd, GTK 4.16 or later, D-Bus, AccountsService, Glycin, GStreamer and a Wayland compositor. The build itself is cargo build --release.

### How does ReGreet find sessions and remember the last user?

It searches the directories listed in SESSION_DIRS, which default to /usr/share/xsessions:/usr/share/wayland-sessions, respects the Hidden and NoDisplay fields in session files and the XDG_DATA_DIRS variable, and stores its state, including the last authenticated user, in the STATE_DIR directory.

### Can I try ReGreet without changing my display manager?

Yes. A demo mode runs ReGreet without greetd, which the README describes as a way to make development of the interface and themes easier.

## Sources

- [Issues](https://github.com/rharish101/ReGreet/issues)
- [License: GPL-3.0](https://github.com/rharish101/ReGreet/blob/main/LICENSE)
- [README](https://github.com/rharish101/ReGreet/blob/main/README.md)
- [Releases](https://github.com/rharish101/ReGreet/releases)
- [rharish101/ReGreet on GitHub](https://github.com/rharish101/ReGreet)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/rharish101-regreet
