# ADR 0007: Workstation Package Cleanup — Remove X11/KDE Legacy Stack **Date**: 2026-05-22 **Status**: Accepted (Tier 1+2+3+4 executed 2026-05-22) **Decision Maker**: Michael Wegener ## Context The workstation runs Hyprland (Wayland) with greetd+tuigreet. Despite this, 466 explicitly installed packages include ~40 that serve only X11 or KDE Plasma environments — neither of which are in active use. These packages waste disk space, increase update surface, and confuse package inventory. ### Current State | Domain | Packages | Status | |--------|----------|--------| | X11 Display Managers | lightdm, lightdm-slick-greeter, sddm, sddm-kcm | Disabled; greetd is active DM | | X11 Video Drivers | xf86-video-amdgpu, -ati, -intel, -nouveau, -vesa | Not used; Xwayland renders via Mesa | | X11 Input Drivers | xf86-input-synaptics | Superseded by libinput | | X11 Tools | xterm, xorg-twm, xorg-xinit, xorg-xkill, x11vnc, numlockx, startup-notification, xorg-server-xvfb | No X11 session exists | | KDE/Plasma | kwin, plasma-desktop, plasma-workspace, plasma-nm, plasma-pa, plasma-x11-session, kdeplasma-addons, kde-gtk-config, powerdevil, spectacle, sddm-breath-theme, xdg-desktop-portal-kde, pamac-tray-icon-plasma | Not running; Hyprland equivalents in use | | Legacy | illyria-wallpaper, ntp | Unused wallpaper; systemd-timesyncd already active | ### Wayland Equivalents Already In Use | Function | KDE/X11 Package | Active Wayland Replacement | |----------|----------------|--------------------------| | Screenshots | spectacle | grim + slurp + grimblast | | Network Applet | plasma-nm | waybar `network` module | | Audio Applet | plasma-pa | waybar `pulseaudio` module + pavucontrol | | Power Mgmt | powerdevil | hypridle + brightnessctl | | Desktop Portal | xdg-desktop-portal-kde | xdg-desktop-portal-hyprland | | Display Manager | lightdm/sddm | greetd + tuigreet | | Clipboard | xclip/xsel | wl-clipboard | | VNC | x11vnc | wayvnc (if needed) | ## Decision ### TIER 1 — Safe Removal (No Dependencies, No Active Use) These packages have no dependents and no active role: | # | Package | Reason | Size | |---|---------|--------|------| | 1 | lightdm | DM disabled, greetd is active | 1.1 MiB | | 2 | lightdm-slick-greeter | Only required by lightdm | 1.9 MiB | | 3 | sddm | DM disabled | 5.3 MiB | | 4 | sddm-kcm | Only required by sddm | 0.6 MiB | | 5 | sddm-breath-theme | Manjaro KDE branding for sddm | 0.2 MiB | | 6 | xterm | X11 terminal; kitty is active | 1.1 MiB | | 7 | xorg-twm | X11 window manager | 0.2 MiB | | 8 | xorg-xinit | Start X manually (no X11 session) | 0.04 MiB | | 9 | xorg-xkill | X11 kill utility | 0.02 MiB | | 10 | x11vnc | Only works with X11; wayvnc for Wayland | 1.8 MiB | | 11 | numlockx | X11-specific numlock | 0.02 MiB | | 12 | startup-notification | X11 startup protocol | 0.06 MiB | | 13 | xorg-server-xvfb | Virtual framebuffer; no CI use case | 2.0 MiB | | 14 | xf86-video-amdgpu | AMD X11 driver (system has NVIDIA) | 0.2 MiB | | 15 | xf86-video-ati | ATI X11 driver (no ATI GPU) | 0.5 MiB | | 16 | xf86-video-intel | Intel X11 driver (no Intel GPU) | 2.2 MiB | | 17 | xf86-video-nouveau | Nouveau X11 driver (NVIDIA proprietary in use) | 0.2 MiB | | 18 | xf86-video-vesa | VESA fallback driver | 0.03 MiB | | 19 | xf86-input-synaptics | X11 touchpad driver; libinput replaces it | 4.0 MiB | | 20 | illyria-wallpaper | Manjaro wallpaper; not used | 1.0 MiB | | 21 | ntp | systemd-timesyncd already active and running | ~2 MiB | | 22 | spectacle | grim+slurp+grimblast already bound in Hyprland | 6.1 MiB | | 23 | pamac-tray-icon-plasma | pamac not running; paru is AUR helper | 0.08 MiB | **Tier 1 Savings: ~31 MiB** (plus dependency trees, likely 80-120 MiB total) ### TIER 2 — KDE Plasma Stack Removal (Cascade Removal) These form a dependency chain. Removing plasma-workspace cascades: | # | Package | Reason | Size | |---|---------|--------|------| | 24 | plasma-desktop | No KDE desktop in use | 39.3 MiB | | 25 | plasma-workspace | Not running; waybar replaces | 55.1 MiB | | 26 | kwin | Not running; Hyprland is compositor | 30.9 MiB | | 27 | kdeplasma-addons | Requires kwin+plasma-workspace | 12.0 MiB | | 28 | plasma-nm | waybar network module in use | 12.8 MiB | | 29 | plasma-pa | waybar pulseaudio module in use | 1.9 MiB | | 30 | plasma-x11-session | X11 session; Hyprland is active | 3.4 MiB | | 31 | kde-gtk-config | KDE GTK integration; not needed | 0.3 MiB | | 32 | powerdevil | hypridle replaces | 5.9 MiB | | 33 | xdg-desktop-portal-kde | xdg-desktop-portal-hyprland in use | 2.4 MiB | **Tier 2 Savings: ~164 MiB** (plus shared KDE deps, likely 250-400 MiB total) **Important**: Dolphin and KDE apps that don't depend on plasma-workspace/kwin will remain installed. Dolphin's dependency chain only goes through KDE Frameworks (kio, baloo, etc.), not plasma-workspace. ### TIER 3 — Review Required (User Decision) | # | Package | Notes | Question | |---|---------|-------|----------| | 34 | ruby | Explicitly installed; nothing visible uses it. ~50 ruby-* subpackages exist as deps. | Is anything using Ruby? | | 35 | love | LÖVE 2D game engine. 4.1 MiB. No .love files found. | Still needed? | | 36 | xorg-server | Required by lightdm+sddm (both being removed). xorg-xwayland is separate and will remain. | Remove after Tiers 1+2? | | 37 | xf86-input-libinput | Required by xorg-server. If xorg-server goes, this can go too. | Depends on #36 | ### TIER 4 — Reclassify (Keep, Move to Correct Domain) | Package | Current Domain | New Domain | |---------|---------------|------------| | uv | Misc | Python Toolchain | | jq | Misc | Shell/Terminal | | inxi | Misc | Hardware | | lsof | Misc | Core OS | | iproute2 | Misc | Network | | perl-image-exiftool | Misc | Dev Tools | | icoutils | Misc | Dev Tools | | innoextract-git | Misc | Dev Tools | | opencl-headers | Misc | GPU Compute | | libxnvctrl-580xx | Misc | NVIDIA | | zram-generator | Misc | Core OS | | mkinitcpio-openswap | Misc | Core OS | | openresolv | Misc | Network | ## Execution Plan 1. **Tier 1**: Remove 23 packages via Ansible + `pacman -Rns` (safe, no dependents) 2. **Tier 2**: Remove 10 KDE Plasma packages (cascade; verify dolphin survives) 3. **Tier 3**: Get user decisions, then act 4. **Tier 4**: Reclassify in Ansible vars (no removal, documentation only) 5. **Verify**: Run `ansible-playbook --check` after each tier 6. **Document**: Update `docs/tech/stack.md` and CHANGELOG.md ### Safety - xorg-xwayland stays (required by Hyprland for X11 app compatibility) - xf86-input-libinput stays if xorg-server stays (Tier 3 decision) - Dolphin and all KDE Frameworks libs stay (no dependency on plasma-workspace) - Backup: `pacman -Qe` snapshot before execution ## Expected Outcome | Metric | Before | After | |--------|--------|-------| | Explicit packages | 466 | ~425-430 | | Disk freed | — | 300-500 MiB | | X11 surface area | 24 packages | 1-2 (xorg-xwayland + maybe xorg-server) | | KDE Plasma | 13 packages | 0 | | Update complexity | High | Reduced |