{
  lib,
  options,
  namespace,
  inputs,
  ...
}:
{
  options.${namespace}.home = with lib.types; {
    configFile = lib.mkOption {
      type = attrs;
      default = { };
      description = "A set of files to be managed by home-manager's <option>xdg.configFile</option>.";
    };
    extraOptions = lib.mkOption {
      type = attrs;
      default = { };
      description = "Options to pass directly to home-manager.";
    };
    file = lib.mkOption {
      type = attrs;
      default = { };
      description = "A set of files to be managed by home-manager's <option>home.file</option>.";
    };
  };

  config = {
    home-manager = {
      # enables backing up existing files instead of erroring if conflicts exist
      backupFileExtension = "backup";

      useGlobalPkgs = true;
      useUserPackages = true;

      # Pass inputs so external modules can access them
      extraSpecialArgs = {
        inherit inputs namespace;
        overlays = with inputs; [
          nix-vscode-extensions.overlays.default
        ];
      };

      # Make ALL external HM modules available globally
      sharedModules = with inputs; [
        sops-nix.homeManagerModules.sops
        nix-plist-manager.homeManagerModules.default
        # Add any other external HM modules here
      ];

      users."mattjallen" = lib.mkAliasDefinitions options.${namespace}.home.extraOptions;

      verbose = true;
    };
  };
}
