{ lib, config, inputs, ... }: let username = config.defaultUser or "henrov"; modulesPath = ./generated/modules; moduleSwitches = builtins.fromJSON (builtins.readFile ./assets/system/conf/modules.json); importedModules = inputs.import-tree modulesPath; # Keep only enabled modules enabledModules = lib.filterAttrs (name: _: moduleSwitches.${name} or false) importedModules.imports; moduleList = builtins.attrValues enabledModules; # Recursive evaluator: forces functions → attrsets forceAttrs = val: if builtins.isFunction val then forceAttrs (val {}) else if builtins.isAttrs val then lib.mapAttrs (_: v: forceAttrs v) val else if builtins.isList val then map forceAttrs val else val; # Extract fragment safely safeFragment = m: let frag = if builtins.hasAttr "homeManagerExtraUserFragment" m then m.homeManagerExtraUserFragment else {}; in forceAttrs frag; # Merge all fragments mergedFragments = lib.foldl' lib.mkMerge {} (map safeFragment moduleList); in { networking.hostName = "traveldroid"; system.stateVersion = "26.05"; home-manager.users = { "${username}" = mergedFragments; }; # Bonus: list all imported module files traveldroidModules = builtins.attrNames enabledModules; }