let
  sources' = import ./npins;

  # Patch sources directly
  sources = builtins.mapAttrs (patch.base { pkgs = import sources'.nixos-unstable { }; })
    .applyPatches' sources';

  nix-lib = import ./lib/nix-lib;

  patch = import ./lib/nix-patches { patchFile = ./patches; };

  nodes' = import ./meta/nodes.nix;
  nodes = builtins.attrNames nodes';

  mkNode = node: {
    # Import the base configuration for each node
    imports = [ ./machines/${node}/_configuration.nix ];
  };

  nixpkgs' = import ./meta/nixpkgs.nix;
  # All supported nixpkgs versions, instanciated
  nixpkgs = nix-lib.mapSingleFuse mkNixpkgs nixpkgs'.supported;

  # Get the configured nixos version for the node,
  # defaulting to the one defined in meta/nixpkgs
  version = node: nodes'.${node}.nixpkgs or nixpkgs'.default;

  # Builds a patched version of nixpkgs, only as the source
  mkNixpkgs' =
    v:
    patch.mkNixpkgsSrc rec {
      src = sources'.${name};
      name = "nixos-${v}";
    };

  # Instanciates the required nixpkgs version
  mkNixpkgs = version: import (mkNixpkgs' version) { };

  ###
  # Function to create arguments based on the node
  #
  mkArgs = node: rec {
    lib = nixpkgs.${version node}.lib // {
      extra = nix-lib;
    };

    meta = (import ./meta) lib;

    nodeMeta = meta.nodes.${node};
  };
in

{
  meta = {
    nodeNixpkgs = nix-lib.mapSingleFuse (n: nixpkgs.${version n}) nodes;

    specialArgs = {
      inherit nixpkgs sources;

      dgn-keys = import ./keys;
    };

    nodeSpecialArgs = nix-lib.mapSingleFuse mkArgs nodes;
  };

  defaults =
    {
      pkgs,
      name,
      nodeMeta,
      ...
    }:
    {
      # Import the default modules
      imports = [
        ./modules
        (import "${sources.lix-module}/module.nix" {
          lix = pkgs.applyPatches {
            name = "lix-2.90.patched";
            src = sources.lix;
            patches = [ ./patches/00-disable-installChecks-lix.patch ];
          };
        })
      ];

      # Include default secrets
      age-secrets.sources = [ ./machines/${name}/secrets ];

      # Deployment config is specified in meta.nodes.${node}.deployment
      inherit (nodeMeta) deployment;

      nix = {
        # Set NIX_PATH to the patched version of nixpkgs
        nixPath = [ "nixpkgs=${mkNixpkgs' (version name)}" ];
        optimise.automatic = true;

        gc = {
          automatic = true;
          dates = "weekly";
          options = "--delete-older-than 7d";
        };
      };

      # Allow unfree packages
      nixpkgs.config.allowUnfree = true;

      # Use the stateVersion declared in the metadata
      system = {
        inherit (nodeMeta) stateVersion;
      };
    };
}
// (nix-lib.mapSingleFuse mkNode nodes)