{ lib, pkgs, config, ... }: let inherit (lib) mapAttrsToList mkOption; inherit (lib.types) loaOf attrsOf path submodule; inherit (pkgs) linkFarm; userOptions = { options.xdg.config.paths = mkOption { default = {}; type = attrsOf path; }; }; in { options = { users.users = mkOption { type = loaOf (submodule userOptions); }; }; config = { environment.etc."xdg/nixos/per-user".source = linkFarm "xdg-config-users" (mapAttrsToList (user: { xdg, ... }: { name = user; path = linkFarm "${user}-xdg-config-home" (mapAttrsToList (name: path: { inherit name path; }) xdg.config.paths); }) config.users.users); environment.extraInit = '' etc_xdg_config_home=/run/current-system/etc/xdg/nixos/per-user/$USER if [ -d "$etc_xdg_config_home" ]; then export XDG_CONFIG_HOME="''${XDG_CONFIG_HOME-$etc_xdg_config_home}" fi export XDG_DATA_HOME="''${XDG_DATA_HOME-$HOME/state}" export XDG_CACHE_HOME="''${XDG_DATA_HOME-$HOME/state/cache}" ''; }; }