{ config, pkgs, lib, ... }: let cfg = config.dyamon.browser; in { options.dyamon.browser = with lib; { doh = mkOption { type = types.nullOr types.str; description = "Custom DNS-over-HTTPS URL for the browser."; default = "https://base.dns.mullvad.net/dns-query"; }; }; config = let profile = config.home.username; firetabs = pkgs.writeShellApplication { name = "firetabs"; runtimeInputs = with pkgs; [ dejsonlz4 jq ]; text = '' SESSION="${config.home.homeDirectory}/.mozilla/firefox/${profile}/sessionstore-backups/recovery.jsonlz4" dejsonlz4 "$SESSION" | \ jq -r '[.windows[] | .tabs[] | (.index - 1) as $i | .entries[$i] | {title, url} ]' ''; }; rofi-omnimark = pkgs.writeShellApplication { name = "rofi-omnimark"; runtimeInputs = with pkgs; [ rofi xclip wl-clipboard-rs ]; text = builtins.readFile ./config/browser/rofi-omnimark.bash; }; in { xdg.userDirs = let home = config.home.homeDirectory; in { enable = true; createDirectories = true; download = lib.mkDefault "${home}/downloads"; }; home.sessionVariables.BROWSER = "firefox --new-tab"; home.packages = with pkgs; [ tor-browser firetabs rofi-omnimark ]; xdg.dataFile.omnimark.source = ../../../secrets/browser/omnimark; services.xremap.config.keymap = [ { name = "browser"; remap = { rightalt-b = { launch = [ "rofi-omnimark" ]; }; }; } ]; programs.firefox = { enable = true; profiles.${profile} = { isDefault = true; # Bookmarks handled externally. bookmarks = []; # Search Engines handled externally search = { force = true; default = "DuckDuckGo"; engines = { "Amazon.co.uk".metaData.hidden = true; "Amazon.it".metaData.hidden = true; "Bing".metaData.hidden = true; "eBay".metaData.hidden = true; "Google".metaData.hidden = true; "Wikipedia (en)".metaData.hidden = true; "Wikipedia (it)".metaData.hidden = true; }; }; extensions = with pkgs.firefoxAddons; [ darkreader ublock-origin ]; settings = let downloads = config.xdg.userDirs.download; in { "browser.link.open_newwindow" = 3; # Open links in new tab. "browser.tabs.warnOnClose" = true; # Warn on closing multiple tabs. "browser.translations.enable" = false; # Disable translations. "media.eme.enabled" = false; # Disable DRM content. "extensions.pocket.enabled" = false; # Disable Pocket extension. "browser.search.widget.inNavBar" = false; # Address bar as search bar. "browser.search.region" = "GB"; # Set search region to UK. "privacy.donottrackheader.enabled" = true; # Always send "Do Not Track" request. "signon.rememberSignons" = false; # Don't ask to save passwords. "signon.autofillForms" = false; # Don't autofill forms. "signon.firefoxRelay.feature" = "disabled"; # Disable Firefox Relay. "signon.generation.enabled" = false; # Don't ask to generate passwords. "extensions.formautofill.creditCards.enabled" = false; # Don't autofill credit card forms. "browser.formfill.enable" = false; # Don't remember form history. "places.history.enabled" = false; # Don't remember history. "dom.security.https_only_mode" = true; # Always upgrade to HTTPS connection. "dom.events.asyncClipboard.clipboardItem" = true; # Allow access to clipboard (e.g., in excalidraw.com) "browser.toolbars.bookmarks.visibility" = "never"; # Never show bookmarks toolbar "extensions.experiments.enabled" = false; # Disable Mozilla experiments # Set custom download folder "browser.download.folderList" = 2; "browser.download.defaultFolder" = downloads; "browser.download.dir" = downloads; "browser.download.useDownloadDir" = true; # Blank page for new windows "browser.startup.homepage" = "chrome://browser/content/blanktab.html"; # Enable "Firefox Home" in new tabs (with search bar and nothing else). "browser.newtabpage.enabled" = true; "browser.newtabpage.activity-stream.showSearch" = true; "browser.newtabpage.activity-stream.feeds.topsites" = false; "browser.newtabpage.activity-stream.feeds.system.topsites" = false; "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; "browser.newtabpage.activity-stream.showSponsored" = false; "browser.newtabpage.activity-stream.feeds.sections" = false; "browser.newtabpage.activity-stream.feeds.section.topstories" = false; "browser.newtabpage.activity-stream.feeds.system.topstories" = false; "browser.newtabpage.activity-stream.feeds.section.highlights" = false; "browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = false; "browser.newtabpage.activity-stream.section.highlights.includeDownloads" = false; "browser.newtabpage.activity-stream.section.highlights.includePocket" = false; "browser.newtabpage.activity-stream.section.highlights.includeVisited" = false; "browser.newtabpage.activity-stream.feeds.snippets" = false; "browser.newtabpage.pinned" = []; "browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts.havePinned" = ""; "services.sync.prefs.sync.browser.newtabpage.activity-stream.feeds.section.highlights" = false; "services.sync.prefs.sync.browser.newtabpage.activity-stream.feeds.section.topstories" = false; "services.sync.prefs.sync.browser.newtabpage.activity-stream.feeds.snippets" = false; "services.sync.prefs.sync.browser.newtabpage.activity-stream.feeds.topsites" = false; # Disable searchbar suggestions "browser.search.suggest.enabled" = false; "browser.urlbar.suggest.searches" = false; "browser.urlbar.showSearchSuggestionsFirst" = false; "browser.search.suggest.enabled.private" = false; # DNS-over-HTTPS # https://mullvad.net/en/help/dns-over-https-and-dns-over-tls/ "doh-rollout.disable-heuristics" = !builtins.isNull cfg.doh; "network.trr.mode" = if builtins.isNull cfg.doh then 0 else 3; "network.trr.uri" = if builtins.isNull cfg.doh then "" else cfg.doh; "network.trr.custom_uri" = if builtins.isNull cfg.doh then "" else cfg.doh; # Clear browser data on shutdown "privacy.sanitize.sanitizeOnShutdown" = true; "privacy.sanitize.pending" = [ { id = "shutdown"; itemsToClear = [ "cache" "cookies" "downloads" "formdata" "history" "offlineApps" "sessions" ]; options = {}; } ]; "privacy.clearOnShutdown.downloads" = true; "privacy.clearOnShutdown.formdata" = true; "privacy.clearOnShutdown.history" = true; "privacy.clearOnShutdown.offlineApps" = true; "privacy.clearOnShutdown.sessions" = true; # Disable Firefox data collection "datareporting.healthreport.uploadEnabled" = false; "browser.discovery.enabled" = false; "app.shield.optoutstudies.enabled" = false; "browser.crashReports.unsubmittedCheck.autoSubmit2" = false; # Disable features/extensions recommendations "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons" = false; "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features" = false; # Crash reports "browser.tabs.crashReporting.sendReport" = false; "browser.tabs.crashReporting.includeURL" = false; }; }; }; xdg.mimeApps = let firefox = "firefox.desktop"; in { defaultApplications = { "text/html" = [ firefox ]; "text/xml" = [ firefox ]; "application/xhtml+xml" = [ firefox ]; "application/vnd.mozilla.xul+xml" = [ firefox ]; "x-scheme-handler/http" = [ firefox ]; "x-scheme-handler/https" = [ firefox ]; }; }; xdg.configFile."mailcap/mailcap".text = '' text/html; ${pkgs.firefox}/bin/firefox --new-tab %s; ''; }; }