about summary refs log tree commit diff
path: root/modules/nixos/firefox
diff options
context:
space:
mode:
authorAzat Bahawi <azat@bahawi.net>2024-03-31 21:29:27 +0300
committerAzat Bahawi <azat@bahawi.net>2024-03-31 21:29:27 +0300
commit9a5427e3a0c0ccf2a82dc503149a26b23fbd6004 (patch)
treef28beec29deeea36038615a8fb98a810891940b5 /modules/nixos/firefox
parent2024-03-19 (diff)
2024-03-31
Diffstat (limited to 'modules/nixos/firefox')
-rw-r--r--modules/nixos/firefox/addons.nix40
-rw-r--r--modules/nixos/firefox/default.nix1036
2 files changed, 524 insertions, 552 deletions
diff --git a/modules/nixos/firefox/addons.nix b/modules/nixos/firefox/addons.nix
index bd14bb5..28235d4 100644
--- a/modules/nixos/firefox/addons.nix
+++ b/modules/nixos/firefox/addons.nix
@@ -1,7 +1,5 @@
+{ buildFirefoxXpiAddon, lib }:
 {
-  buildFirefoxXpiAddon,
-  lib,
-}: {
   "bitwarden" = buildFirefoxXpiAddon {
     pname = "bitwarden";
     version = "2024.2.1";
@@ -33,10 +31,10 @@
   };
   "bypass-paywalls" = buildFirefoxXpiAddon {
     pname = "bypass-paywalls";
-    version = "3.5.9.0";
+    version = "3.6.0.0";
     addonId = "magnolia_limited_permissions_d@12.34";
-    url = "https://addons.mozilla.org/firefox/downloads/file/4248144/bypass_paywalls_clean_d-3.5.9.0.xpi";
-    sha256 = "938da8dcfa0e3ff012b40cf54a270ca73b03183387ef9330bf8b7771dbf10a5c";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4251818/bypass_paywalls_clean_d-3.6.0.0.xpi";
+    sha256 = "30a57df51a241838dca9360a12801ea82f2deaf76a6b63f1279235e2f5f3c939";
     meta = with lib; {
       homepage = "https://gitlab.com/magnolia1234/bypass-paywalls-firefox-clean";
       description = "Bypass Paywalls";
@@ -173,6 +171,7 @@
         "*://*.courant.com/*"
         "*://*.courier-journal.com/*"
         "*://*.couriermail.com.au/*"
+        "*://*.courrierinternational.com/*"
         "*://*.crainscleveland.com/*"
         "*://*.crainsdetroit.com/*"
         "*://*.crainsnewyork.com/*"
@@ -290,6 +289,7 @@
         "*://*.ftm.nl/*"
         "*://*.gazetadopovo.com.br/*"
         "*://*.gazzetta.it/*"
+        "*://*.gbnews.com/*"
         "*://*.geelongadvertiser.com.au/*"
         "*://*.gelderlander.nl/*"
         "*://*.genomeweb.com/*"
@@ -423,6 +423,7 @@
         "*://*.lehighvalleylive.com/*"
         "*://*.lejdd.fr/*"
         "*://*.lemagit.fr/*"
+        "*://*.lemoniteur.fr/*"
         "*://*.lenouveleconomiste.fr/*"
         "*://*.lenouvelliste.ch/*"
         "*://*.leparisien.fr/*"
@@ -526,6 +527,7 @@
         "*://*.nytimes.com/*"
         "*://*.nzherald.co.nz/*"
         "*://*.nzz.ch/*"
+        "*://*.observador.pt/*"
         "*://*.ocbj.com/*"
         "*://*.ocregister.com/*"
         "*://*.oklahoman.com/*"
@@ -560,6 +562,7 @@
         "*://*.popularmechanics.com/*"
         "*://*.post-gazette.com/*"
         "*://*.pourlascience.fr/*"
+        "*://*.pourleco.com/*"
         "*://*.precisionmedicineonline.com/*"
         "*://*.pressenterprise.com/*"
         "*://*.prevention.com/*"
@@ -864,16 +867,21 @@
       homepage = "https://consentomatic.au.dk/";
       description = "Automatic handling of GDPR consent forms";
       license = licenses.mit;
-      mozPermissions = ["activeTab" "tabs" "storage" "<all_urls>"];
+      mozPermissions = [
+        "activeTab"
+        "tabs"
+        "storage"
+        "<all_urls>"
+      ];
       platforms = platforms.all;
     };
   };
   "darkreader" = buildFirefoxXpiAddon {
     pname = "darkreader";
-    version = "4.9.78";
+    version = "4.9.80";
     addonId = "addon@darkreader.org";
-    url = "https://addons.mozilla.org/firefox/downloads/file/4243182/darkreader-4.9.78.xpi";
-    sha256 = "21e08b3f26e9b54257d30f6b2fb2d966d41ace54d2d79ccec55e55517084c7ce";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4249607/darkreader-4.9.80.xpi";
+    sha256 = "a93f1250b72cc27fe4a9b02be062c68fb079e45a1233d562852b48e1e9b99307";
     meta = with lib; {
       homepage = "https://darkreader.org/";
       description = "Dark mode for every website. Take care of your eyes, use dark theme for night and daily browsing.";
@@ -939,10 +947,10 @@
   };
   "languagetool" = buildFirefoxXpiAddon {
     pname = "languagetool";
-    version = "8.3.0";
+    version = "8.6.0";
     addonId = "languagetool-webextension@languagetool.org";
-    url = "https://addons.mozilla.org/firefox/downloads/file/4199245/languagetool-8.3.0.xpi";
-    sha256 = "e357424e3df9dde4ba10eb9f8f3719ac4830681570557f4d51db15a462cd7667";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4249956/languagetool-8.6.0.xpi";
+    sha256 = "d9db9aac9fdd53eb39179c153161762cd9e9eb1f6d7da8e8b8a32238b4847094";
     meta = with lib; {
       homepage = "https://languagetool.org";
       description = "With this extension you can check text with the free style and grammar checker LanguageTool. It finds many errors that a simple spell checker cannot detect, like mixing up there/their, a/an, or repeating a word.";
@@ -970,7 +978,11 @@
       homepage = "https://github.com/MorbZ/no-pdf-download";
       description = "Opens all PDF files directly in the browser.";
       license = licenses.mit;
-      mozPermissions = ["webRequest" "webRequestBlocking" "<all_urls>"];
+      mozPermissions = [
+        "webRequest"
+        "webRequestBlocking"
+        "<all_urls>"
+      ];
       platforms = platforms.all;
     };
   };
diff --git a/modules/nixos/firefox/default.nix b/modules/nixos/firefox/default.nix
index 6d1b31b..881e9ad 100644
--- a/modules/nixos/firefox/default.nix
+++ b/modules/nixos/firefox/default.nix
@@ -5,9 +5,11 @@
   pkgs,
   ...
 }:
-with lib; let
+with lib;
+let
   cfg = config.nixfiles.modules.firefox;
-in {
+in
+{
   options.nixfiles.modules.firefox.enable = mkEnableOption "Firefox";
 
   config = mkIf cfg.enable {
@@ -18,13 +20,13 @@ in {
     ];
 
     hm = {
-      imports = [inputs.arkenfox.hmModules.arkenfox];
+      imports = [ inputs.arkenfox.hmModules.arkenfox ];
 
-      home.packages = with pkgs; [profile-cleaner];
+      home.packages = with pkgs; [ profile-cleaner ];
 
       stylix.targets.firefox = {
         enable = true;
-        profileNames = ["default"];
+        profileNames = [ "default" ];
       };
 
       programs.firefox = {
@@ -34,37 +36,40 @@ in {
 
         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; ''
+        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;
@@ -73,50 +78,54 @@ in {
                       --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}";
-                inherit meta;
-                src = fetchurl {inherit url sha256;};
-                preferLocalBuild = true;
-                allowSubstitutes = true;
-                buildCommand = ''
-                  dst="$out/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
-                  mkdir -p "$dst"
-                  install -v -m644 "$src" "$dst/${addonId}.xpi"
-                '';
-              });
-
-            addons = import ./addons.nix {inherit buildFirefoxXpiAddon lib;};
+                )
+                (builtins.readFile css)
+              ];
           in
-            with addons;
+          {
+            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}";
+                    inherit meta;
+                    src = fetchurl { inherit url sha256; };
+                    preferLocalBuild = true;
+                    allowSubstitutes = true;
+                    buildCommand = ''
+                      dst="$out/share/mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
+                      mkdir -p "$dst"
+                      install -v -m644 "$src" "$dst/${addonId}.xpi"
+                    '';
+                  }
+                );
+
+                addons = import ./addons.nix { inherit buildFirefoxXpiAddon lib; };
+              in
+              with addons;
               [
                 bypass-paywalls
                 consent-o-matic
@@ -133,483 +142,434 @@ in {
               ]
               ++ optional config.nixfiles.modules.ipfs.enable ipfs-companion;
 
-          search = {
-            force = true;
-
-            default = "DuckDuckGo";
-            order = ["DuckDuckGo" "Yahoo" "Google"];
-
-            engines = let
-              getIcon = url: sha256: pkgs.fetchurl {inherit url sha256;};
-            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/favicon.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://nixos.wiki/index.php?search={searchTerms}";}];
-                icon =
-                  getIcon
-                  "https://nixos.wiki/favicon.png"
-                  "sha256-DE8IgVninF6Aq3iNMgerhvF1dpoXqDUSibtWSpf/dN4=";
-                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"];
-              };
+            search = {
+              force = true;
 
-              "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"];
-              };
+              default = "DuckDuckGo";
+              order = [
+                "DuckDuckGo"
+                "Yahoo"
+                "Google"
+              ];
 
-              "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"];
-              };
+              engines =
+                let
+                  getIcon = url: sha256: pkgs.fetchurl { inherit url sha256; };
+                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/favicon.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://nixos.wiki/index.php?search={searchTerms}"; } ];
+                    icon = getIcon "https://nixos.wiki/favicon.png" "sha256-DE8IgVninF6Aq3iNMgerhvF1dpoXqDUSibtWSpf/dN4=";
+                    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={}"; } ];
+                    icon = getIcon "https://www.youtube.com/s/desktop/280a3f09/img/favicon.ico" "sha256-i7HQ+kOhdDbVndVG9vdMdtxEc13vdSLCLYAxFm24kR0=";
+                    definedAliases = [
+                      "@youtube"
+                      "@yt"
+                    ];
+                  };
+                };
+            };
 
