{
  lib,
  inputs,
  self,
  rootPath,
  ...
}:
let
  inherit (self) outputs;
  homeModules =
    (
      (rootPath + "/home")
      |> builtins.readDir
      |> lib.filterAttrs (_key: value: value == "directory")
      |> lib.filterAttrs (
        key: _value:
        !builtins.elem key [
          "modules"
          "extra"
        ]
      )
      |> builtins.attrNames
      |> (with lib; flip genAttrs (name: import (rootPath + "/home/${name}/modules")))
    )
    // {
      default = import "${toString rootPath}/home/modules";
      extra = import "${toString rootPath}/home/extra";
    };
  makeHomeConfiguration =
    {
      hostName,
      unixName ? "david",
      system ? "x86_64-linux",
      nixpkgs ? inputs.nixpkgs,
      home-manager ? inputs.home-manager,
    }:
    {
      "${unixName}@${hostName}" = home-manager.lib.homeManagerConfiguration {
        pkgs = import nixpkgs {
          inherit system;
        };
        modules = [
          (rootPath + "/home/${unixName}/configurations/${hostName}")
        ]
        ++ (with homeModules; [
          default
          extra
        ])
        ++ [
          homeModules."${unixName}"
        ]
        ++ [
          {
            lib = { inherit (lib) youthlic; };
          }
        ];
        extraSpecialArgs = {
          inherit
            inputs
            outputs
            unixName
            hostName
            system
            rootPath
            ;
        };
      };
    };
in
{
  flake = {
    homeConfigurations = lib.foldr (a: b: a // b) { } (
      [
        # Hostname
      ]
      |> map (hostName: makeHomeConfiguration { inherit hostName; })
    );
    inherit homeModules;
  };
}
