{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; home-manager = { url = "github:nix-community/home-manager/release-25.11"; inputs.nixpkgs.follows = "nixpkgs"; }; nixos-apple-silicon = { url = "github:nix-community/nixos-apple-silicon"; inputs.nixpkgs.follows = "nixpkgs-unstable"; }; agenix = { url = "github:ryantm/agenix"; inputs.nixpkgs.follows = "nixpkgs"; inputs.home-manager.follows = "home-manager"; }; nix-vscode-extensions = { url = "github:nix-community/nix-vscode-extensions"; inputs.nixpkgs.follows = "nixpkgs-unstable"; }; nixpkgs-esp-dev = { url = "github:mirrexagon/nixpkgs-esp-dev"; inputs.nixpkgs.follows = "nixpkgs-unstable"; }; flake-compat.url = "github:edolstra/flake-compat"; }; outputs = inputs@{ self, nixpkgs, nixpkgs-unstable, nixos-apple-silicon, agenix, home-manager, nix-vscode-extensions, nixpkgs-esp-dev, ... }: let systems = { x86 = "x86_64-linux"; arm = "aarch64-linux"; }; roles = lib.genAttrs [ "desktop" "development-server" "remote-server" ] lib.id; machines = with systems; with roles; [ { name = "graphite"; system = x86; role = desktop; } { name = "moissanite"; system = arm; role = desktop; } { name = "bismuth"; system = x86; role = desktop; } { name = "serpentine"; system = x86; role = development-server; } { name = "wolfram"; system = x86; role = remote-server; } ]; overlays = [ nixos-apple-silicon.overlays.default # unused on non-asahi machines agenix.overlays.default nix-vscode-extensions.overlays.default nixpkgs-esp-dev.overlays.default (import ./overlay.nix) ]; packageSetsForSystem = system: let commonPkgsInputs = { inherit system; config = import ./config.nix; }; in rec { pkgs = import nixpkgs (commonPkgsInputs // { inherit overlays; }); unstablePkgs = import nixpkgs-unstable commonPkgsInputs; auxiliaryPkgs = import ./pkgs { inherit pkgs unstablePkgs nixpkgs nixpkgs-unstable ; }; }; inherit (nixpkgs) lib; in { nixosConfigurations = lib.mergeAttrsList ( map ( machine: let packageSets = packageSetsForSystem machine.system; specialArgs = inputs // packageSets // { me = machine; }; in { ${machine.name} = lib.nixosSystem { inherit (machine) system; inherit specialArgs; modules = [ ./machines/${machine.name} ./roles/${machine.role}.nix home-manager.nixosModules.home-manager { home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; home-manager.backupFileExtension = "hm-backup"; home-manager.extraSpecialArgs = specialArgs; home-manager.users.mel = import ./machines/${machine.name}/home.nix; } agenix.nixosModules.default ]; }; } ) machines ); # compatibility wrapper for nixos-option legacyPackages = lib.genAttrs (lib.attrValues systems) ( system: let packageSets = packageSetsForSystem system; in with packageSets; pkgs.recurseIntoAttrs pkgs ); }; }