{ config, pkgs, lib, ... }: {
  options = {
    firefox-extensions = lib.mkOption {
      #      per-profile
      type = lib.types.attrsOf (lib.types.submodule { options = {
        browser-extension-data = lib.mkOption {
          #      per-extension
          type = lib.types.attrsOf (lib.types.submodule { options = {
            storage = lib.mkOption {
              type = lib.types.attrs;
              default = {};
              description = ''
                Attrs that will be converted to json and merged to storage.js
              '';
            };
          };});
        };
        extension-settings = lib.mkOption {
          type = lib.types.mkOptionType {
            name = "attrsRecursiveUpdate";
            description = "attribute set";
            check = lib.isAttrs;
            merge = loc: lib.foldl' (res: def: lib.recursiveUpdate res def.value) { };
            emptyValue = {
              value = { };
            };
          };
          default = {};
          description = ''
            The extension-settings.json
          '';
        };
      };});
      default = {};
      description = ''
        Attrs of firefox-extensions settings

        You may ask: why not using `programs.firefox.profiles.<name>.extensions.settings`?
        Because it do not support partially updating the settings.

        Example:

        firefox-extensions = {
          profile0 = {
            browser-extension-data = {
              darkreader = {
                storage = {
                  schemeVersion = 2;
                  syncSettings = false;
                  disabledFor = [
                    "http://127.0.0.1:7768"
                  ];
                };
              };
            };
            extension-settings = {
              ...
            };
          };
          profile1 = {...};
        };
      '';
    };
  };

  config = {
    yq-merge = (builtins.listToAttrs (lib.flatten (
      lib.mapAttrsToList (profile: per-profile-settings: (
        lib.mapAttrsToList (extensionId: per-extension-settings: {
          name = "${config.programs.firefox.configPath}/${profile}/browser-extension-data/${extensionId}/storage.js";
          value.text = builtins.toJSON per-extension-settings.storage;
        }) per-profile-settings.browser-extension-data
      )) config.firefox-extensions
    ))) // (
      lib.mapAttrs' (profile: per-profile-settings: {
        name = "${config.programs.firefox.configPath}/${profile}/extension-settings.json";
        value.text = builtins.toJSON ({
          version = 3;
        } // per-profile-settings.extension-settings);
      }) config.firefox-extensions
    );

    programs.firefox.profiles = lib.mapAttrs (profile: _: {
      settings = {
        "extensions.webextensions.ExtensionStorageIDB.enabled" = false;
      };
    }) config.firefox-extensions;
  };
}