{inputs}: let
  util = (import ./default.nix) {inherit inputs;};
  outputs = inputs.self.outputs;

  lib = inputs.lib;
  lix-module = inputs.lix-module;
  nixpkgs = inputs.nixpkgs;
  home-manager = inputs.home-manager;
  sops-nix = inputs.sops-nix;

  systems = [
    "aarch64-darwin"
    "aarch64-linux"
    "x86_64-darwin"
    "x86_64-linux"
  ];
  forEachSystem = nixpkgs.lib.genAttrs systems;
  pkgsFor = system: nixpkgs.legacyPackages.${system};

  home-manager-config = nixpkgs: {
    home-manager.useGlobalPkgs = true;
    home-manager.useUserPackages = true;
    home-manager.backupFileExtension = "backup";
    home-manager.extraSpecialArgs = {inherit inputs;};
    home-manager.users = import ../homes nixpkgs;
  };
in {
  forEachPkgs = lambda: forEachSystem (system: lambda (pkgsFor system));

  mkUnless = condition: yes: (lib.mkIf (!condition) yes);
  mkIfElse = condition: yes: no:
    lib.mkMerge [
      (lib.mkIf condition yes)
      (lib.mkUnless condition no)
    ];

  mkSystem = host:
    inputs.nixpkgs.lib.nixosSystem {
      specialArgs = {inherit inputs outputs util;};
      modules = [
        lix-module.nixosModules.default
        sops-nix.nixosModules.sops
        home-manager.nixosModules.home-manager
        home-manager-config
        ../overlays
        ../hosts/${host}
      ];
    };

  # mkHome = user: host:
  #   home-manager.lib.homeManagerConfiguration {
  #     # pkgs = pkgsFor system;
  #     extraSpecialArgs = {
  #       inherit inputs util outputs;
  #     };
  #     modules = [
  #       # config
  #       outputs.homeManagerModules.default
  #     ];
  #   };
}