{ config, extendModules, lib, ... }: with lib; { options.specialization = mkOption { type = types.attrsOf (types.submodule { options = { configuration = mkOption { type = let stopRecursion = { specialization = mkOverride 0 { }; }; extended = extendModules { modules = [ stopRecursion ]; }; in extended.type; default = { }; visible = "shallow"; description = '' Arbitrary Home Manager configuration settings. ''; }; }; }); default = { }; description = '' A set of named specialized configurations. These can be used to extend your base configuration with additional settings. For example, you can have specializations named light and dark that applies light and dark color theme configurations. Note, this is an experimental option for now and you therefore have to activate the specialization by looking up and running the activation script yourself. Note, running the activation script will create a new Home Manager generation. For example, to activate the dark specialization. You can first look up your current Home Manager generation by running $ home-manager generations | head -1 2022-05-02 22:49 : id 1758 -> /nix/store/jy…ac-home-manager-generation then run $ /nix/store/jy…ac-home-manager-generation/specialization/dark/activate Starting Home Manager activation … WARNING! Since this option is experimental, the activation process may change in backwards incompatible ways. ''; }; config = mkIf (config.specialization != { }) { home.extraBuilderCommands = let link = n: v: let pkg = v.configuration.home.activationPackage; in "ln -s ${pkg} $out/specialization/${n}"; in '' mkdir $out/specialization ${concatStringsSep "\n" (mapAttrsToList link config.specialization)} ''; }; }