{
  config,
  pkgs,
  lib,
  user_js,
  ...
}: let
  extensions =
    builtins.fromJSON (builtins.readFile
      ./config/extensions/extensions.json);

  userChrome = builtins.readFile ./config/chrome/userChrome.css;
  bookmarks = (import ./config/bookmarks/default.nix) {
    inherit
      pkgs
      lib
      ;
  };
  engines = (import ./config/search/engines) {inherit pkgs;};

  native_messaging_hosts = (import ./config/extensions/native_messaging_hosts/default.nix) {inherit pkgs;};

  policies = (import ./config/policies) {inherit config extensions;};

  search = {
    default = "Brave Search";
    privateDefault = "Brave Search";
    force = true;
    order = [
      # DEFAULT
      "Brave Search"

      # NIX
      "Nix Packages"
      "Nix Options"
      "Nixpkgs issues"
      "Homemanager Options"
      "NixOS Wiki"
      "Nixpkgs Pull Request Tracker"

      # RUST
      "Rust std"
      "Rust tokio"

      # OTHER
      "Google Scholar"
      "Wikipedia"
      "Arch Wiki"
    ];

    inherit engines;
  };

  prefConfig = builtins.readFile "${
    (import ./config/prefs) {inherit pkgs lib config bookmarks user_js;}
  }/user.js";

  # Package {{{
  package = import ./package.nix {
    inherit config lib pkgs;
    extraPolicies = policies;
    extraNativeMessagingHosts = native_messaging_hosts;
  };
  # }}}

  # Profiles {{{
  profiles = {
    "default" = {
      inherit search userChrome;
      isDefault = true;
      id = 0;
      name = "default";
      extraConfig = prefConfig;
    };
  };

  taskwarriorProfiles = import ../taskwarrior/firefox {
    inherit
      config
      lib
      # options
      
      prefConfig
      search
      userChrome
      ;
    profile_size = builtins.length (builtins.attrNames profiles);
  };
  # }}}
in {
  options.soispha.firefox = {
    package = lib.mkOption {
      type = lib.types.package;
      default = pkgs.firefox;
      description = "Firefox package to use.";
      defaultText = lib.literalExpression "pkgs.firefox";
      relatedPackages = [
        "firefox"
        "firefox-beta-bin"
        "firefox-bin"
        "firefox-devedition-bin"
        "firefox-esr"
      ];
    };
    package_version = lib.mkOption {
      type = lib.types.str;
      default = pkgs.firefox.version;
      description = "Firefox version to use";
    };
  };

  config = {
    soispha.firefox.package = package;
    soispha.firefox.package_version = pkgs.firefox.version;
    home.sessionVariables = {
      # improve touch input & make scrolling smother
      MOZ_USE_XINPUT2 = "1";

      # improve wayland support
      MOZ_ENABLE_WAYLAND = 1;

      # tell gtk to use portals
      GTK_USE_PORTAL = 1;

      BROWSER = "firefox";
    };
    programs.firefox = {
      enable = true;
      inherit (config.soispha.firefox) package;
      profiles =
        profiles
        // taskwarriorProfiles;
    };
  };
}