- 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
3.0 KiB
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
greetdrole: 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_configvariables
Configuration
[terminal]
vt = 1
[default_session]
command = "tuigreet --time --remember --asterisks --cmd Hyprland"
user = "greeter"
Rationale
- Wayland-native: greetd handles Wayland sessions cleanly without X compatibility layers
- Minimal: 3 packages vs Qt dependency chain; <5MB vs ~500MB
- Maintained: Rust codebase, clean TOML config, Arch repos (no AUR)
- AI-agent friendly: TOML config is trivially parseable/modifiable; clean systemd service with structured journalctl output
- 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.