{
  self,
  nixpkgs,
  home-manager,
  raspberry-pi-nix,
  sops-nix,
  ...
}:
let
  mkSystem =
    hostName: modules:
    let
      hostSystem = self.hosts.${hostName}.system;
    in
    nixpkgs.lib.nixosSystem {
      system = hostSystem;
      modules = [
        home-manager.nixosModules.home-manager
        (_: {
          networking.hostName = hostName;
          nixpkgs.overlays = [ self.overlays.default ];
          nixpkgs.config.allowUnfree = true;
        })
      ] ++ modules;
      specialArgs = { inherit raspberry-pi-nix sops-nix; };
    };
in
{
  # Aristotle
  agent = mkSystem "agent" [ ./hosts/aristotle/configuration.nix ];
  form = mkSystem "form" [ ./hosts/aristotle/configuration.nix ];
  matter = mkSystem "matter" [ ./hosts/aristotle/configuration.nix ];
  purpose = mkSystem "purpose" [ ./hosts/aristotle/configuration.nix ];

  plato = mkSystem "plato" [ ./hosts/plato/configuration.nix ];
  socrates = mkSystem "socrates" [ ./hosts/socrates/configuration.nix ];
}