{ inputs, nixpkgs, nixpkgs-old, nixpkgs-latest, }: deviceName: { hostName, userName, additionalOverlays ? [ ], systemArch ? builtins.currentSystem, }: let inherit (nixpkgs) lib; DeviceCustomOptions = ../options/device; HostCustomOptions = ../options/host; HomeCustomOptions = ../options/home; DeviceConfig = ../devices/${deviceName}; HostConfig = ../users/${userName}/host; HomeConfig = ../users/${userName}/home; customFunctions = import ./utils.nix { inherit lib; }; baseOverlays = import ../overlays { inherit systemArch nixpkgs-old nixpkgs-latest userPackagesConfig ; } |> builtins.attrValues; overlays = baseOverlays ++ additionalOverlays; userData = import ../users/${userName}/data { inherit deviceName hostName userName systemArch ; }; userScripts = import ../users/${userName}/scripts; userPackagesConfig = import ../users/${userName}/packages { inherit lib; }; additionalArgs = { inherit inputs customFunctions userData userScripts ; }; sops = { defaultSopsFormat = "yaml"; defaultSopsFile = ../secrets/main.yaml; age.keyFile = "${userData.paths.sopsKeyFile}"; }; in lib.nixosSystem { system = systemArch; specialArgs = additionalArgs; modules = [ DeviceCustomOptions HostCustomOptions DeviceConfig HostConfig { nixpkgs = { inherit overlays; config = userPackagesConfig; }; networking.hostName = hostName; } inputs.home-manager.nixosModules.home-manager { home-manager = { users.${userName} = { imports = [ HomeConfig HomeCustomOptions ]; }; useGlobalPkgs = true; useUserPackages = true; extraSpecialArgs = additionalArgs; sharedModules = [ inputs.sops-nix.homeManagerModules.sops ]; }; } inputs.sops-nix.nixosModules.sops { inherit sops; home-manager.users.${userName} = { inherit sops; }; } ]; }