{ lib, config, ... }: let # --- Module variables --- moduleName = "kitty"; username = config.defaultUser or "henrov"; # Assets path relative to this module assetPath = ../../../assets/system/conf/${moduleName}; # Read all files in the assets directory programFiles = builtins.readDir assetPath; files = lib.genAttrs (builtins.attrNames programFiles) (name: { src = "${assetPath}/${name}"; }); # Top-level toggle for this module enableProgram = config.enableKitty or true; in { # --- Declare the top-level toggle --- options.enableKitty = lib.mkEnableOption "Enable Kitty terminal integration"; # --- Configuration applied only if enabled --- config = lib.mkIf enableProgram { # Dendritic container for the program myApps.${moduleName} = { enable = true; user = username; assetsDir = assetPath; files = files; theme = "Catppuccin-Mocha"; }; # Deploy config files to the user's ~/.config directory home-manager.users.${username} = { programs.kitty.enable = true; xdg.configFile = lib.mapAttrs' (name: value: { name = "${moduleName}/${name}"; value.source = value.src; }) files; }; # Optional: systemd service to sync / deploy configuration systemd.services."${moduleName}-sync" = { description = "Sync ${moduleName} configuration"; wantedBy = [ "multi-user.target" ]; wants = [ "network-online.target" ]; after = [ "network-online.target" ]; serviceConfig = { Type = "oneshot"; ExecStart = '' set -euo pipefail CONF="${assetPath}" USER_HOME="/home/${username}" # Copy all asset files into user's config directory for f in ${lib.concatStringsSep " " (builtins.attrNames files)}; do cp -u "$CONF/$f" "$USER_HOME/.config/${moduleName}/$f" done ''; }; restartTriggers = [ assetPath ]; # Minimal PATH for the service path = [ # Only include binaries if necessary # pkgs.coreutils # pkgs.gnugrep ]; }; }; }