-              "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"];
-              };
+            # 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";
+                  })
+                ];
+              }
+            ];
 
-              "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"];
+            # 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";
               };
-
-              "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"];
+              "0200".enable = true;
+              "0300".enable = true;
+              "0400" = {
+                enable = true;
+                "0401"."browser.safebrowsing.phishing.enabled".enable = true;
+                "0402"."browser.safebrowsing.downloads.enabled".enable = true;
+                "0404" = {
+                  "browser.safebrowsing.downloads.remote.block_potentially_unwanted".enable = true;
+                  "browser.safebrowsing.downloads.remote.block_uncommon".enable = true;
+                };
+                "0405"."browser.safebrowsing.allowOverride".enable = true;
               };
-
-              "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"];
+              "0600".enable = true;
+              "0700" = {
+                enable = true;
+                "0710"."network.trr.mode" = {
+                  enable = true;
+                  value = 5;
+                };
               };
-
-              "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"];
+              "0800" = {
+                enable = true;
+                "0830" = {
+                  "browser.search.separatePrivateDefault" = {
+                    enable = true;
+                    value = false;
+                  };
+                  "browser.search.separatePrivateDefault.ui.enabled" = {
+                    enable = true;
+                    value = false;
+                  };
+                };
               };
-
-              "YouTube" = {
-                urls = [{template = "https://yewtu.be/search?q={}";}];
-                icon =
-                  getIcon
-                  "https://www.youtube.com/s/desktop/280a3f09/img/favicon.ico"
-                  "sha256-i7HQ+kOhdDbVndVG9vdMdtxEc13vdSLCLYAxFm24kR0=";
-                definedAliases = ["@youtube" "@yt"];
+              "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;
               };
