{ description = "Madeleine's dots for the illiterate (sydnix)"; inputs = { disko.url = "github:nix-community/disko"; nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; impermanence.url = "github:nix-community/impermanence"; home-manager.url = "github:nix-community/home-manager"; niri.url = "github:sodiboo/niri-flake"; sops-nix.url = "github:Mic92/sops-nix"; }; outputs = { nixpkgs, ... }@inputs: # TODO: Move to utils.nix. let list-nix-directory = dir: builtins.attrNames (nixpkgs.lib.filterAttrs (k: _v: nixpkgs.lib.hasSuffix ".nix" k) (builtins.readDir dir)); in { # REVIEW: Why don't we put each module under nixosModules.? nixosModules.default = let modules = list-nix-directory ./modules/nixos; in { ... }: { imports = builtins.map (m: ./modules/nixos/${m}) modules; }; homeManagerModules.default = let modules = list-nix-directory ./modules/home; in { ... }: { imports = builtins.map (m: ./modules/home/${m}) modules; }; nixosConfigurations = ( let mkHost = k: v: nixpkgs.lib.nixosSystem { specialArgs = inputs; system = import ./hosts/${k}/system.nix; # TODO: This is very ad-hoc, and I don't like it. Organise this better. modules = [ ./hosts/${k}/configuration.nix inputs.self.nixosModules.default inputs.disko.nixosModules.disko inputs.sops-nix.nixosModules.sops inputs.impermanence.nixosModules.impermanence # Directory name should always match host name. ({ ... }: { networking.hostName = k; }) # Get system users ({ config, lib, ... }: { users.users = (lib.mapAttrs (k: v: (import ./users/${k}).systemConfiguration) (lib.filterAttrs (k: _v: builtins.elem k config.sydnix.users.users) (builtins.readDir ./users))); }) # Nixpkgs configuration ({ pkgs, ... }: { nixpkgs.config.allowUnfree = true; documentation = { man.enable = true; info.enable = true; }; environment.systemPackages = with pkgs; [ man-pages stdman man-pages-posix stdmanpages ]; }) # home-manager configuration. inputs.home-manager.nixosModules.home-manager ({ config, lib, self, ... }: { home-manager.useGlobalPkgs = true; # home-manager.useUserPackages = true; home-manager.users = lib.filterAttrs (k: _v: builtins.elem k config.sydnix.users.users) self.homeConfigurations; home-manager.extraSpecialArgs = { utils = import ./lib/utils.nix { inherit config lib; pkgs = nixpkgs; }; }; }) ]; }; in builtins.mapAttrs mkHost (builtins.readDir ./hosts) ); homeConfigurations = let users = builtins.readDir ./users; mkUser = username: _v: { # TODO: This is very ad-hoc, and I don't like it. Organise this # better. imports = [ (import ./users/${username}/default.nix).homeConfiguration inputs.self.homeManagerModules.default ({ lib, ... }: { home.username = username; }) ({ pkgs, lib, ... }: { nix = { settings.experimental-features = lib.mkDefault [ "nix-command" "flakes" ]; }; }) inputs.sops-nix.homeManagerModules.sops inputs.impermanence.homeManagerModules.impermanence ]; }; in builtins.mapAttrs mkUser users; }; }