{ pkgs, lib, inputs, config, ... }: let firefox-addons = inputs.firefox-addons.packages.${pkgs.stdenv.hostPlatform.system}; buildFirefoxXpiAddon = inputs.firefox-addons.lib.${pkgs.stdenv.hostPlatform.system}.buildFirefoxXpiAddon; hacker-smacker = buildFirefoxXpiAddon { pname = "hacker-smacker"; version = "2.2"; addonId = "jid1-eo0mcXLTqCkaWA@jetpack"; url = "https://addons.mozilla.org/firefox/downloads/file/4715262/hacker_smacker-2.2.xpi"; sha256 = "d28f0597d5c4bae5db712b4875f4104120f7e55e5ea769c44d70996be31cc0d1"; meta = with lib; { homepage = "https://www.hackersmacker.org"; description = "Highlight (friend) and filter (foe) individual authors on Hacker News"; license = licenses.mit; platforms = platforms.all; }; }; ublockSettings = import ./ublock.nix { inherit lib; }; darkReaderSettings = import ./dark-reader.nix { inherit lib; }; in { programs.zen-browser = { enable = true; profiles.default = { isDefault = true; extensions = { force = true; packages = (with firefox-addons; [ bitwarden buster-captcha-solver consent-o-matic darkreader fastforwardteam localcdn refined-github return-youtube-dislikes search-by-image # reverse image search ruffle_rs snowflake steam-database ublock-origin ]) ++ [ hacker-smacker ]; settings = { "uBlock0@raymondhill.net" = ublockSettings; "addon@darkreader.org" = darkReaderSettings; }; }; search = { force = true; default = "kagi"; privateDefault = "ddg"; order = [ "kagi" "ddg" "google" ]; engines = { kagi = { name = "Kagi"; urls = [ { template = "https://kagi.com/search?q={searchTerms}"; } ]; iconMapObj."16" = "https://kagi.com/favicon.ico"; definedAliases = [ "@k" ]; }; google.metaData.alias = "@g"; }; }; settings = { "identity.sync.tokenserver.uri" = "https://firefox-sync.sigkill.computer/1.0/sync/1.5"; # auto-enable extensions on install "extensions.autoDisableScopes" = 0; # don't sync prefs/addons — we manage them declaratively via nix # syncing fights with the declarative config and can cause data loss # https://github.com/nix-community/home-manager/issues/6083 "services.sync.engine.prefs" = false; "services.sync.engine.addons" = false; }; }; }; # Zen ignores XDG and hardcodes ~/.zen — symlink to module-managed path home.file.".zen".source = config.lib.file.mkOutOfStoreSymlink "${config.xdg.configHome}/zen"; home.sessionVariables.BROWSER = "zen"; }