{ config, inputs, lib, pkgs, ... }: with lib; let cfg = config.nixfiles.modules.firefox; in { options.nixfiles.modules.firefox.enable = mkEnableOption "Firefox"; config = mkIf cfg.enable { nixfiles.modules.common.xdg.defaultApplications.firefox = [ "text/html" "x-scheme-handler/http" "x-scheme-handler/https" ]; hm = { imports = [ inputs.arkenfox.hmModules.arkenfox ]; home.packages = with pkgs; [ profile-cleaner ]; stylix.targets.firefox = { enable = true; profileNames = [ "default" ]; }; programs.firefox = { enable = true; package = pkgs.firefox; arkenfox.enable = true; profiles.default = let mkCssWithRoot = css: mkMerge [ # https://github.com/tinted-theming/base24/blob/master/styling.md (with config.colors.withHashtag; '' :root { --black: ${base01}; --red: ${base08}; --green: ${base0B}; --yellow: ${base09}; --blue: ${base0D}; --magenta: ${base0E}; --cyan: ${base0C}; --white: ${base06}; --bright-black: ${base02}; --bright-red: ${base12}; --bright-green: ${base14}; --bright-yellow: ${base13}; --bright-blue: ${base16}; --bright-magenta: ${base17}; --bright-cyan: ${base15}; --bright-white: ${base07}; --background: ${base00}; --foreground: ${base05}; '') ( let mapFonts = concatMapStringsSep ", " (font: ''"${font}"''); size = toString config.stylix.fonts.sizes.applications; in with config.fonts.fontconfig.defaultFonts; '' --serif-font-family: ${mapFonts serif}, serif; --serif-font-size: ${size}; --sans-serif-font-family: ${mapFonts sansSerif}, sans-serif; --sans-serif-font-size: ${size}; --monospace-font-family: ${mapFonts monospace}, monospace; --monospace-font-size: ${size}; } '' ) (builtins.readFile css) ]; in { id = 0; isDefault = true; userChrome = mkCssWithRoot ./userChrome.css; userContent = mkCssWithRoot ./userContent.css; extensions = let # This was done using the incredible addon generator[1]. All credit # goes to Robert Helgesson. # # [1]: https://sr.ht/~rycee/mozilla-addons-to-nix/ buildFirefoxXpiAddon = makeOverridable ( { stdenv ? pkgs.stdenv, fetchurl ? pkgs.fetchurl, pname, version, addonId, url, sha256, meta, ... }: stdenv.mkDerivation { name = "${pname}-${version}"; src = fetchurl { inherit url sha256; }; buildCommand = '' install -Dm644 "$src" "$out/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}/${addonId}.xpi" ''; inherit meta; } ); addons = import ./addons.nix { inherit buildFirefoxXpiAddon lib; }; in with addons; [ consent-o-matic darkreader furiganaize languagetool no-pdf-download redirector rikaichamp skip-redirect ublock-origin user-agent-switcher violentmonkey ] ++ optional config.nixfiles.modules.ipfs.enable ipfs-companion; search = { force = true; default = "DuckDuckGo"; order = [ "DuckDuckGo" "Yahoo" "Google" ]; engines = let getIcon = url: hash: pkgs.fetchurl { inherit url hash; }; in { "Amazon.com".metaData.hidden = true; "Bing".metaData.hidden = true; "Ebay".metaData.hidden = true; "2GIS" = { urls = [ { template = "https://2gis.ru/kazan/search/{searchTerms}"; } ]; icon = getIcon "https://d-assets.2gis.ru/favicon.png" "sha256-BlSaYRcUx9zhfJnVK5V7rsyft4qaueIEOONiCg+6aLE="; definedAliases = [ "@2gis" ]; }; "AliExpress" = { urls = [ { template = "https://aliexpress.ru/wholesale?SearchText={searchTerms}"; } ]; icon = getIcon "https://ae01.alicdn.com/images/eng/wholesale/icon/aliexpress.ico" "sha256-7xgem2pY2PNuv8as1YnS+U03GvDLLGjhcDLt69rtmaA="; definedAliases = [ "@aliexpress" "@ali" ]; }; "Ansible Galaxy" = { urls = [ { template = "https://galaxy.ansible.com/search?keywords={searchTerms}"; } ]; icon = getIcon "https://galaxy.ansible.com/assets/favicon.ico" "sha256-oAolpZhdKbVTraes6dDlafpvq/Vypu264vgKN4jzJk8="; definedAliases = [ "@ansible" "@galaxy" "@ag" ]; }; "Arch Wiki" = { urls = [ { template = "https://wiki.archlinux.org/index.php?search={searchTerms}"; } ]; icon = getIcon "https://wiki.archlinux.org/favicon.ico" "sha256-0uxMtT8myzTT7p9k6v5UxsguPKu+vHPlglNTMbnN1T0="; definedAliases = [ "@archwiki" "@aw" ]; }; "crates.io" = { urls = [ { template = "https://crates.io/search?q={searchTerms}"; } ]; icon = getIcon "https://crates.io/favicon.ico" "sha256-upooA/+m5KMUD1t4WFY3EOmytdpUFgNqUj12Auta1mM="; definedAliases = [ "@crates" ]; }; "Discogs" = { urls = [ { template = "https://www.discogs.com/search?q={searchTerms}"; } ]; icon = getIcon "https://st.discogs.com/d56dcb7367720ea20f1b11a4385705517c7e7702/images/favicon.ico" "sha256-zEDrbmcUf8XHUyYzNc6JsWzBioX8sm8tjScGHim5VTk="; definedAliases = [ "@discogs" ]; }; "Docker Hub" = { urls = [ { template = "https://hub.docker.com/search?q={searchTerms}"; } ]; icon = getIcon "https://www.docker.com/wp-content/uploads/2023/04/cropped-Docker-favicon-32x32.png" "sha256-4NmHGMaq31qoIvdlmy7fI3qTbkcp1/tJhqQu/9Ci4/c="; definedAliases = [ "@dockerhub" "@docker" ]; }; "Ecosia" = { urls = [ { template = "https://www.ecosia.org/search?q={searchTerms}"; } ]; icon = getIcon "https://cdn-static.ecosia.org/static/icons/favicon.ico" "sha256-uvPShG1yVh4C4zaJmGuhhr96V/NredB1Wte9O3U6QxA="; definedAliases = [ "@ecosia" ]; }; "Genius" = { urls = [ { template = "https://genius.com/search?q={searchTerms}"; } ]; icon = getIcon "https://assets.genius.com/images/apple-touch-icon.png" "sha256-M9YQEVg3T7hMO/xPfihR1aXfG+/pNiVOBCOtzx3GrkE="; definedAliases = [ "@genius" ]; }; "GitHub" = { urls = [ { template = "https://github.com/search?q={searchTerms}"; } ]; icon = getIcon "https://github.githubassets.com/favicons/favicon-dark.svg" "sha256-qu/d9ftvsntplFuxw9RFL8BpI9b2g5b6xfeGw6Ekh6w="; definedAliases = [ "@github" "@gh" ]; }; "godocs.io" = { urls = [ { template = "https://godocs.io/?q={searchTerms}"; } ]; icon = getIcon "https://go.dev/images/favicon-gopher.svg" "sha256-OlKpUUeYF8TtMoX4e0ERK1ocIb53OJ8ZDxvwJaQVM/0="; definedAliases = [ "@godocs" ]; }; "pkgs.go.dev" = { urls = [ { template = "https://pkg.go.dev/search?q={searchTerms}"; } ]; icon = getIcon "https://go.dev/images/favicon-gopher.svg" "sha256-OlKpUUeYF8TtMoX4e0ERK1ocIb53OJ8ZDxvwJaQVM/0="; definedAliases = [ "@gopkgs" ]; }; "Hackage" = { urls = [ { template = "https://hackage.haskell.org/packages/search?terms={searchTerms}"; } ]; icon = getIcon "https://hackage.haskell.org/static/favicon.png" "sha256-+6WAv93yaA3L2eheGKxklY/uRAvbKD1q/WcmufmhKxY="; definedAliases = [ "@hackage" ]; }; "Hoogle" = { urls = [ { template = "https://hoogle.haskell.org/?hoogle={searchTerms}"; } ]; icon = getIcon "https://hoogle.haskell.org/favicon.png" "sha256-6qmjRYDDRUwm6EdLoZB6o9XtoujsfDEQJ9xOu3Knei8="; definedAliases = [ "@hoogle" ]; }; "Jisho" = { urls = [ { template = "https://jisho.org/search/{searchTerms}"; } ]; icon = getIcon "https://assets.jisho.org/assets/favicon-062c4a0240e1e6d72c38aa524742c2d558ee6234497d91dd6b75a182ea823d65.ico" "sha256-BixKAkDh5tcsOKpSR0LC1VjuYjRJfZHda3WhguqCPWU="; definedAliases = [ "@jisho" ]; }; "コトバンク" = { urls = [ { template = "https://kotobank.jp/gs/?q={searchTerms}"; } ]; icon = getIcon "https://kotobank.jp/favicon.ico" "sha256-t+EzqURlQwznuBqa0GcBbqumvZqtU7HrEAjGUlqp1tg="; definedAliases = [ "@kotobank" ]; }; "Kubernetes" = { urls = [ { template = "https://kubernetes.io/search/?q={searchTerms}"; } ]; icon = getIcon "https://kubernetes.io/images/kubernetes.png" "sha256-YI5QvGQXoaTG3uUGQ/R99Xl2r+VqBAA1qqthzPbf8nQ="; definedAliases = [ "@kubernetes" "@k8s" ]; }; "Last.fm" = { urls = [ { template = "https://www.last.fm/search?q={searchTerms}"; } ]; icon = getIcon "https://www.last.fm/static/images/favicon.702b239b6194.ico" "sha256-ID+DfF+dZ5CzKiBp/psQPRD6r/06PZ0rVYiELWUt5Mw="; definedAliases = [ "@lastfm" ]; }; "MDN" = { urls = [ { template = "https://developer.mozilla.org/en-US/search?q={searchTerms}"; } ]; icon = getIcon "https://developer.mozilla.org/favicon-48x48.cbbd161b.png" "sha256-Wnd0BqQIKgroGmV+R8vqV9uNBwDvcxBrQ8hXOLOFeKY="; definedAliases = [ "@mdn" ]; }; "MELPA" = { urls = [ { template = "https://melpa.org/#/?q={searchTerms}"; } ]; icon = getIcon "https://melpa.org/favicon.ico" "sha256-bmlydqXBM8MUMC6cOTGSHPx6zN8tZFqmQ+srbXkSCA4="; definedAliases = [ "@melpa" ]; }; "MusicBrainz" = { urls = [ { template = "https://musicbrainz.org/search?type=artist&query={searchTerms}"; } ]; icon = getIcon "https://musicbrainz.org/static/images/favicons/favicon-16x16.png" "sha256-M5mKQurmO9AP0gfC+5OLwi8k4XWQy759eQrrKAeytl0="; definedAliases = [ "@musicbrainz" "@mb" ]; }; "NixOS Packages" = { urls = [ { template = "https://search.nixos.org/packages?channel=unstable&query={searchTerms}"; } ]; icon = getIcon "https://nixos.org/favicon.png" "sha256-awcsDbbpRcDJnJpRavj/IcKMReEektRcqKbE35IJTKQ="; definedAliases = [ "@nixpkgs" "@np" ]; }; "NixOS Options" = { urls = [ { template = "https://search.nixos.org/options?channel=unstable&query={searchTerms}"; } ]; icon = getIcon "https://nixos.org/favicon.png" "sha256-awcsDbbpRcDJnJpRavj/IcKMReEektRcqKbE35IJTKQ="; definedAliases = [ "@nixopts" "@no" ]; }; "NixOS Wiki" = { urls = [ { template = "https://wiki.nixos.org/index.php?search={searchTerms}"; } ]; icon = getIcon "https://wiki.nixos.org/favicon.ico" "sha256-88EXiL5AoP56bgteo2YXI00iK9cmd7DVg+RMbFxy6+k="; definedAliases = [ "@nixoswiki" "@nw" ]; }; "OpenStreetMap" = { urls = [ { template = "https://www.openstreetmap.org/search?query={searchTerms}"; } ]; icon = getIcon "https://www.openstreetmap.org/assets/favicon-32x32-99b88fcadeef736889823c8a886b89d8cada9d4423a49a27de29bacc0a6bebd1.png" "sha256-dt4QVbQPdb4neS/fwH3yOWOSbEdkjMZtAYnIeCfr7qI="; definedAliases = [ "@openstreetmap" "@osm" "@maps" ]; }; "ProtonDB" = { urls = [ { template = "https://www.protondb.com/search?q={searchTerms}"; } ]; icon = getIcon "https://www.protondb.com/sites/protondb/images/favicon.ico" "sha256-oauOp0EASNjMcThfzYJ2TfbaOYHBPL8LOp+9lmp4pmc="; definedAliases = [ "@protondb" ]; }; "PyPI" = { urls = [ { template = "https://pypi.org/search/?q={searchTerms}"; } ]; icon = getIcon "https://pypi.org/static/images/logo-small.2a411bc6.svg" "sha256-+fcSfcNxAMLIFkp+gh52c48lQORoyhcegUIFtuq/zYs="; definedAliases = [ "@pypi" ]; }; "Python Docs" = { urls = [ { template = "https://docs.python.org/3/search.html?q={searchTerms}"; } ]; icon = getIcon "https://docs.python.org/3/_static/py.svg" "sha256-WGW+i8wK+IhZSQPqARL2yNkjxXJsQIHoyFYRDMcznO8="; definedAliases = [ "@pydocs" ]; }; "Rate Your Music" = { urls = [ { template = "https://rateyourmusic.com/search?searchterm={searchTerms}"; } ]; icon = getIcon "https://e.snmc.io/3.0/img/logo/sonemic-32.png" "sha256-JpTt1tjBkUvDMTGrG7Hg2EiE8PR3RL7McodeZk1EpZA="; definedAliases = [ "@rym" ]; }; "Rust Std" = { urls = [ { template = "https://doc.rust-lang.org/std/?search={searchTerms}"; } ]; icon = getIcon "https://www.rust-lang.org/static/images/favicon-32x32.png" "sha256-l2y4jpnODbua4dyLvXTMBlHVkoDPM9y00l6L61so7eA="; definedAliases = [ "@ruststd" "@rust" ]; }; "SourceHut" = { urls = [ { template = "https://sr.ht/projects?search={searchTerms}"; } ]; icon = getIcon "https://sr.ht/static/logo.png" "sha256-NBzKZhqE9//zVJlOwYiwyW/jRFh8+nS2YvC3zMCQ1fU="; definedAliases = [ "@sourcehut" "@srht" ]; }; "SteamDB" = { urls = [ { template = "https://steamdb.info/search/?a=app&q={searchTerms}"; } ]; icon = getIcon "https://steamdb.info/static/logos/32px.png" "sha256-IUBiB5JUSvyDa+m/wecmHB8s3Wfu0JK98bJ+ZRZ5ybQ="; definedAliases = [ "@steamdb" ]; }; "WolframAlpha" = { urls = [ { template = "https://www.wolframalpha.com/input?i={searchTerms}"; } ]; icon = getIcon "https://www.wolframalpha.com/_next/static/images/favicon_1zbE9hjk.ico" "sha256-S9k7AlBQiDElBCGopJ8xfBD6dIhGU+EBh8t1QYbP2S4="; definedAliases = [ "@wolframalpha" "@wa" ]; }; "Yahoo" = { urls = [ { template = "https://yahoo.com/search/?text={searchTerms}"; } ]; icon = getIcon "https://yahoostatic.net/s3/web4static/_/v2/oxjfXL1EO-B5Arm80ZrL00p0al4.png" "sha256-gvYh4oCZEO7BL2QZ6QvQFlmFiP2L4SLJrxAsKFcG6G4="; definedAliases = [ "@yahoo" "@ya" ]; }; "YouTube" = { urls = [ { template = "https://yewtu.be/search?q={searchTerms}"; } ]; icon = getIcon "https://www.youtube.com/s/desktop/280a3f09/img/favicon.ico" "sha256-i7HQ+kOhdDbVndVG9vdMdtxEc13vdSLCLYAxFm24kR0="; definedAliases = [ "@youtube" "@yt" ]; }; }; }; # NOTE This silently overrides all other bookmarks. bookmarks = [ { name = "Bookmarks Toolbar"; toolbar = true; bookmarks = with config.nixfiles.modules; [ (mkIf syncthing.enable { name = "Syncthing"; url = "http://${config.services.syncthing.guiAddress}"; }) (mkIf ipfs.enable { name = "IPFS"; url = "http://127.0.0.1:${toString ipfs.apiPort}/webui"; }) ]; } ]; # https://github.com/arkenfox/user.js/blob/master/user.js arkenfox = { enable = true; "0000".enable = true; "0100" = { enable = true; "0103"."browser.startup.homepage".value = "about:blank"; }; "0200".enable = true; "0300".enable = true; "0400".enable = true; "0600".enable = true; "0700" = { enable = true; "0710"."network.trr.mode" = { enable = true; value = 5; }; }; "0800".enable = true; "0900".enable = true; "1000" = { enable = true; "1001".enable = false; }; "1200".enable = true; "1600".enable = true; "1700".enable = true; "2000".enable = true; "2400".enable = true; "2600" = { enable = true; "2615"."permissions.default.shortcuts".enable = true; }; "2700".enable = true; "2800" = { enable = true; "2811" = { "privacy.clearOnShutdown.history".value = false; "privacy.clearOnShutdown_v2.historyFormDataAndDownloads".value = false; }; "2820"."privacy.clearSiteData.historyFormDataAndDownloads".value = false; "2830"."privacy.clearHistory.historyFormDataAndDownloads".value = false; }; "4500" = { enable = true; "4502".enable = false; "4504".enable = false; }; "5000" = { enable = true; "5003"."signon.rememberSignons".enable = true; "5010"."browser.urlbar.suggest.topsites".enable = true; "5017" = { "extensions.formautofill.addresses.enabled".enable = true; "extensions.formautofill.creditCards.enabled".enable = true; }; "5019"."browser.pagethumbnails.capturing_disabled".enable = true; }; "5500" = { enable = true; "5508" = { "media.eme.enabled".enable = true; "browser.eme.ui.enabled".enable = true; }; }; "6000".enable = true; "7000".enable = true; "8000".enable = true; "9000".enable = true; }; settings = { "app.update.auto" = false; "browser.backspace_action" = 0; "browser.disableResetPrompt" = true; "browser.download.autohideButton" = false; "browser.newtabpage.introShown" = true; "browser.newtabpage.pinned" = ""; "browser.onboarding.enabled" = false; "browser.open.lastDir" = config.my.home; "browser.protections_panel.infoMessage.seen" = true; "browser.region.update.region" = "US"; "browser.search.region" = "US"; "browser.search.update" = false; "browser.shell.checkDefaultBrowser" = false; "browser.tabs.closeWindowWithLastTab" = true; "browser.tabs.firefox-view" = false; "browser.tabs.firefox-view-next" = false; "browser.tabs.inTitlebar" = 0; "browser.tabs.tabmanager.enabled" = false; "browser.tabs.warnOnClose" = false; "browser.tabs.warnOnCloseOtherTabs" = false; "browser.tabs.warnOnOpen" = false; "browser.toolbars.bookmarks.visibility" = "newtab"; "browser.translations.enable" = false; "browser.urlbar.decodeURLsOnCopy" = true; "browser.warnOnQuitShortcut" = false; "devtools.everOpened" = true; "doh-rollout.home-region" = "US"; "extensions.pocket.enabled" = false; "extensions.update.autoUpdateDefault" = false; "extensions.update.enabled" = false; "full-screen-api.warning.delay" = 0; "full-screen-api.warning.timeout" = 0; "general.autoScroll" = true; "general.smoothScroll" = true; "identity.fxaccounts.enabled" = false; "media.autoplay.blocking_policy" = 2; "media.autoplay.default" = 5; "media.hardwaremediakeys.enabled" = false; "reader.parse-on-load.enabled" = false; "toolkit.legacyUserProfileCustomizations.stylesheets" = true; }; }; }; }; }; }