{ lib, pkgs, ... }: let inherit (lib) concatStringsSep escapeShellArg mapAttrsToList; env = { MOZ_WEBRENDER = 1; # For a better scrolling implementation and touch support. # Be sure to also disable "Use smooth scrolling" in about:preferences MOZ_USE_XINPUT2 = 1; # Required for hardware video decoding. # See https://github.com/elFarto/nvidia-vaapi-driver?tab=readme-ov-file#firefox MOZ_DISABLE_RDD_SANDBOX = 1; LIBVA_DRIVER_NAME = "nvidia"; NVD_BACKEND = "direct"; }; envStr = concatStringsSep " " (mapAttrsToList (n: v: "${n}=${escapeShellArg v}") env); betterfox = pkgs.fetchFromGitHub { owner = "yokoffing"; repo = "Betterfox"; rev = "116.1"; hash = "sha256-Ai8Szbrk/4FhGhS4r5gA2DqjALFRfQKo2a/TwWCIA6g="; }; in { programs.firefox = { enable = true; package = pkgs.firefox.overrideAttrs (old: { buildCommand = old.buildCommand + '' substituteInPlace $out/bin/firefox \ --replace "exec -a" ${escapeShellArg envStr}" exec -a" ''; }); profiles.default = { id = 0; isDefault = true; # Hide tab bar because we have tree style tabs userChrome = '' #TabsToolbar { visibility: collapse !important; } #titlebar-buttonbox { height: 32px !important; } ''; extraConfig = builtins.concatStringsSep "\n" [ (builtins.readFile "${betterfox}/Securefox.js") (builtins.readFile "${betterfox}/Fastfox.js") (builtins.readFile "${betterfox}/Peskyfox.js") ]; settings = { # General "intl.accept_languages" = "en-US,en"; "browser.startup.page" = 3; # Resume previous session on startup "browser.aboutConfig.showWarning" = false; # I sometimes know what I'm doing "browser.ctrlTab.sortByRecentlyUsed" = false; # (default) Who wants that? "browser.download.useDownloadDir" = false; # Ask where to save stuff "browser.translations.neverTranslateLanguages" = "de"; # No need :) "privacy.clearOnShutdown.history" = false; # We want to save history on exit # Hi-DPI "layout.css.devPixelsPerPx" = "1.5"; # Allow executing JS in the dev console "devtools.chrome.enabled" = true; # Disable browser crash reporting "browser.tabs.crashReporting.sendReport" = false; # Allow userCrome.css "toolkit.legacyUserProfileCustomizations.stylesheets" = true; # Why the fuck can my search window make bell sounds "accessibility.typeaheadfind.enablesound" = false; # Why the fuck can my search window make bell sounds "general.autoScroll" = true; # Hardware acceleration # See https://github.com/elFarto/nvidia-vaapi-driver?tab=readme-ov-file#firefox "gfx.webrender.all" = true; "media.ffmpeg.vaapi.enabled" = true; "media.rdd-ffmpeg.enabled" = true; "widget.dmabuf.force-enabled" = true; "media.av1.enabled" = false; # XXX: change once I've upgraded my GPU # XXX: what is this? "media.ffvpx.enabled" = false; "media.rdd-vpx.enabled" = false; # Privacy "privacy.donottrackheader.enabled" = true; "privacy.trackingprotection.enabled" = true; "privacy.trackingprotection.socialtracking.enabled" = true; "privacy.userContext.enabled" = true; "privacy.userContext.ui.enabled" = true; "browser.send_pings" = false; # (default) Don't respect # This allows firefox devs changing options for a small amount of users to test out stuff. # Not with me please ... "app.normandy.enabled" = false; "app.shield.optoutstudies.enabled" = false; "beacon.enabled" = false; # No bluetooth location BS in my webbrowser please "device.sensors.enabled" = false; # This isn't a phone "geo.enabled" = false; # Disable geolocation alltogether # ESNI is deprecated ECH is recommended "network.dns.echconfig.enabled" = true; # Disable telemetry for privacy reasons "toolkit.telemetry.archive.enabled" = false; "toolkit.telemetry.enabled" = false; # enforced by nixos "toolkit.telemetry.server" = ""; "toolkit.telemetry.unified" = false; "extensions.webcompat-reporter.enabled" = false; # don't report compability problems to mozilla "datareporting.policy.dataSubmissionEnabled" = false; "datareporting.healthreport.uploadEnabled" = false; "browser.ping-centre.telemetry" = false; "browser.urlbar.eventTelemetry.enabled" = false; # (default) # Disable some useless stuff "extensions.pocket.enabled" = false; # disable pocket, save links, send tabs "extensions.abuseReport.enabled" = false; # don't show 'report abuse' in extensions "extensions.formautofill.creditCards.enabled" = false; # don't auto-fill credit card information "identity.fxaccounts.enabled" = false; # disable firefox login "identity.fxaccounts.toolbar.enabled" = false; "identity.fxaccounts.pairing.enabled" = false; "identity.fxaccounts.commands.enabled" = false; "browser.contentblocking.report.lockwise.enabled" = false; # don't use firefox password manger "browser.uitour.enabled" = false; # no tutorial please "browser.newtabpage.activity-stream.showSponsored" = false; "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; # disable EME encrypted media extension (Providers can get DRM # through this if they include a decryption black-box program) "browser.eme.ui.enabled" = false; "media.eme.enabled" = false; # don't predict network requests "network.predictor.enabled" = false; "browser.urlbar.speculativeConnect.enabled" = false; # disable annoying web features "dom.push.enabled" = false; # no notifications, really... "dom.push.connection.enabled" = false; "dom.battery.enabled" = false; # you don't need to see my battery... "dom.private-attribution.submission.enabled" = false; # No PPA for me pls }; search = { force = true; default = "kagi"; order = [ "kagi" "ddg" ]; engines = { "bing".metaData.hidden = true; "amazondotcom-us".metaData.hidden = true; "google".metaData.hidden = true; "kagi" = { icon = "https://kagi.com/favicon.ico"; updateInterval = 24 * 60 * 60 * 1000; definedAliases = [ "@k" ]; urls = [ { template = "https://kagi.com/search"; params = [ { name = "q"; value = "{searchTerms}"; } ]; } ]; }; }; }; }; profiles.empty = { id = 1; isDefault = false; }; profiles.onlybetterfox = { id = 2; isDefault = false; extraConfig = builtins.concatStringsSep "\n" [ (builtins.readFile "${betterfox}/Securefox.js") (builtins.readFile "${betterfox}/Fastfox.js") (builtins.readFile "${betterfox}/Peskyfox.js") ]; }; profiles.onlysettings = { id = 3; isDefault = false; settings = { # General "intl.accept_languages" = "en-US,en"; "browser.startup.page" = 3; # Resume previous session on startup "browser.aboutConfig.showWarning" = false; # I sometimes know what I'm doing "browser.ctrlTab.sortByRecentlyUsed" = false; # (default) Who wants that? "browser.download.useDownloadDir" = false; # Ask where to save stuff "browser.translations.neverTranslateLanguages" = "de"; # No need :) "privacy.clearOnShutdown.history" = false; # We want to save history on exit # Hi-DPI "layout.css.devPixelsPerPx" = "1.5"; # Allow executing JS in the dev console "devtools.chrome.enabled" = true; # Disable browser crash reporting "browser.tabs.crashReporting.sendReport" = false; # Why the fuck can my search window make bell sounds "accessibility.typeaheadfind.enablesound" = false; # Why the fuck can my search window make bell sounds "general.autoScroll" = true; # Hardware acceleration # See https://github.com/elFarto/nvidia-vaapi-driver?tab=readme-ov-file#firefox "gfx.webrender.all" = true; "media.ffmpeg.vaapi.enabled" = true; "media.rdd-ffmpeg.enabled" = true; "widget.dmabuf.force-enabled" = true; "media.av1.enabled" = false; # XXX: change once I've upgraded my GPU # XXX: what is this? "media.ffvpx.enabled" = false; "media.rdd-vpx.enabled" = false; # Privacy "privacy.donottrackheader.enabled" = true; "privacy.trackingprotection.enabled" = true; "privacy.trackingprotection.socialtracking.enabled" = true; "privacy.userContext.enabled" = true; "privacy.userContext.ui.enabled" = true; "browser.send_pings" = false; # (default) Don't respect # This allows firefox devs changing options for a small amount of users to test out stuff. # Not with me please ... "app.normandy.enabled" = false; "app.shield.optoutstudies.enabled" = false; "beacon.enabled" = false; # No bluetooth location BS in my webbrowser please "device.sensors.enabled" = false; # This isn't a phone "geo.enabled" = false; # Disable geolocation alltogether # ESNI is deprecated ECH is recommended "network.dns.echconfig.enabled" = true; # Disable telemetry for privacy reasons "toolkit.telemetry.archive.enabled" = false; "toolkit.telemetry.enabled" = false; # enforced by nixos "toolkit.telemetry.server" = ""; "toolkit.telemetry.unified" = false; "extensions.webcompat-reporter.enabled" = false; # don't report compability problems to mozilla "datareporting.policy.dataSubmissionEnabled" = false; "datareporting.healthreport.uploadEnabled" = false; "browser.ping-centre.telemetry" = false; "browser.urlbar.eventTelemetry.enabled" = false; # (default) # Disable some useless stuff "extensions.pocket.enabled" = false; # disable pocket, save links, send tabs "extensions.abuseReport.enabled" = false; # don't show 'report abuse' in extensions "extensions.formautofill.creditCards.enabled" = false; # don't auto-fill credit card information "identity.fxaccounts.enabled" = false; # disable firefox login "identity.fxaccounts.toolbar.enabled" = false; "identity.fxaccounts.pairing.enabled" = false; "identity.fxaccounts.commands.enabled" = false; "browser.contentblocking.report.lockwise.enabled" = false; # don't use firefox password manger "browser.uitour.enabled" = false; # no tutorial please "browser.newtabpage.activity-stream.showSponsored" = false; "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; # disable EME encrypted media extension (Providers can get DRM # through this if they include a decryption black-box program) "browser.eme.ui.enabled" = false; "media.eme.enabled" = false; # don't predict network requests "network.predictor.enabled" = false; "browser.urlbar.speculativeConnect.enabled" = false; # disable annoying web features "dom.push.enabled" = false; # no notifications, really... "dom.push.connection.enabled" = false; "dom.battery.enabled" = false; # you don't need to see my battery... "dom.private-attribution.submission.enabled" = false; # No PPA for me pls }; }; profiles.same = { id = 4; isDefault = false; extraConfig = builtins.concatStringsSep "\n" [ (builtins.readFile "${betterfox}/Securefox.js") (builtins.readFile "${betterfox}/Fastfox.js") (builtins.readFile "${betterfox}/Peskyfox.js") ]; settings = { # General "intl.accept_languages" = "en-US,en"; "browser.startup.page" = 3; # Resume previous session on startup "browser.aboutConfig.showWarning" = false; # I sometimes know what I'm doing "browser.ctrlTab.sortByRecentlyUsed" = false; # (default) Who wants that? "browser.download.useDownloadDir" = false; # Ask where to save stuff "browser.translations.neverTranslateLanguages" = "de"; # No need :) "privacy.clearOnShutdown.history" = false; # We want to save history on exit # Hi-DPI "layout.css.devPixelsPerPx" = "1.5"; # Allow executing JS in the dev console "devtools.chrome.enabled" = true; # Disable browser crash reporting "browser.tabs.crashReporting.sendReport" = false; # Why the fuck can my search window make bell sounds "accessibility.typeaheadfind.enablesound" = false; # Why the fuck can my search window make bell sounds "general.autoScroll" = true; # Hardware acceleration # See https://github.com/elFarto/nvidia-vaapi-driver?tab=readme-ov-file#firefox "gfx.webrender.all" = true; "media.ffmpeg.vaapi.enabled" = true; "media.rdd-ffmpeg.enabled" = true; "widget.dmabuf.force-enabled" = true; "media.av1.enabled" = false; # XXX: change once I've upgraded my GPU # XXX: what is this? "media.ffvpx.enabled" = false; "media.rdd-vpx.enabled" = false; # Privacy "privacy.donottrackheader.enabled" = true; "privacy.trackingprotection.enabled" = true; "privacy.trackingprotection.socialtracking.enabled" = true; "privacy.userContext.enabled" = true; "privacy.userContext.ui.enabled" = true; "browser.send_pings" = false; # (default) Don't respect # This allows firefox devs changing options for a small amount of users to test out stuff. # Not with me please ... "app.normandy.enabled" = false; "app.shield.optoutstudies.enabled" = false; "beacon.enabled" = false; # No bluetooth location BS in my webbrowser please "device.sensors.enabled" = false; # This isn't a phone "geo.enabled" = false; # Disable geolocation alltogether # ESNI is deprecated ECH is recommended "network.dns.echconfig.enabled" = true; # Disable telemetry for privacy reasons "toolkit.telemetry.archive.enabled" = false; "toolkit.telemetry.enabled" = false; # enforced by nixos "toolkit.telemetry.server" = ""; "toolkit.telemetry.unified" = false; "extensions.webcompat-reporter.enabled" = false; # don't report compability problems to mozilla "datareporting.policy.dataSubmissionEnabled" = false; "datareporting.healthreport.uploadEnabled" = false; "browser.ping-centre.telemetry" = false; "browser.urlbar.eventTelemetry.enabled" = false; # (default) # Disable some useless stuff "extensions.pocket.enabled" = false; # disable pocket, save links, send tabs "extensions.abuseReport.enabled" = false; # don't show 'report abuse' in extensions "extensions.formautofill.creditCards.enabled" = false; # don't auto-fill credit card information "identity.fxaccounts.enabled" = false; # disable firefox login "identity.fxaccounts.toolbar.enabled" = false; "identity.fxaccounts.pairing.enabled" = false; "identity.fxaccounts.commands.enabled" = false; "browser.contentblocking.report.lockwise.enabled" = false; # don't use firefox password manger "browser.uitour.enabled" = false; # no tutorial please "browser.newtabpage.activity-stream.showSponsored" = false; "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; # disable EME encrypted media extension (Providers can get DRM # through this if they include a decryption black-box program) "browser.eme.ui.enabled" = false; "media.eme.enabled" = false; # don't predict network requests "network.predictor.enabled" = false; "browser.urlbar.speculativeConnect.enabled" = false; # disable annoying web features "dom.push.enabled" = false; # no notifications, really... "dom.push.connection.enabled" = false; "dom.battery.enabled" = false; # you don't need to see my battery... "dom.private-attribution.submission.enabled" = false; # No PPA for me pls }; }; }; home.persistence."/state".directories = [ ".cache/mozilla" ]; home.persistence."/persist".directories = [ ".mozilla" ]; xdg.mimeApps.defaultApplications = { "text/html" = [ "firefox.desktop" ]; "text/xml" = [ "firefox.desktop" ]; "x-scheme-handler/http" = [ "firefox.desktop" ]; "x-scheme-handler/https" = [ "firefox.desktop" ]; }; }