{ pkgs, config, lib, ... }: let inherit (pkgs) nur; cfg = config.programs.zen-browser; in { programs.zen-browser = { # https://mozilla.github.io/policy-templates # The following have more complex logic, keep them as policies and not profiles policies = { RequestedLocales = [ "fr-FR" # for fuck sake stop showing me translated version of French gov sites "zh-TW" "en-US" ]; SearchEngines = { Remove = [ "Google" "Bing" "DuckDuckGo" "Qwant" "eBay" "Perplexity" ]; Default = "Brave"; Add = [ { Name = "Brave"; Alias = "@br"; URLTemplate = "https://search.brave.com/search?q={searchTerms}&source=web"; SuggestURLTemplate = "https://suggestqueries.google.com/complete/search?q={searchTerms}"; } ]; }; NoDefaultBookmarks = true; DisplayMenuBar = "never"; DisplayBookmarksToolbar = "never"; DNSOverHTTPS = { Enabled = false; }; }; # https://searchfox.org/mozilla-central/source/browser/components/enterprisepolicies/Policies.sys.mjs # Some policies can be rewritten to profiles configuration # # TODO: try out the "locked" semantic from zen # https://github.com/0xc000022070/zen-browser-flake/tree/main#preferences # # To check which option is mapped to which about:config # - back preference file # cp .zen/default/prefs.js{,.bk} # - click the buttons # - diff it # diff .zen/default/prefs.js{.bk,} profiles.default = { settings = { "toolkit.legacyUserProfileCustomizations.stylesheets" = true; "browser.tabs.loadInBackground" = true; "browser.ctrlTab.sortByRecentlyUsed" = false; "layout.css.devPixelsPerPx" = 1.1; "browser.startup.page" = 1; "browser.translations.automaticallyPopup" = false; # open links in new window # this works a lot better with xmonad where I have a bunch of windows "browser.link.open_newwindow" = 2; # Sponsored crap # Yes "browser.newtabpage.activity-stream.showSearch" = true; "browser.newtabpage.activity-stream.feeds.topsites" = true; # No "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; "browser.newtabpage.activity-stream.feeds.section.highlights" = false; "browser.newtabpage.activity-stream.feeds.system.topstories" = false; "browser.newtabpage.activity-stream.feeds.section.topstories" = false; "browser.newtabpage.activity-stream.showSponsored" = false; # URL # Yes "browser.urlbar.suggest.quicksuggest.nonsponsored" = true; # No "browser.urlbar.suggest.quicksuggest.sponsored" = false; # Pasword manager "signon.rememberSignons" = false; "services.passwordSavingEnabled" = false; "pref.privacy.disable_button.view_passwords" = false; # Hardware acceleration "layers.acceleration.disabled" = false; # Screenshot "screenshots.browser.component.enabled" = true; # Recommendations "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons" = false; "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features" = false; "extensions.htmlaboutaddons.recommendations.enabled" = false; # Addons # Onboarding "browser.aboutwelcome.enabled" = false; # AI crap "browser.ml.chat.enabled" = false; "browser.ml.chat.page" = false; "browser.ml.chat.shortcuts" = false; "browser.ml.chat.sidebar" = false; # Prevent WebRTC leak # https://mullvad.net/en/help/webrtc "media.peerconnection.enabled" = false; }; extensions.packages = let addons = nur.repos.rycee.firefox-addons; in [ addons.ublock-origin addons.privacy-badger addons.user-agent-string-switcher /* Here's to you who want to remove news feed eradicator because you find it annoying: It is here to annoy you so it is less likely for you to be on the agency inversion path. DO NOT REMOVE IT. I repeat, DO NOT REMOVE IT. If you think it's annoying, go do some jump rope, sing, live. */ addons.news-feed-eradicator # did you read the comment above? addons.multi-account-containers ]; }; }; xdg.mimeApps = let associations = lib.genAttrs [ "application/x-extension-shtml" "application/x-extension-xhtml" "application/x-extension-html" "application/x-extension-xht" "application/x-extension-htm" # "x-scheme-handler/unknown" # "x-scheme-handler/mailto" "x-scheme-handler/chrome" "x-scheme-handler/about" "x-scheme-handler/https" "x-scheme-handler/http" "application/xhtml+xml" # "application/json" # "text/plain" "text/html" ] (_: cfg.package.meta.desktopFileName); in lib.mkIf cfg.enable { associations.added = associations; defaultApplications = associations; }; }