-            };
-          };
-
-          # 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;
-              "0401"."browser.safebrowsing.phishing.enabled".enable = true;
-              "0402"."browser.safebrowsing.downloads.enabled".enable = true;
-              "0404" = {
-                "browser.safebrowsing.downloads.remote.block_potentially_unwanted".enable = true;
-                "browser.safebrowsing.downloads.remote.block_uncommon".enable = true;
+              "2700".enable = true;
+              "2800" = {
+                enable = true;
+                "2811"."privacy.clearOnShutdown.history".value = false;
               };
-              "0405"."browser.safebrowsing.allowOverride".enable = true;
-            };
-            "0600".enable = true;
-            "0700" = {
-              enable = true;
-              "0710"."network.trr.mode" = {
+              "4500" = {
                 enable = true;
-                value = 5;
+                "4502".enable = false;
+                "4504".enable = false;
               };
-            };
-            "0800" = {
-              enable = true;
-              "0830" = {
-                "browser.search.separatePrivateDefault" = {
-                  enable = true;
-                  value = false;
-                };
-                "browser.search.separatePrivateDefault.ui.enabled" = {
-                  enable = true;
-                  value = false;
+              "5000" = {
+                enable = true;
+                "5003"."signon.rememberSignons".enable = true;
+                "5017" = {
+                  "extensions.formautofill.addresses.enabled".enable = true;
+                  "extensions.formautofill.creditCards.enabled".enable = true;
                 };
+                "5019"."browser.pagethumbnails.capturing_disabled".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;
-            };
-            "4500" = {
-              enable = true;
-              "4502".enable = false;
-              "4504".enable = false;
-            };
-            "5000" = {
-              enable = true;
-              "5003"."signon.rememberSignons".enable = true;
-              "5017" = {
-                "extensions.formautofill.addresses.enabled".enable = true;
-                "extensions.formautofill.creditCards.enabled".enable = true;
+              "5500" = {
+                enable = true;
+                "5508"."media.eme.enabled".enable = true;
+                "5508"."browser.eme.ui.enabled".enable = true;
               };
-              "5019"."browser.pagethumbnails.capturing_disabled".enable = true;
+              "6000".enable = true;
+              "7000".enable = true;
+              "8000".enable = true;
+              "9000".enable = true;
             };
-            "5500" = {
-              enable = true;
-              "5508"."media.eme.enabled".enable = true;
-              "5508"."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.urlbar.suggest.engines" = false;
-            "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;
+            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.urlbar.suggest.engines" = false;
+              "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;
+            };
           };
-        };
       };
     };
   };

Consider giving Nix/NixOS a try! <3