{ lib, config, osConfig, ... }: let buildProfilePersistence = profile: { directories = [ ".mozilla/firefox/${profile}/extensions" ]; files = [ ".mozilla/firefox/${profile}/cookies.sqlite" ".mozilla/firefox/${profile}/favicons.sqlite" # Permissions and ${profileName} levels for each site ".mozilla/firefox/${profile}/permissions.sqlite" ".mozilla/firefox/${profile}/content-prefs.sqlite" # Browser history and bookmarks ".mozilla/firefox/${profile}/places.sqlite" # I guess this is useful? # https://bugzilla.mozilla.org/show_bug.cgi?id=1511384 # https://developer.mozilla.org/en-US/docs/Web/API/Storage_API/Storage_quotas_and_eviction_criteria ".mozilla/firefox/${profile}/storage.sqlite" # Extension configuration ".mozilla/firefox/${profile}/extension-settings.json" ]; allowOther = true; }; in { config = lib.mkIf (config.programs.firefox.enable && osConfig.host.impermanence.enable) { home.persistence."/persist${config.home.homeDirectory}" = lib.mkMerge ( ( lib.attrsets.mapAttrsToList (profile: _: buildProfilePersistence profile) config.programs.firefox.profiles ) ++ ( lib.lists.optional ((builtins.length (lib.attrsets.mapAttrsToList (key: value: value) config.programs.firefox.profiles)) == 0) (buildProfilePersistence "default") ) ); }; }