{ pkgs, config, lib, ... }: let inherit (lib) mkOption mkEnableOption mkPackageOption types; defaultExtensions = with pkgs.nur.repos.rycee.firefox-addons; [ bitwarden darkreader i-dont-care-about-cookies privacy-badger ublock-origin ]; defaultSettings = { "app.normandy.first_run" = false; "app.shield.optoutstudies.enabled" = false; # disable updates (pretty pointless with nix) "app.update.channel" = "default"; "browser.contentblocking.category" = "standard"; # "strict" "browser.ctrlTab.recentlyUsedOrder" = false; "browser.download.viewableInternally.typeWasRegistered.svg" = true; "browser.download.viewableInternally.typeWasRegistered.webp" = true; "browser.download.viewableInternally.typeWasRegistered.xml" = true; "browser.search.region" = "DE"; "browser.shell.checkDefaultBrowser" = false; "browser.tabs.loadInBackground" = true; "browser.urlbar.placeholderName" = "EnteEnteLauf"; "browser.urlbar.showSearchSuggestionsFirst" = false; # disable all the annoying quick actions "browser.urlbar.quickactions.enabled" = false; "browser.urlbar.quickactions.showPrefs" = false; "browser.urlbar.shortcuts.quickactions" = false; "browser.urlbar.suggest.quickactions" = false; "distribution.searchplugins.defaultLocale" = "en-US"; "doh-rollout.balrog-migration-done" = true; "doh-rollout.doneFirstRun" = true; "general.useragent.locale" = "en-US"; "extensions.activeThemeID" = "firefox-compact-dark@mozilla.org"; "extensions.extensions.activeThemeID" = "firefox-compact-dark@mozilla.org"; "extensions.update.enabled" = false; "extensions.webcompat.enable_picture_in_picture_overrides" = true; "extensions.webcompat.enable_shims" = true; "extensions.webcompat.perform_injections" = true; "extensions.webcompat.perform_ua_overrides" = true; "privacy.donottrackheader.enabled" = true; "browser.translations.enable" = false; # Yubikey "security.webauth.u2f" = true; "security.webauth.webauthn" = true; "security.webauth.webauthn_enable_softtoken" = false; "security.webauth.webauthn_enable_usbtoken" = true; "toolkit.legacyUserProfileCustomizations.stylesheets" = true; "layout.word_select.stop_at_punctuation" = false; }; cfg = config.personal.firefox; in { options.personal.firefox = { enable = mkEnableOption "Apply personal firefox defaults."; package = mkPackageOption pkgs "firefox-bin" {}; extraExtensions = mkOption { type = types.listOf types.package; default = []; description = "Extra Firefox extensions to install."; }; settings = mkOption { type = types.attrsOf ((pkgs.formats.json {}).type // { description = "Preferences (int, bool, string, and also attrs, list, float as a JSON string)"; }); default = defaultSettings; description = "Attribute set of preferences."; }; }; config = { programs.firefox = lib.mkIf cfg.enable { enable = true; package = cfg.package; profiles = { default = { isDefault = true; id = 0; userChrome = builtins.readFile ./userChrome.css; extensions = defaultExtensions ++ cfg.extraExtensions; inherit (cfg) settings; }; }; }; }; }