{
  description = "nipsy's NixOS configurations";

  inputs = {

    disko = {
      url = "github:nix-community/disko";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    home-manager-stable = {
      url = "github:nix-community/home-manager/release-24.05";
      inputs.nixpkgs.follows = "nixpkgs-stable";
    };

    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    nixos-hardware.url = "github:nixos/nixos-hardware";

    # per https://nixos-and-flakes.thiscute.world/nixos-with-flakes/downgrade-or-upgrade-packages
    #nixpkgs-67e692392.url = "github:nixos/nixpkgs/67e69239226f37168d1adb8d29bd61150756a03e";
    nixpkgs-master.url = "github:nixos/nixpkgs";
    #nixpkgs-pr363651.url = "github:SuperSandro2000/nixpkgs/openstack-socks";
    nixpkgs-stable.url = "github:nixos/nixpkgs/release-24.05";
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";

    nvidia-patch = {
      url = "github:icewind1991/nvidia-patch-nixos";
      inputs.nixpkgs.follows = "nixpkgs";
    };

    sops-nix = {
      url = "github:Mic92/sops-nix";
      inputs.nixpkgs.follows = "nixpkgs";
    };

  };

  outputs = { disko, home-manager-stable, home-manager, nixos-hardware, nixpkgs-master, nixpkgs-stable, nixpkgs, nvidia-patch, self, sops-nix, ... } @ inputs: let
    inherit (self) outputs;
    systems = [
      #"aarch64-linux"
      #"i686-linux"
      "x86_64-linux"
      #"aarch64-darwin"
      #"x86_64-darwin"
    ];
    forAllSystems = nixpkgs.lib.genAttrs systems;
  in {

    nixosConfigurations = {

      arrakis = nixpkgs.lib.nixosSystem {
        specialArgs = { inherit inputs outputs; };
        modules = [
          disko.nixosModules.disko
          ./hosts/arrakis
          home-manager.nixosModules.home-manager {
            home-manager.sharedModules = [ sops-nix.homeManagerModules.sops ];
            home-manager.users.root = import ./home/root/arrakis.nix;
            home-manager.users.nipsy = import ./home/nipsy/arrakis.nix;
          }
          sops-nix.nixosModules.sops
        ];
      };

      darkstar = nixpkgs.lib.nixosSystem {
        specialArgs = { inherit inputs outputs; };
        modules = [
          disko.nixosModules.disko
          ./hosts/darkstar
          home-manager.nixosModules.home-manager {
            #home-manager.sharedModules = [ sops-nix.homeManagerModules.sops ];
            home-manager.users.root = import ./home/root/darkstar.nix;
            home-manager.users.nipsy = import ./home/nipsy/darkstar.nix;
          }
          sops-nix.nixosModules.sops
        ];
      };

      ginaz = nixpkgs.lib.nixosSystem rec {
        specialArgs = { inherit inputs outputs; };
        modules = [
          disko.nixosModules.disko
          ./hosts/ginaz
          home-manager.nixosModules.home-manager {
            home-manager.sharedModules = [ sops-nix.homeManagerModules.sops ];
            home-manager.users.root = import ./home/root/ginaz.nix;
            home-manager.users.nipsy = import ./home/nipsy/ginaz.nix;
          }
          nixos-hardware.nixosModules.lenovo-yoga-7-14ARH7-amdgpu
          sops-nix.nixosModules.sops
        ];
      };

      # from https://nixos.wiki/wiki/Creating_a_NixOS_live_CD and https://chengeric.com/homelab/
      iso = nixpkgs.lib.nixosSystem {
        modules = [
          "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix"
          ({
            #isoImage.squashfsCompression = "gzip -Xcompression-level 1";
            nix.settings.experimental-features = [ "nix-command" "flakes" ];
            users.users = {
              nixos.openssh.authorizedKeys.keys = [ (builtins.readFile ./hosts/common/users/nipsy/keys/id_arrakis.pub) ];
              root.openssh.authorizedKeys.keys = [ (builtins.readFile ./hosts/common/users/nipsy/keys/id_arrakis.pub) ];
            };
          })
        ];
        system = "x86_64-linux";
      };

      kaitain = nixpkgs.lib.nixosSystem rec {
        specialArgs = { inherit inputs outputs; };
        modules = [
          disko.nixosModules.disko
          ./hosts/kaitain
          home-manager.nixosModules.home-manager {
            #home-manager.sharedModules = [ sops-nix.homeManagerModules.sops ];
            home-manager.users.root = import ./home/root/kaitain.nix;
            home-manager.users.nipsy = import ./home/nipsy/kaitain.nix;
          }
          sops-nix.nixosModules.sops
        ];
      };

      jupiter = nixpkgs.lib.nixosSystem rec {
        specialArgs = { inherit inputs outputs; };
        modules = [
          disko.nixosModules.disko
          ./hosts/jupiter
          home-manager.nixosModules.home-manager {
            #home-manager.sharedModules = [ sops-nix.homeManagerModules.sops ];
            home-manager.users.root = import ./home/root/jupiter.nix;
            home-manager.users.nipsy = import ./home/nipsy/jupiter.nix;
          }
          #sops-nix.nixosModules.sops
        ];
      };

      neptune = nixpkgs.lib.nixosSystem rec {
        specialArgs = { inherit inputs outputs; };
        modules = [
          disko.nixosModules.disko
          ./hosts/neptune
          home-manager.nixosModules.home-manager {
            #home-manager.sharedModules = [ sops-nix.homeManagerModules.sops ];
            home-manager.users.root = import ./home/root/neptune.nix;
            home-manager.users.nipsy = import ./home/nipsy/neptune.nix;
          }
          #sops-nix.nixosModules.sops
        ];
      };

      netboot = nixpkgs.lib.nixosSystem {
        modules = [
          "${nixpkgs}/nixos/modules/installer/netboot/netboot-minimal.nix"
          ({
            #isoImage.squashfsCompression = "gzip -Xcompression-level 1";
            nix.settings.experimental-features = [ "nix-command" "flakes" ];
            users.users = {
              nixos.openssh.authorizedKeys.keys = [ (builtins.readFile ./hosts/common/users/nipsy/keys/id_arrakis.pub) ];
              root.openssh.authorizedKeys.keys = [ (builtins.readFile ./hosts/common/users/nipsy/keys/id_arrakis.pub) ];
            };
          })
        ];
        system = "x86_64-linux";
      };

      richese = nixpkgs.lib.nixosSystem rec {
        specialArgs = { inherit inputs outputs; };
        modules = [
          disko.nixosModules.disko
          ./hosts/richese
          home-manager.nixosModules.home-manager {
            #home-manager.sharedModules = [ sops-nix.homeManagerModules.sops ];
            home-manager.users.root = import ./home/root/richese.nix;
            home-manager.users.nipsy = import ./home/nipsy/richese.nix;
          }
          sops-nix.nixosModules.sops
        ];
      };

      saturn = nixpkgs.lib.nixosSystem rec {
        specialArgs = { inherit inputs outputs; };
        modules = [
          disko.nixosModules.disko
          ./hosts/saturn
          home-manager.nixosModules.home-manager {
            #home-manager.sharedModules = [ sops-nix.homeManagerModules.sops ];
            home-manager.users.root = import ./home/root/saturn.nix;
            home-manager.users.nipsy = import ./home/nipsy/saturn.nix;
          }
          #sops-nix.nixosModules.sops
        ];
      };

      uranus = nixpkgs.lib.nixosSystem rec {
        specialArgs = { inherit inputs outputs; };
        modules = [
          disko.nixosModules.disko
          ./hosts/uranus
          home-manager.nixosModules.home-manager {
            #home-manager.sharedModules = [ sops-nix.homeManagerModules.sops ];
            home-manager.users.root = import ./home/root/uranus.nix;
            home-manager.users.nipsy = import ./home/nipsy/uranus.nix;
          }
          #sops-nix.nixosModules.sops
        ];
      };

    };

    overlays = import ./overlays {inherit inputs;};
    packages = forAllSystems (system: import ./pkgs nixpkgs.legacyPackages.${system});

  };

}