Files
mw-pfeddersheim-workstation/docs/adr/0003-sddm-to-greetd.md
T
ja 9d06a71f71 feat: migrate from SDDM to greetd+tuigreet
- Add greetd role with tuigreet greeter (3 packages, 4.9MB)
- Replace SDDM as display-manager.service with greetd
- Add ADR 0003 documenting migration rationale
- Rename hyprland task: "register session in SDDM" -> "register
  Wayland session desktop entry"
- Add display_manager variables to vars/main.yml
- Add greetd role to workstation.yml
- Update setup.md timestamp
2026-05-20 12:51:25 +02:00

3.0 KiB

description, status, date, replaces
description status date replaces
Replace SDDM (Qt-based graphical display manager) with greetd + tuigreet for a minimal, Wayland-first login experience with zero heavy GUI dependencies. accepted 2026-05-20 SDDM as display-manager.service

0003: SDDM to greetd Migration

Context

The workstation uses Hyprland as the primary Wayland compositor. SDDM was pulled in as the display manager with significant Qt dependencies (~50+ transitive packages). For a single-user dev workstation running Hyprland, this is unnecessary overhead — heavy, slow-booting, and over-engineered for the use case.

SDDM provides: graphical login prompt, session selection, PAM authentication. All three can be achieved with far lighter tools.

Decision

Migrate from SDDM to greetd + tuigreet.

  • greetd: minimal display manager daemon, designed for Wayland first-class.
  • tuigreet: TUI greeter with time display, user remembering, session discovery from /usr/share/wayland-sessions/ and /usr/share/xsessions/.

What changed

Before After
sddm.service (display-manager) greetd.service (display-manager)
Qt5/Qt6 dependency chain greetd + greetd-tuigreet (3 packages, 4.9MB)
/etc/sddm.conf /etc/greetd/config.toml
Graphical login screen Text-based TUI login screen
Heavy PAM surface Standard PAM chain (system-local-login)

Ansible changes

  • Added greetd role: installs packages, configures config.toml from template, enables greetd as display-manager.service
  • Hyprland task renamed: "register session in SDDM" -> "register Wayland session desktop entry" (no functional change, just accurate naming)
  • vars/main.yml: added display_manager_package, display_manager_greeter, display_manager_config variables

Configuration

[terminal]
vt = 1
[default_session]
command = "tuigreet --time --remember --asterisks --cmd Hyprland"
user = "greeter"

Rationale

  1. Wayland-native: greetd handles Wayland sessions cleanly without X compatibility layers
  2. Minimal: 3 packages vs Qt dependency chain; <5MB vs ~500MB
  3. Maintained: Rust codebase, clean TOML config, Arch repos (no AUR)
  4. AI-agent friendly: TOML config is trivially parseable/modifiable; clean systemd service with structured journalctl output
  5. Simplicity principle: maximizes work not done

Consequences

Positive

  • Faster boot (no Qt/Xorg init)
  • Smaller attack surface
  • Less disk usage
  • No Qt dependencies to maintain
  • Clean systemd service management

Negative

  • No graphical login (only a limitation if multi-user GUI switching is needed)
  • SDDM themes not available (not a requirement for this workstation)
  • Tuigreet has fewer visual customization options

Migration path back

sudo systemctl disable greetd
sudo systemctl enable sddm
sudo ln -sf /usr/lib/systemd/system/sddm.service /etc/systemd/system/display-manager.service

Reversible with zero data loss — the hyprland.desktop session entry is unchanged and works with both DMs.