{ lib, config, pkgs, ... }: let cfg = config.suits.desktop; in { options.suits.desktop = { enable = lib.mkEnableOption "Desktop"; firefox.enable = lib.mkOption { type = with lib.types; bool; default = cfg.enable; example = true; description = "Enable Firefox"; }; firefox.disableuBlockOrigin = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; firefox.disableIDontCareAboutCookies = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; firefox.disableKeepassxcBrowser = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; firefox.disableOfflineQr = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; firefox.disableDarkReader = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; firefox.disableLanguageTool = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; firefox.disableDefaultBookmarks = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; chromium.enable = lib.mkOption { type = with lib.types; bool; default = cfg.enable; example = true; description = "Enable Chromium"; }; chromium.enableWideVine = lib.mkOption { type = with lib.types; bool; default = true; example = false; }; chromium.disableChromiumWebStore = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; chromium.disableuBlockOrigin = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; chromium.disableIDontCareAboutCookies = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; chromium.disableKeepassxcBrowser = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; chromium.disableLanguageTool = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; chromium.disableDarkReader = lib.mkOption { type = with lib.types; bool; default = false; example = true; }; }; config = lib.mkIf cfg.enable { programs.firefox = lib.mkIf cfg.firefox.enable { enable = true; nativeMessagingHosts = []; # pkgs.firefoxpwa removed. I use ungoogled-chromiums PWA Implementation for better stability. policies = { # --------- Privacy --------- DisableTelemetry = true; DisableFirefoxStudies = true; DisablePocket = true; DisableFirefoxAccounts = true; AutofillAddressEnabled = false; AutofillCreditCardEnabled = false; OfferToSaveLogins = false; FirefoxHome.TopSites = false; FirefoxHome.SponsoredTopSites = false; Preferences = { "browser.newtabpage.pinned" = { Value = ""; Status = "locked"; }; "browser.topsites.contile.enabled" = { Value = false; Status = "locked"; }; }; # -------- Opiniated -------- DontCheckDefaultBrowser = true; DisableProfileImport = true; SearchBar = "unified"; SearchEngines.Add = [ # Only Available in ESR Releases https://mozilla.github.io/policy-templates/#searchengines--add { Name = "Brave"; URLTemplate = "https://search.brave.com/search?q={searchTerms}"; Alias = "br"; IconURL = "https://cdn.search.brave.com/serp/v3/_app/immutable/assets/brave-search-icon.CsIFM2aN.svg"; } ]; # Extensions https://mozilla.github.io/policy-templates#extensionsettings ExtensionSettings = { "uBlock0@raymondhill.net" = lib.mkIf (cfg.firefox.disableuBlockOrigin == false) { # uBlock Origin: https://addons.mozilla.org/en-US/firefox/addon/ublock-origin install_url = "https://addons.mozilla.org/firefox/downloads/file/4573289/ublock_origin-1.66.0.xpi"; installation_mode = "normal_installed"; private_browsing = true; }; "idcac-pub@guus.ninja" = lib.mkIf (cfg.firefox.disableIDontCareAboutCookies == false) { # I still don't care about cookies: https://addons.mozilla.org/en-US/firefox/addon/istilldontcareaboutcookies/ install_url = "https://addons.mozilla.org/firefox/downloads/file/4216095/istilldontcareaboutcookies-1.1.4.xpi"; installation_mode = "normal_installed"; private_browsing = true; }; "keepassxc-browser@keepassxc.org" = lib.mkIf (cfg.firefox.disableKeepassxcBrowser == false) { # KeePassXC-Browser: https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser install_url = "https://addons.mozilla.org/firefox/downloads/file/4575368/keepassxc_browser-1.9.9.6.xpi"; installation_mode = "normal_installed"; }; "offline-qr-code@rugk.github.io" = lib.mkIf (cfg.firefox.disableOfflineQr == false) { # Offline QR Code Generator: https://addons.mozilla.org/en-US/firefox/addon/offline-qr-code-generator/ install_url = "https://addons.mozilla.org/firefox/downloads/file/4349427/offline_qr_code_generator-1.9.xpi"; installation_mode = "normal_installed"; }; "addon@darkreader.org" = lib.mkIf (cfg.firefox.disableDarkReader == false) { # Dark Reader: https://addons.mozilla.org/en-US/firefox/addon/darkreader/ install_url = "https://addons.mozilla.org/firefox/downloads/file/4535824/darkreader-4.9.110.xpi"; installation_mode = "normal_installed"; }; "languagetool-webextension@languagetool.org" = lib.mkIf (cfg.firefox.disableLanguageTool == false) { # LanguageTool: https://addons.mozilla.org/en-US/firefox/addon/languagetool install_url = "https://addons.mozilla.org/firefox/downloads/file/4538560/languagetool-9.0.1.xpi"; installation_mode = "normal_installed"; }; }; Bookmarks = lib.mkIf (cfg.firefox.disableDefaultBookmarks == false) [ { Title = "Syncthing"; URL = "localhost:8384"; Placement = "toolbar"; } { Title = "NixOS Search - Packages"; URL = "https://search.nixos.org/packages?channel=unstable"; Placement = "toolbar"; Folder = "NixOS"; } { Title = "NixOS Search - Options"; URL = "https://search.nixos.org/options?channel=unstable"; Placement = "toolbar"; Folder = "NixOS"; } { Title = "Home Manager Search - Options"; URL = "https://home-manager-options.extranix.com/?release=master"; Placement = "toolbar"; Folder = "NixOS"; } { Title = "Lix"; URL = "https://lix.systems/"; Placement = "toolbar"; Folder = "NixOS"; } { Title = "AUX - Homepage"; URL = "https://auxolotl.org/en/"; Placement = "toolbar"; Folder = "NixOS"; } { Title = "AUX - Forum"; URL = "https://forum.aux.computer/"; Placement = "toolbar"; Folder = "NixOS"; } { Title = "Nix Pills"; URL = "https://nixos.org/guides/nix-pills/"; Placement = "toolbar"; Folder = "NixOS"; } ]; }; }; programs.chromium = lib.mkIf cfg.chromium.enable { enable = true; package = pkgs.ungoogled-chromium.override { enableWideVine = cfg.chromium.enableWideVine; }; commandLineArgs = [ "--extension-mime-request-handling=always-prompt-for-install" # Enable Extension-Install Dialogue "--enable-features=NoReferrers,SpoofWebGLInfo" # Feature Flags "--no-default-browser-check" ]; extensions = let createChromiumExtensionFor = browserVersion: { id, sha256, version }: { inherit id; crxPath = builtins.fetchurl { url = "https://clients2.google.com/service/update2/crx?response=redirect&acceptformat=crx2,crx3&prodversion=${browserVersion}&x=id%3D${id}%26installsource%3Dondemand%26uc"; name = "${id}.crx"; inherit sha256; }; inherit version; }; createChromiumExtension = createChromiumExtensionFor (lib.versions.major pkgs.ungoogled-chromium.version); in (lib.lists.optionals (cfg.chromium.disableChromiumWebStore == false) [{ # Chromium Web Store id = "ocaahdebbfolfmndjeplogmgcagdmblk"; crxPath = builtins.fetchurl { url = "https://github.com/NeverDecaf/chromium-web-store/releases/download/v1.5.5/Chromium.Web.Store.crx"; name = "ocaahdebbfolfmndjeplogmgcagdmblk.crx"; sha256 = "sha256-0g4AKed9vPf0TPI6OawpjiusvyBJEab5XYNHmg9BpfE="; }; version = "1.5.5"; }]) ++ (lib.lists.optionals (cfg.chromium.disableuBlockOrigin == false) [(createChromiumExtension { # uBlock Origin id = "cjpalhdlnbpafiamejdnhcphjbkeiagm"; sha256 = "sha256-HFD1A9b9958FbtjJGjWl5FnsttsNZBTsdVyaE5N151A="; version = "1.66.0"; })]) ++ (lib.lists.optionals (cfg.chromium.disableIDontCareAboutCookies == false) [(createChromiumExtension { # I still don't care about cookies id = "edibdbjcniadpccecjdfdjjppcpchdlm"; sha256 = "sha256:11k7cxcjafs8ziaxl4bilbfwbgl2yf1p6v1bvwszadcr14xyvgsj"; version = "1.1.4"; })]) ++ (lib.lists.optionals (cfg.chromium.disableKeepassxcBrowser == false) [(createChromiumExtension { # KeePassXC-Browser id = "oboonakemofpalcgghocfoadofidjkkk"; sha256 = "sha256-N/CRVkNiNmtGn5A7C3SD+5rnnyKG+VA3Pkn1s9vr7EM="; version = "1.9.9.6"; })]) ++ (lib.lists.optionals (cfg.chromium.disableLanguageTool == false) [(createChromiumExtension { # LanguageTool id = "oldceeleldhonbafppcapldpdifcinji"; sha256 = "sha256-eTBLiCz8V1eoXFOdrZYXxuxv/amjCspuN+90PeTkJS4="; version = "9.3.1"; })]) ++ (lib.lists.optionals (cfg.chromium.disableDarkReader == false) [(createChromiumExtension { # dark reader id = "eimadpbcbfnmbkopoojfekhnkhdbieeh"; sha256 = "sha256-8/tzlj4xc1h/+Zeek4r9l0I4/Kw3EJgLaqTTxZbRGcU="; version = "4.9.110"; })]); }; }; }