{ config, pkgs, lib, ... }: let kodiPkg = pkgs.kodi-wayland.withPackages (p: [ p.jellycon p.sendtokodi p.inputstream-adaptive ]); hyprlandConfig = '' # Monitor — auto-detect, native resolution monitor = , preferred, auto, 1 # Launch Kodi and Firefox on login exec-once = ${lib.getExe' kodiPkg "kodi"} exec-once = ${lib.getExe pkgs.firefox} # Workspace rules — Kodi on 1, Firefox on 2 windowrulev2 = workspace 1 silent, class:^(kodi)$ windowrulev2 = workspace 2 silent, class:^(firefox)$ windowrulev2 = fullscreen, class:^(kodi)$ windowrulev2 = fullscreen, class:^(firefox)$ # Start on workspace 1 (Kodi) workspace = 1, default:true # Switch workspaces with Super+1/2 bind = SUPER, 1, workspace, 1 bind = SUPER, 2, workspace, 2 # No gaps, no borders — TV setup general { gaps_in = 0 gaps_out = 0 border_size = 0 } decoration { rounding = 0 } # Disable animations for snappy switching animations { enabled = false } misc { # Disable Hyprland logo/splash disable_hyprland_logo = true disable_splash_rendering = true } ''; in { # Hyprland compositor with UWSM for proper dbus/systemd session management programs.hyprland = { enable = true; withUWSM = true; portalPackage = pkgs.xdg-desktop-portal-hyprland; }; # greetd for auto-login — UWSM starts Hyprland as a systemd session services.greetd = { enable = true; settings = { default_session = { command = "uwsm start hyprland-uwsm.desktop"; user = "kodi"; }; }; }; # Deploy Hyprland config to kodi user's XDG config dir systemd.tmpfiles.rules = [ "d /home/kodi/.config/hypr 0755 kodi kodi -" ]; environment.etc."skel/hypr/hyprland.conf".text = hyprlandConfig; system.activationScripts.hyprlandConfig = lib.stringAfter [ "users" ] '' install -D -o kodi -g kodi -m 0644 /dev/stdin /home/kodi/.config/hypr/hyprland.conf <<'HYPRCONF' ${hyprlandConfig} HYPRCONF ''; # Kodi user users.users.kodi = { isNormalUser = true; home = "/home/kodi"; group = "kodi"; extraGroups = [ "video" "audio" "input" ]; }; users.groups.kodi = { }; # Packages available on the system environment.systemPackages = [ kodiPkg pkgs.firefox pkgs.yt-dlp ]; # PipeWire for audio (HDMI passthrough support) services.pipewire = { enable = true; alsa.enable = true; pulse.enable = true; }; # Allow VA-API hardware decode in Firefox environment.sessionVariables = { MOZ_ENABLE_WAYLAND = "1"; LIBVA_DRIVER_NAME = "iHD"; }; # Ship Kodi logs to Loki services.promtail.configuration.scrape_configs = [ { job_name = "kodi"; static_configs = [ { targets = [ "localhost" ]; labels = { job = "kodi"; hostname = config.networking.hostName; tier = config.homelab.host.tier; role = config.homelab.host.role; __path__ = "/home/kodi/.kodi/temp/kodi.log"; }; } ]; } ]; }