{ pkgs, lib, osConfig, ... }: let base16 = osConfig.stylix.base16Scheme; merge = lib.foldr (a: b: a // b) { }; betterfox = '' /**************************************************************************** * SECTION: FASTFOX * ****************************************************************************/ /** GENERAL ***/ user_pref("content.notify.interval", 100000); /** GFX ***/ user_pref("gfx.canvas.accelerated.cache-size", 512); user_pref("gfx.content.skia-font-cache-size", 20); /** DISK CACHE ***/ user_pref("browser.cache.disk.enable", false); /** MEMORY CACHE ***/ user_pref("browser.sessionhistory.max_total_viewers", 4); /** MEDIA CACHE ***/ user_pref("media.memory_cache_max_size", 65536); user_pref("media.cache_readahead_limit", 7200); user_pref("media.cache_resume_threshold", 3600); /** IMAGE CACHE ***/ user_pref("image.mem.decode_bytes_at_a_time", 32768); /** NETWORK ***/ user_pref("network.http.max-connections", 1800); user_pref("network.http.max-persistent-connections-per-server", 10); user_pref("network.http.max-urgent-start-excessive-connections-per-host", 5); user_pref("network.http.pacing.requests.enabled", false); user_pref("network.dnsCacheExpiration", 3600); user_pref("network.ssl_tokens_cache_capacity", 10240); /** SPECULATIVE LOADING ***/ user_pref("network.http.speculative-parallel-limit", 0); user_pref("network.dns.disablePrefetch", true); user_pref("network.dns.disablePrefetchFromHTTPS", true); user_pref("browser.urlbar.speculativeConnect.enabled", false); user_pref("browser.places.speculativeConnect.enabled", false); user_pref("network.prefetch-next", false); user_pref("network.predictor.enabled", false); /** EXPERIMENTAL ***/ user_pref("layout.css.grid-template-masonry-value.enabled", true); /**************************************************************************** * SECTION: SECUREFOX * ****************************************************************************/ /** TRACKING PROTECTION ***/ user_pref("browser.contentblocking.category", "strict"); user_pref("privacy.trackingprotection.allow_list.baseline.enabled", true); user_pref("privacy.trackingprotection.allow_list.convenience.enabled", true); user_pref("browser.download.start_downloads_in_tmp_dir", true); user_pref("browser.helperApps.deleteTempFileOnExit", true); user_pref("browser.uitour.enabled", false); user_pref("privacy.globalprivacycontrol.enabled", true); /** OCSP & CERTS / HPKP ***/ user_pref("security.OCSP.enabled", 0); user_pref("security.pki.crlite_mode", 2); user_pref("security.csp.reporting.enabled", false); /** SSL / TLS ***/ user_pref("security.ssl.treat_unsafe_negotiation_as_broken", true); user_pref("browser.xul.error_pages.expert_bad_cert", true); user_pref("security.tls.enable_0rtt_data", false); /** DISK AVOIDANCE ***/ user_pref("browser.privatebrowsing.forceMediaMemoryCache", true); user_pref("browser.sessionstore.interval", 60000); /** SHUTDOWN & SANITIZING ***/ user_pref("browser.privatebrowsing.resetPBM.enabled", true); user_pref("privacy.history.custom", true); /** SEARCH / URL BAR ***/ user_pref("browser.urlbar.trimHttps", true); user_pref("browser.urlbar.untrimOnUserInteraction.featureGate", true); user_pref("browser.search.separatePrivateDefault.ui.enabled", true); user_pref("browser.search.suggest.enabled", false); user_pref("browser.urlbar.quicksuggest.enabled", false); user_pref("browser.urlbar.groupLabels.enabled", false); user_pref("browser.formfill.enable", false); user_pref("network.IDN_show_punycode", true); /** PASSWORDS ***/ user_pref("signon.formlessCapture.enabled", false); user_pref("signon.privateBrowsingCapture.enabled", false); user_pref("network.auth.subresource-http-auth-allow", 1); user_pref("editor.truncate_user_pastes", false); /** MIXED CONTENT + CROSS-SITE ***/ user_pref("security.mixed_content.block_display_content", true); user_pref("pdfjs.enableScripting", false); /** EXTENSIONS ***/ user_pref("extensions.enabledScopes", 5); /** HEADERS / REFERERS ***/ user_pref("network.http.referer.XOriginTrimmingPolicy", 2); /** CONTAINERS ***/ user_pref("privacy.userContext.ui.enabled", true); /** SAFE BROWSING ***/ user_pref("browser.safebrowsing.downloads.remote.enabled", false); /** MOZILLA ***/ user_pref("permissions.default.desktop-notification", 2); user_pref("permissions.default.geo", 2); user_pref("geo.provider.network.url", "https://beacondb.net/v1/geolocate"); user_pref("browser.search.update", false); user_pref("permissions.manager.defaultsUrl", ""); user_pref("extensions.getAddons.cache.enabled", false); /** TELEMETRY ***/ user_pref("datareporting.policy.dataSubmissionEnabled", false); user_pref("datareporting.healthreport.uploadEnabled", false); user_pref("toolkit.telemetry.unified", false); user_pref("toolkit.telemetry.enabled", false); user_pref("toolkit.telemetry.server", "data:,"); user_pref("toolkit.telemetry.archive.enabled", false); user_pref("toolkit.telemetry.newProfilePing.enabled", false); user_pref("toolkit.telemetry.shutdownPingSender.enabled", false); user_pref("toolkit.telemetry.updatePing.enabled", false); user_pref("toolkit.telemetry.bhrPing.enabled", false); user_pref("toolkit.telemetry.firstShutdownPing.enabled", false); user_pref("toolkit.telemetry.coverage.opt-out", true); user_pref("toolkit.coverage.opt-out", true); user_pref("toolkit.coverage.endpoint.base", ""); user_pref("browser.newtabpage.activity-stream.feeds.telemetry", false); user_pref("browser.newtabpage.activity-stream.telemetry", false); user_pref("datareporting.usage.uploadEnabled", false); /** EXPERIMENTS ***/ user_pref("app.shield.optoutstudies.enabled", false); user_pref("app.normandy.enabled", false); user_pref("app.normandy.api_url", ""); /** CRASH REPORTS ***/ user_pref("breakpad.reportURL", ""); user_pref("browser.tabs.crashReporting.sendReport", false); /**************************************************************************** * SECTION: PESKYFOX * ****************************************************************************/ /** MOZILLA UI ***/ user_pref("browser.privatebrowsing.vpnpromourl", ""); user_pref("extensions.getAddons.showPane", false); user_pref("extensions.htmlaboutaddons.recommendations.enabled", false); user_pref("browser.discovery.enabled", false); user_pref("browser.shell.checkDefaultBrowser", false); user_pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons", false); user_pref("browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", false); user_pref("browser.preferences.moreFromMozilla", false); user_pref("browser.aboutConfig.showWarning", false); user_pref("browser.aboutwelcome.enabled", false); user_pref("browser.profiles.enabled", true); /** THEME ADJUSTMENTS ***/ user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true); user_pref("browser.compactmode.show", true); user_pref("browser.privateWindowSeparation.enabled", false); // WINDOWS /** AI ***/ user_pref("browser.ml.enable", false); user_pref("browser.ml.chat.enabled", false); /** FULLSCREEN NOTICE ***/ user_pref("full-screen-api.transition-duration.enter", "0 0"); user_pref("full-screen-api.transition-duration.leave", "0 0"); user_pref("full-screen-api.warning.timeout", 0); /** URL BAR ***/ user_pref("browser.urlbar.trending.featureGate", false); /** NEW TAB PAGE ***/ user_pref("browser.newtabpage.activity-stream.default.sites", ""); user_pref("browser.newtabpage.activity-stream.showSponsoredTopSites", false); user_pref("browser.newtabpage.activity-stream.feeds.section.topstories", false); user_pref("browser.newtabpage.activity-stream.showSponsored", false); user_pref("browser.newtabpage.activity-stream.showSponsoredCheckboxes", false); /** POCKET ***/ user_pref("extensions.pocket.enabled", false); /** DOWNLOADS ***/ user_pref("browser.download.manager.addToRecentDocs", false); /** PDF ***/ user_pref("browser.download.open_pdf_attachments_inline", true); /** TAB BEHAVIOR ***/ user_pref("browser.bookmarks.openInTabClosesMenu", false); user_pref("browser.menu.showViewImageInfo", true); user_pref("findbar.highlightAll", true); user_pref("layout.word_select.eat_space_to_next_word", false); /**************************************************************************** * START: MY OVERRIDES * ****************************************************************************/ // visit https://github.com/yokoffing/Betterfox/wiki/Common-Overrides // visit https://github.com/yokoffing/Betterfox/wiki/Optional-Hardening // Enter your personal overrides below this line: /**************************************************************************** * SECTION: SMOOTHFOX * ****************************************************************************/ // visit https://github.com/yokoffing/Betterfox/blob/main/Smoothfox.js // Enter your scrolling overrides below this line: /**************************************************************************** * END: BETTERFOX * ****************************************************************************/ ''; search = { default = "ddg"; force = true; engines = { # don't need these default ones "amazondotcom-us".metaData.hidden = true; "bing".metaData.hidden = true; "ebay".metaData.hidden = true; "ddg" = { urls = [ { template = "https://duckduckgo.com"; params = [ { name = "q"; value = "{searchTerms}"; } ]; } ]; definedAliases = [ ",d" ]; }; "Nix Packages" = { urls = [ { template = "https://search.nixos.org/packages"; params = [ { name = "type"; value = "packages"; } { name = "query"; value = "{searchTerms}"; } ]; } ]; definedAliases = [ ",n" ]; }; "Wikipedia" = { urls = [ { template = "https://en.wikipedia.org/wiki/Special:Search"; params = [ { name = "search"; value = "{searchTerms}"; } ]; } ]; definedAliases = [ ",w" ]; }; "GitHub" = { urls = [ { template = "https://github.com/search"; params = [ { name = "q"; value = "{searchTerms}"; } ]; } ]; definedAliases = [ ",gh" ]; }; }; }; userChrome = '' /* Hide tab bar. Used with Sidebery */ #TabsToolbar { visibility: collapse !important; } #navigator-toolbox:not(:hover):not(:focus-within):has(#toolbar-menubar[inactive]) { margin-top: -36px; } /* #nav-bar { height: 20px; } #urlbar { margin-top: -2px; font-size: 10px; padding-left: 5px; min-height: 16px; height: 16px; } #urlbar-searchmode-switcher { display: none !important; } */ browser[type="content-primary"], browser[type="content"], .browserContainer { background-color: #${base16.base01} !important; background: #${base16.base01} !important; } ''; in { stylix = lib.mkIf osConfig.custom.graphical.stylix.enable { targets.firefox = { profileNames = [ "default" ]; colorTheme.enable = true; }; }; programs.firefox = lib.mkIf osConfig.custom.graphical.firefox-custom.enable { enable = true; policies = { DisableTelemetry = true; DontCheckDefaultBrowser = true; DisablePocket = true; DisableFirefoxStudies = true; DisableFeedbackCommands = true; Extensions = { Uninstall = [ "google@search.mozilla.org" "bing@search.mozilla.org" "amazondotcom@search.mozilla.org" "ebay@search.mozilla.org" "wikipedia@search.mozilla.org" "webcompat-reporter@mozilla.org" "addons-search-detection@mozilla.com" ]; }; ExtensionSettings = { "google@search.mozilla.org".installation_mode = "blocked"; "bing@search.mozilla.org".installation_mode = "blocked"; "amazondotcom@search.mozilla.org".installation_mode = "blocked"; "ebay@search.mozilla.org".installation_mode = "blocked"; "wikipedia@search.mozilla.org".installation_mode = "blocked"; "{5cd68d86-8324-4ab2-9e0d-3afcc60bee5f}" = { install_url = "https://addons.mozilla.org/firefox/downloads/latest/animated-pekora-dark-theme/latest.xpi"; installation_mode = "force_installed"; }; }; }; profiles = { default = { name = "privacy-friendly"; extraConfig = betterfox; settings = merge ( [ (import ./config/preferences.nix) (import ./config/browser-features.nix) (import ./config/privacy.nix) (import ./config/tracking.nix) (import ./config/tracking-webaudio.nix) (import ./config/security.nix) (import ./config/speed.nix) ] ++ lib.optionals osConfig.custom.hardware.nvidia.enable [ (import ./config/nvidia-fixes.nix) ] ); userChrome = userChrome; userContent = '' body:-moz-only-whitespace { --body-bg-color: #${base16.base01}; background-color: #${base16.base01}; } #toolbarContainer { --toolbar-bg-color: #${base16.base01}; } ''; # Changes the extension storage backend from IDB to json, wipes all data when switching extensions.force = true; extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [ clearurls darkreader sponsorblock ublock-origin keepassxc-browser youtube-nonstop sidebery vimium user-agent-string-switcher ]; inherit search; }; enable-webaudio = { name = "privacy-but-enable-webaudio"; id = 2; settings = merge ( [ (import ./config/preferences.nix) (import ./config/browser-features.nix) (import ./config/privacy.nix) (import ./config/tracking.nix) (import ./config/security.nix) (import ./config/speed.nix) ] ++ lib.optionals osConfig.custom.hardware.nvidia.enable [ (import ./config/nvidia-fixes.nix) ] ); userChrome = userChrome; extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [ clearurls darkreader sponsorblock ublock-origin keepassxc-browser youtube-nonstop sidebery vimium user-agent-string-switcher ]; inherit search; }; # This does not have as strict privacy settings as the default profile. # It uses the default firefox settings. Useful when something is not # working using the default profile shit = { name = "trade-privacy-for-convenience"; id = 1; userChrome = userChrome; settings = merge ( [ (import ./config/preferences.nix) (import ./config/speed.nix) ] ++ lib.optionals osConfig.custom.hardware.nvidia.enable [ (import ./config/nvidia-fixes.nix) ] ); extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [ clearurls darkreader sponsorblock ublock-origin youtube-nonstop sidebery user-agent-string-switcher ]; inherit search; }; }; }; xdg.desktopEntries = { firefox-enable-webaudio = { name = "Firefox - enabled webaudio"; genericName = "Web Browser"; exec = "firefox -P privacy-but-enable-webaudio %U"; terminal = false; categories = [ "Application" "Network" "WebBrowser" ]; mimeType = [ "text/html" "text/xml" ]; }; }; }