{ config, pkgs, username, project, ... }: { #To show logs of services run: #journalctl --user-unit={service-name} --user systemd.user.services.niri-waybar = { description = "Waybar status bar for Niri"; # "wantedBy" replaces the [Install] section wantedBy = [ "graphical-session.target" ]; # "partOf" and "after" replace the [Unit] section dependencies partOf = [ "graphical-session.target" ]; after = [ "graphical-session.target" ]; # [Unit] configuration goes here unitConfig = { # This checks the environment variable to ensure we are in Niri ConditionEnvironment = "XDG_CURRENT_DESKTOP=niri"; }; # [Service] configuration goes here serviceConfig = { ExecStart = "${pkgs.waybar}/bin/waybar"; Restart = "on-failure"; RestartSec = "1s"; }; }; # 2. The Niri Session Cleanup Service # This service starts when the graphical session starts, and when it stops, # it forcibly stops the graphical-session.target to ensure a clean state for the next login. systemd.user.services.niri-session-manager = { description = "Niri Session Management"; wantedBy = [ "graphical-session.target" ]; partOf = [ "graphical-session.target" ]; # Only run this cleanup logic for Niri unitConfig.ConditionEnvironment = "XDG_CURRENT_DESKTOP=niri"; serviceConfig = { Type = "simple"; # A dummy command that stays alive. 'sleep infinity' is low resource. ExecStart = "${pkgs.coreutils}/bin/sleep infinity"; # IMPORTANT: When this service stops (which happens when niri kills its children), # it brings down the whole target. ExecStopPost = "${pkgs.systemd}/bin/systemctl --user stop graphical-session.target"; }; }; }