--- description: >- Replace SDDM (Qt-based graphical display manager) with greetd + tuigreet for a minimal, Wayland-first login experience with zero heavy GUI dependencies. status: accepted date: 2026-05-20 replaces: 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 ```toml [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 ```bash 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.