about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Taskfile.dist.yml16
-rw-r--r--flake.lock24
-rw-r--r--flake.nix24
-rw-r--r--modules/common/common/nix.nix3
-rw-r--r--modules/nixos/firefox/addons.json59
-rw-r--r--modules/nixos/firefox/addons.nix1002
-rw-r--r--modules/nixos/firefox/default.nix64
8 files changed, 1137 insertions, 56 deletions
diff --git a/.gitignore b/.gitignore
index a0e2b39..1028b64 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 *.qcow2
 .direnv/
 .pre-commit-config.yaml
+/.task/
 /result*
diff --git a/Taskfile.dist.yml b/Taskfile.dist.yml
new file mode 100644
index 0000000..e0e8240
--- /dev/null
+++ b/Taskfile.dist.yml
@@ -0,0 +1,16 @@
+---
+version: '3'
+
+tasks:
+  update-firefox-addons:
+    vars:
+      input: "{{ .ROOT_DIR }}/modules/nixos/firefox/addons.json"
+      output: "{{ .ROOT_DIR }}/modules/nixos/firefox/addons.nix"
+    sources:
+      - "{{ .input }}"
+    generates:
+      - "{{ .output }}"
+    cmds:
+      - nix run sourcehut:~rycee/mozilla-addons-to-nix {{ .input }} {{ .output }}
+      - nix fmt {{ .output }}
+      - nix run .#deadnix -- --edit --quiet {{ .output }}
diff --git a/flake.lock b/flake.lock
index b306f68..7390826 100644
--- a/flake.lock
+++ b/flake.lock
@@ -241,6 +241,7 @@
     "gitignore": {
       "inputs": {
         "nixpkgs": [
+          "pre-commit-hooks",
           "nixpkgs"
         ]
       },
@@ -254,7 +255,6 @@
       },
       "original": {
         "owner": "hercules-ci",
-        "ref": "master",
         "repo": "gitignore.nix",
         "type": "github"
       }
@@ -476,22 +476,6 @@
         "type": "github"
       }
     },
-    "nur": {
-      "locked": {
-        "lastModified": 1700692941,
-        "narHash": "sha256-kthn0TMnP/EmfO4ujKYwXdzzFXqKmf3jdzQt7lRONaA=",
-        "owner": "nix-community",
-        "repo": "NUR",
-        "rev": "9e74bf0dc3167149e484519440359a347c5b68f4",
-        "type": "github"
-      },
-      "original": {
-        "owner": "nix-community",
-        "ref": "master",
-        "repo": "NUR",
-        "type": "github"
-      }
-    },
     "poetry2nix": {
       "inputs": {
         "flake-utils": [
@@ -527,9 +511,7 @@
         "flake-utils": [
           "flake-utils"
         ],
-        "gitignore": [
-          "gitignore"
-        ],
+        "gitignore": "gitignore",
         "nixpkgs": [
           "nixpkgs"
         ],
@@ -563,7 +545,6 @@
         "flake-compat": "flake-compat",
         "flake-registry": "flake-registry",
         "flake-utils": "flake-utils",
-        "gitignore": "gitignore",
         "home-manager": "home-manager",
         "impermanence": "impermanence",
         "nix-minecraft": "nix-minecraft",
@@ -575,7 +556,6 @@
         "nixvim": "nixvim",
         "nmap-vulners": "nmap-vulners",
         "nmap-vulscan": "nmap-vulscan",
-        "nur": "nur",
         "pre-commit-hooks": "pre-commit-hooks",
         "simple-nixos-mailserver": "simple-nixos-mailserver",
         "xmonad-ng": "xmonad-ng"
diff --git a/flake.nix b/flake.nix
index a70a934..e7a4624 100644
--- a/flake.nix
+++ b/flake.nix
@@ -41,13 +41,6 @@
       ref = "master";
     };
 
-    nur = {
-      type = "github";
-      owner = "nix-community";
-      repo = "NUR";
-      ref = "master";
-    };
-
     darwin = {
       type = "github";
       owner = "LnL7";
@@ -194,20 +187,11 @@
       inputs = {
         flake-compat.follows = "flake-compat";
         flake-utils.follows = "flake-utils";
-        gitignore.follows = "gitignore";
         nixpkgs-stable.follows = "nixpkgs-stable";
         nixpkgs.follows = "nixpkgs";
       };
     };
 
-    gitignore = {
-      type = "github";
-      owner = "hercules-ci";
-      repo = "gitignore.nix";
-      ref = "master";
-      inputs.nixpkgs.follows = "nixpkgs";
-    };
-
     xmonad-ng = {
       # type = "path";
       # path = "/home/azahi/src/xmonad-ng";
@@ -269,9 +253,11 @@
           overlays = [self.overlays.default];
         };
 
-        devShells.default = self.legacyPackages.${system}.mkShell {
-          inherit (self.checks.${system}.preCommit) shellHook;
-        };
+        devShells.default = with self.legacyPackages.${system};
+          mkShell {
+            inherit (self.checks.${system}.preCommit) shellHook;
+            packages = [go-task];
+          };
 
         formatter = self.legacyPackages.${system}.alejandra;
 
diff --git a/modules/common/common/nix.nix b/modules/common/common/nix.nix
index ec3a4a3..39e3282 100644
--- a/modules/common/common/nix.nix
+++ b/modules/common/common/nix.nix
@@ -4,6 +4,7 @@
   lib,
   localUsername ? lib.my.username,
   pkgs,
+  pkgsPr,
   this,
   ...
 }:
@@ -82,8 +83,8 @@ with lib; {
 
   nixpkgs.overlays = with inputs; [
     self.overlays.default
-    nur.overlay
     (_: _: {
+      inherit (pkgsPr 270503 "sha256-f0eQY+PzwgtQoaIY+uslh8yqSfFHDYLEQUODO0FxTf0=") soju;
     })
   ];
 
diff --git a/modules/nixos/firefox/addons.json b/modules/nixos/firefox/addons.json
new file mode 100644
index 0000000..68c2f86
--- /dev/null
+++ b/modules/nixos/firefox/addons.json
@@ -0,0 +1,59 @@
+[
+  {
+    "pname": "bitwarden",
+    "slug": "bitwarden-password-manager"
+  },
+  {
+    "slug": "canvasblocker"
+  },
+  {
+    "slug": "consent-o-matic"
+  },
+  {
+    "slug": "darkreader"
+  },
+  {
+    "pname": "dont-track-me-google",
+    "slug": "dont-track-me-google1"
+  },
+  {
+    "slug": "furiganaize"
+  },
+  {
+    "slug": "ipfs-companion"
+  },
+  {
+    "slug": "languagetool"
+  },
+  {
+    "pname": "localcdn",
+    "slug": "localcdn-fork-of-decentraleyes"
+  },
+  {
+    "slug": "no-pdf-download"
+  },
+  {
+    "slug": "noscript"
+  },
+  {
+    "pname": "privacy-badger",
+    "slug": "privacy-badger17"
+  },
+  {
+    "slug": "privacy-redirect"
+  },
+  {
+    "pname": "rikaichamp",
+    "slug": "10ten-ja-reader"
+  },
+  {
+    "slug": "ublock-origin"
+  },
+  {
+    "pname": "user-agent-switcher",
+    "slug": "user-agent-string-switcher"
+  },
+  {
+    "slug": "violentmonkey"
+  }
+]
diff --git a/modules/nixos/firefox/addons.nix b/modules/nixos/firefox/addons.nix
new file mode 100644
index 0000000..fc4d51b
--- /dev/null
+++ b/modules/nixos/firefox/addons.nix
@@ -0,0 +1,1002 @@
+{
+  buildFirefoxXpiAddon,
+  lib,
+}: {
+  "bitwarden" = buildFirefoxXpiAddon {
+    pname = "bitwarden";
+    version = "2023.10.2";
+    addonId = "{446900e4-71c2-419f-a6a7-df9c091e268b}";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4191732/bitwarden_password_manager-2023.10.2.xpi";
+    sha256 = "3eac55c07a2802a6192e2788da86578d45158fca21ccdeb521e5281137ecc24a";
+    meta = with lib; {
+      homepage = "https://bitwarden.com";
+      description = "A secure and free password manager for all of your devices.";
+      license = licenses.gpl3;
+      mozPermissions = [
+        "tabs"
+        "contextMenus"
+        "storage"
+        "unlimitedStorage"
+        "clipboardRead"
+        "clipboardWrite"
+        "idle"
+        "http://*/*"
+        "https://*/*"
+        "webRequest"
+        "webRequestBlocking"
+        "file:///*"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "canvasblocker" = buildFirefoxXpiAddon {
+    pname = "canvasblocker";
+    version = "1.9";
+    addonId = "CanvasBlocker@kkapsner.de";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4097901/canvasblocker-1.9.xpi";
+    sha256 = "5248c2c2dedd14b8aa2cd73f9484285d9453e93339f64fcf04a3d63c859cf3d7";
+    meta = with lib; {
+      homepage = "https://github.com/kkapsner/CanvasBlocker/";
+      description = "Alters some JS APIs to prevent fingerprinting.";
+      license = licenses.mpl20;
+      mozPermissions = [
+        "<all_urls>"
+        "storage"
+        "tabs"
+        "webRequest"
+        "webRequestBlocking"
+        "contextualIdentities"
+        "cookies"
+        "privacy"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "consent-o-matic" = buildFirefoxXpiAddon {
+    pname = "consent-o-matic";
+    version = "1.0.12";
+    addonId = "gdpr@cavi.au.dk";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4074847/consent_o_matic-1.0.12.xpi";
+    sha256 = "013ea48757b8a4d84a2a0d944bc49b5612d62bae1d337f9569f425f2b8310e0f";
+    meta = with lib; {
+      homepage = "https://consentomatic.au.dk/";
+      description = "Automatic handling of GDPR consent forms";
+      license = licenses.mit;
+      mozPermissions = ["activeTab" "storage" "<all_urls>"];
+      platforms = platforms.all;
+    };
+  };
+  "darkreader" = buildFirefoxXpiAddon {
+    pname = "darkreader";
+    version = "4.9.70";
+    addonId = "addon@darkreader.org";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4198549/darkreader-4.9.70.xpi";
+    sha256 = "3ccbe247031dd4fcc3d9bd840872ed38e9843729709f92803c234041070588a7";
+    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.";
+      license = licenses.mit;
+      mozPermissions = [
+        "alarms"
+        "contextMenus"
+        "storage"
+        "tabs"
+        "theme"
+        "<all_urls>"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "dont-track-me-google" = buildFirefoxXpiAddon {
+    pname = "dont-track-me-google";
+    version = "4.28";
+    addonId = "dont-track-me-google@robwu.nl";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4132891/dont_track_me_google1-4.28.xpi";
+    sha256 = "25bc90005d6f28d53182ef48c7efcbba72b198ce67cf1f0747dbd23d43078b26";
+    meta = with lib; {
+      homepage = "https://github.com/Rob--W/dont-track-me-google";
+      description = "Removes the annoying link-conversion at Google Search / maps / ...";
+      license = licenses.mit;
+      mozPermissions = [
+        "storage"
+        "*://*.google.com/*"
+        "*://*.google.ad/*"
+        "*://*.google.ae/*"
+        "*://*.google.com.af/*"
+        "*://*.google.com.ag/*"
+        "*://*.google.com.ai/*"
+        "*://*.google.al/*"
+        "*://*.google.am/*"
+        "*://*.google.co.ao/*"
+        "*://*.google.com.ar/*"
+        "*://*.google.as/*"
+        "*://*.google.at/*"
+        "*://*.google.com.au/*"
+        "*://*.google.az/*"
+        "*://*.google.ba/*"
+        "*://*.google.com.bd/*"
+        "*://*.google.be/*"
+        "*://*.google.bf/*"
+        "*://*.google.bg/*"
+        "*://*.google.com.bh/*"
+        "*://*.google.bi/*"
+        "*://*.google.bj/*"
+        "*://*.google.com.bn/*"
+        "*://*.google.com.bo/*"
+        "*://*.google.com.br/*"
+        "*://*.google.bs/*"
+        "*://*.google.bt/*"
+        "*://*.google.co.bw/*"
+        "*://*.google.by/*"
+        "*://*.google.com.bz/*"
+        "*://*.google.ca/*"
+        "*://*.google.cd/*"
+        "*://*.google.cf/*"
+        "*://*.google.cg/*"
+        "*://*.google.ch/*"
+        "*://*.google.ci/*"
+        "*://*.google.co.ck/*"
+        "*://*.google.cl/*"
+        "*://*.google.cm/*"
+        "*://*.google.cn/*"
+        "*://*.google.com.co/*"
+        "*://*.google.co.cr/*"
+        "*://*.google.com.cu/*"
+        "*://*.google.cv/*"
+        "*://*.google.com.cy/*"
+        "*://*.google.cz/*"
+        "*://*.google.de/*"
+        "*://*.google.dj/*"
+        "*://*.google.dk/*"
+        "*://*.google.dm/*"
+        "*://*.google.com.do/*"
+        "*://*.google.dz/*"
+        "*://*.google.com.ec/*"
+        "*://*.google.ee/*"
+        "*://*.google.com.eg/*"
+        "*://*.google.es/*"
+        "*://*.google.com.et/*"
+        "*://*.google.fi/*"
+        "*://*.google.com.fj/*"
+        "*://*.google.fm/*"
+        "*://*.google.fr/*"
+        "*://*.google.ga/*"
+        "*://*.google.ge/*"
+        "*://*.google.gg/*"
+        "*://*.google.com.gh/*"
+        "*://*.google.com.gi/*"
+        "*://*.google.gl/*"
+        "*://*.google.gm/*"
+        "*://*.google.gp/*"
+        "*://*.google.gr/*"
+        "*://*.google.com.gt/*"
+        "*://*.google.gy/*"
+        "*://*.google.com.hk/*"
+        "*://*.google.hn/*"
+        "*://*.google.hr/*"
+        "*://*.google.ht/*"
+        "*://*.google.hu/*"
+        "*://*.google.co.id/*"
+        "*://*.google.ie/*"
+        "*://*.google.co.il/*"
+        "*://*.google.im/*"
+        "*://*.google.co.in/*"
+        "*://*.google.iq/*"
+        "*://*.google.is/*"
+        "*://*.google.it/*"
+        "*://*.google.je/*"
+        "*://*.google.com.jm/*"
+        "*://*.google.jo/*"
+        "*://*.google.co.jp/*"
+        "*://*.google.co.ke/*"
+        "*://*.google.com.kh/*"
+        "*://*.google.ki/*"
+        "*://*.google.kg/*"
+        "*://*.google.co.kr/*"
+        "*://*.google.com.kw/*"
+        "*://*.google.kz/*"
+        "*://*.google.la/*"
+        "*://*.google.com.lb/*"
+        "*://*.google.li/*"
+        "*://*.google.lk/*"
+        "*://*.google.co.ls/*"
+        "*://*.google.lt/*"
+        "*://*.google.lu/*"
+        "*://*.google.lv/*"
+        "*://*.google.com.ly/*"
+        "*://*.google.co.ma/*"
+        "*://*.google.md/*"
+        "*://*.google.me/*"
+        "*://*.google.mg/*"
+        "*://*.google.mk/*"
+        "*://*.google.ml/*"
+        "*://*.google.com.mm/*"
+        "*://*.google.mn/*"
+        "*://*.google.ms/*"
+        "*://*.google.com.mt/*"
+        "*://*.google.mu/*"
+        "*://*.google.mv/*"
+        "*://*.google.mw/*"
+        "*://*.google.com.mx/*"
+        "*://*.google.com.my/*"
+        "*://*.google.co.mz/*"
+        "*://*.google.com.na/*"
+        "*://*.google.com.nf/*"
+        "*://*.google.com.ng/*"
+        "*://*.google.com.ni/*"
+        "*://*.google.ne/*"
+        "*://*.google.nl/*"
+        "*://*.google.no/*"
+        "*://*.google.com.np/*"
+        "*://*.google.nr/*"
+        "*://*.google.nu/*"
+        "*://*.google.co.nz/*"
+        "*://*.google.com.om/*"
+        "*://*.google.com.pa/*"
+        "*://*.google.com.pe/*"
+        "*://*.google.com.pg/*"
+        "*://*.google.com.ph/*"
+        "*://*.google.com.pk/*"
+        "*://*.google.pl/*"
+        "*://*.google.pn/*"
+        "*://*.google.com.pr/*"
+        "*://*.google.ps/*"
+        "*://*.google.pt/*"
+        "*://*.google.com.py/*"
+        "*://*.google.com.qa/*"
+        "*://*.google.ro/*"
+        "*://*.google.ru/*"
+        "*://*.google.rw/*"
+        "*://*.google.com.sa/*"
+        "*://*.google.com.sb/*"
+        "*://*.google.sc/*"
+        "*://*.google.se/*"
+        "*://*.google.com.sg/*"
+        "*://*.google.sh/*"
+        "*://*.google.si/*"
+        "*://*.google.sk/*"
+        "*://*.google.com.sl/*"
+        "*://*.google.sn/*"
+        "*://*.google.so/*"
+        "*://*.google.sm/*"
+        "*://*.google.sr/*"
+        "*://*.google.st/*"
+        "*://*.google.com.sv/*"
+        "*://*.google.td/*"
+        "*://*.google.tg/*"
+        "*://*.google.co.th/*"
+        "*://*.google.com.tj/*"
+        "*://*.google.tk/*"
+        "*://*.google.tl/*"
+        "*://*.google.tm/*"
+        "*://*.google.tn/*"
+        "*://*.google.to/*"
+        "*://*.google.com.tr/*"
+        "*://*.google.tt/*"
+        "*://*.google.com.tw/*"
+        "*://*.google.co.tz/*"
+        "*://*.google.com.ua/*"
+        "*://*.google.co.ug/*"
+        "*://*.google.co.uk/*"
+        "*://*.google.com.uy/*"
+        "*://*.google.co.uz/*"
+        "*://*.google.com.vc/*"
+        "*://*.google.co.ve/*"
+        "*://*.google.vg/*"
+        "*://*.google.co.vi/*"
+        "*://*.google.com.vn/*"
+        "*://*.google.vu/*"
+        "*://*.google.ws/*"
+        "*://*.google.rs/*"
+        "*://*.google.co.za/*"
+        "*://*.google.co.zm/*"
+        "*://*.google.co.zw/*"
+        "*://*.google.cat/*"
+        "*://*.google.ng/*"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "furiganaize" = buildFirefoxXpiAddon {
+    pname = "furiganaize";
+    version = "0.7.2";
+    addonId = "{a2503cd4-4083-4c2f-bef2-37767a569867}";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4032306/furiganaize-0.7.2.xpi";
+    sha256 = "7545bc418f2afbc576b0e762f2b2fa0545d5d94f3f80737e5356d087a5951c0b";
+    meta = with lib; {
+      homepage = "https://github.com/kuanyui/Furiganaize";
+      description = "Auto insert furigana (振り仮名) on Japanese kanji.";
+      license = licenses.mit;
+      mozPermissions = [
+        "http://*/*"
+        "https://*/*"
+        "file://*/*"
+        "<all_urls>"
+        "activeTab"
+        "tabs"
+        "storage"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "ipfs-companion" = buildFirefoxXpiAddon {
+    pname = "ipfs-companion";
+    version = "3.1.0";
+    addonId = "ipfs-firefox-addon@lidel.org";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4172699/ipfs_companion-3.1.0.xpi";
+    sha256 = "784f6d1e0497d86f1e42cfe7de8548b5cc28fabe80e50771d90f59ddf1b9d3c1";
+    meta = with lib; {
+      homepage = "https://github.com/ipfs/ipfs-companion";
+      description = "Harness the power of IPFS in your browser";
+      license = licenses.cc0;
+      mozPermissions = [
+        "idle"
+        "tabs"
+        "notifications"
+        "proxy"
+        "storage"
+        "unlimitedStorage"
+        "contextMenus"
+        "clipboardWrite"
+        "webNavigation"
+        "webRequest"
+        "webRequestBlocking"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "languagetool" = buildFirefoxXpiAddon {
+    pname = "languagetool";
+    version = "8.3.0";
+    addonId = "languagetool-webextension@languagetool.org";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4199245/languagetool-8.3.0.xpi";
+    sha256 = "e357424e3df9dde4ba10eb9f8f3719ac4830681570557f4d51db15a462cd7667";
+    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.";
+      mozPermissions = [
+        "activeTab"
+        "storage"
+        "contextMenus"
+        "alarms"
+        "http://*/*"
+        "https://*/*"
+        "file:///*"
+        "*://docs.google.com/document/*"
+        "*://languagetool.org/*"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "localcdn" = buildFirefoxXpiAddon {
+    pname = "localcdn";
+    version = "2.6.59";
+    addonId = "{b86e4813-687a-43e6-ab65-0bde4ab75758}";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4197044/localcdn_fork_of_decentraleyes-2.6.59.xpi";
+    sha256 = "0aa14f964d0a851151dd8ac5ad87ae9085eea8e44d0d19e3b6b2849f92422721";
+    meta = with lib; {
+      homepage = "https://www.localcdn.org";
+      description = "Emulates remote frameworks (e.g. jQuery, Bootstrap, AngularJS) and delivers them as local resource. Prevents unnecessary 3rd party requests to Google, StackPath, MaxCDN and more. Prepared rules for uBlock Origin/uMatrix.";
+      license = licenses.mpl20;
+      mozPermissions = [
+        "*://*/*"
+        "privacy"
+        "storage"
+        "webNavigation"
+        "webRequest"
+        "webRequestBlocking"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "no-pdf-download" = buildFirefoxXpiAddon {
+    pname = "no-pdf-download";
+    version = "1.0.6";
+    addonId = "{b9b25e4a-bdf4-4270-868c-3f619eaf437d}";
+    url = "https://addons.mozilla.org/firefox/downloads/file/3020560/no_pdf_download-1.0.6.xpi";
+    sha256 = "fa27b6729178a23ccf2eee07cd7650d841fc6040f2e5adfb919931b671ed79e6";
+    meta = with lib; {
+      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>"];
+      platforms = platforms.all;
+    };
+  };
+  "noscript" = buildFirefoxXpiAddon {
+    pname = "noscript";
+    version = "11.4.28";
+    addonId = "{73a6fe31-595d-460b-a920-fcc0f8843232}";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4178438/noscript-11.4.28.xpi";
+    sha256 = "54d076b3226d454216117547f6441d2f95af3057d20f726e55d94b0f22573c14";
+    meta = with lib; {
+      homepage = "https://noscript.net";
+      description = "The best security you can get in a web browser! Allow potentially malicious web content to run only from sites you trust. Protect yourself against XSS other web security exploits.";
+      license = licenses.gpl2;
+      mozPermissions = [
+        "contextMenus"
+        "storage"
+        "tabs"
+        "unlimitedStorage"
+        "webNavigation"
+        "webRequest"
+        "webRequestBlocking"
+        "dns"
+        "<all_urls>"
+        "file://*/*"
+        "ftp://*/*"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "privacy-badger" = buildFirefoxXpiAddon {
+    pname = "privacy-badger";
+    version = "2023.10.31";
+    addonId = "jid1-MnnxcxisBPnSXQ@jetpack";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4188670/privacy_badger17-2023.10.31.xpi";
+    sha256 = "37e96cbd257b73d7350605ed20494a82b578f25a2cefc3de2dab019e5ff6ced1";
+    meta = with lib; {
+      homepage = "https://privacybadger.org/";
+      description = "Automatically learns to block invisible trackers.";
+      license = licenses.gpl3;
+      mozPermissions = [
+        "alarms"
+        "tabs"
+        "http://*/*"
+        "https://*/*"
+        "webNavigation"
+        "webRequest"
+        "webRequestBlocking"
+        "storage"
+        "privacy"
+        "https://*.facebook.com/*"
+        "http://*.facebook.com/*"
+        "https://*.messenger.com/*"
+        "http://*.messenger.com/*"
+        "*://*.facebookcorewwwi.onion/*"
+        "https://docs.google.com/*"
+        "http://docs.google.com/*"
+        "https://mail.google.com/*"
+        "http://mail.google.com/*"
+        "https://www.google.com/*"
+        "http://www.google.com/*"
+        "https://www.google.ad/*"
+        "http://www.google.ad/*"
+        "https://www.google.ae/*"
+        "http://www.google.ae/*"
+        "https://www.google.com.af/*"
+        "http://www.google.com.af/*"
+        "https://www.google.com.ag/*"
+        "http://www.google.com.ag/*"
+        "https://www.google.com.ai/*"
+        "http://www.google.com.ai/*"
+        "https://www.google.al/*"
+        "http://www.google.al/*"
+        "https://www.google.am/*"
+        "http://www.google.am/*"
+        "https://www.google.co.ao/*"
+        "http://www.google.co.ao/*"
+        "https://www.google.com.ar/*"
+        "http://www.google.com.ar/*"
+        "https://www.google.as/*"
+        "http://www.google.as/*"
+        "https://www.google.at/*"
+        "http://www.google.at/*"
+        "https://www.google.com.au/*"
+        "http://www.google.com.au/*"
+        "https://www.google.az/*"
+        "http://www.google.az/*"
+        "https://www.google.ba/*"
+        "http://www.google.ba/*"
+        "https://www.google.com.bd/*"
+        "http://www.google.com.bd/*"
+        "https://www.google.be/*"
+        "http://www.google.be/*"
+        "https://www.google.bf/*"
+        "http://www.google.bf/*"
+        "https://www.google.bg/*"
+        "http://www.google.bg/*"
+        "https://www.google.com.bh/*"
+        "http://www.google.com.bh/*"
+        "https://www.google.bi/*"
+        "http://www.google.bi/*"
+        "https://www.google.bj/*"
+        "http://www.google.bj/*"
+        "https://www.google.com.bn/*"
+        "http://www.google.com.bn/*"
+        "https://www.google.com.bo/*"
+        "http://www.google.com.bo/*"
+        "https://www.google.com.br/*"
+        "http://www.google.com.br/*"
+        "https://www.google.bs/*"
+        "http://www.google.bs/*"
+        "https://www.google.bt/*"
+        "http://www.google.bt/*"
+        "https://www.google.co.bw/*"
+        "http://www.google.co.bw/*"
+        "https://www.google.by/*"
+        "http://www.google.by/*"
+        "https://www.google.com.bz/*"
+        "http://www.google.com.bz/*"
+        "https://www.google.ca/*"
+        "http://www.google.ca/*"
+        "https://www.google.cd/*"
+        "http://www.google.cd/*"
+        "https://www.google.cf/*"
+        "http://www.google.cf/*"
+        "https://www.google.cg/*"
+        "http://www.google.cg/*"
+        "https://www.google.ch/*"
+        "http://www.google.ch/*"
+        "https://www.google.ci/*"
+        "http://www.google.ci/*"
+        "https://www.google.co.ck/*"
+        "http://www.google.co.ck/*"
+        "https://www.google.cl/*"
+        "http://www.google.cl/*"
+        "https://www.google.cm/*"
+        "http://www.google.cm/*"
+        "https://www.google.cn/*"
+        "http://www.google.cn/*"
+        "https://www.google.com.co/*"
+        "http://www.google.com.co/*"
+        "https://www.google.co.cr/*"
+        "http://www.google.co.cr/*"
+        "https://www.google.com.cu/*"
+        "http://www.google.com.cu/*"
+        "https://www.google.cv/*"
+        "http://www.google.cv/*"
+        "https://www.google.com.cy/*"
+        "http://www.google.com.cy/*"
+        "https://www.google.cz/*"
+        "http://www.google.cz/*"
+        "https://www.google.de/*"
+        "http://www.google.de/*"
+        "https://www.google.dj/*"
+        "http://www.google.dj/*"
+        "https://www.google.dk/*"
+        "http://www.google.dk/*"
+        "https://www.google.dm/*"
+        "http://www.google.dm/*"
+        "https://www.google.com.do/*"
+        "http://www.google.com.do/*"
+        "https://www.google.dz/*"
+        "http://www.google.dz/*"
+        "https://www.google.com.ec/*"
+        "http://www.google.com.ec/*"
+        "https://www.google.ee/*"
+        "http://www.google.ee/*"
+        "https://www.google.com.eg/*"
+        "http://www.google.com.eg/*"
+        "https://www.google.es/*"
+        "http://www.google.es/*"
+        "https://www.google.com.et/*"
+        "http://www.google.com.et/*"
+        "https://www.google.fi/*"
+        "http://www.google.fi/*"
+        "https://www.google.com.fj/*"
+        "http://www.google.com.fj/*"
+        "https://www.google.fm/*"
+        "http://www.google.fm/*"
+        "https://www.google.fr/*"
+        "http://www.google.fr/*"
+        "https://www.google.ga/*"
+        "http://www.google.ga/*"
+        "https://www.google.ge/*"
+        "http://www.google.ge/*"
+        "https://www.google.gg/*"
+        "http://www.google.gg/*"
+        "https://www.google.com.gh/*"
+        "http://www.google.com.gh/*"
+        "https://www.google.com.gi/*"
+        "http://www.google.com.gi/*"
+        "https://www.google.gl/*"
+        "http://www.google.gl/*"
+        "https://www.google.gm/*"
+        "http://www.google.gm/*"
+        "https://www.google.gr/*"
+        "http://www.google.gr/*"
+        "https://www.google.com.gt/*"
+        "http://www.google.com.gt/*"
+        "https://www.google.gy/*"
+        "http://www.google.gy/*"
+        "https://www.google.com.hk/*"
+        "http://www.google.com.hk/*"
+        "https://www.google.hn/*"
+        "http://www.google.hn/*"
+        "https://www.google.hr/*"
+        "http://www.google.hr/*"
+        "https://www.google.ht/*"
+        "http://www.google.ht/*"
+        "https://www.google.hu/*"
+        "http://www.google.hu/*"
+        "https://www.google.co.id/*"
+        "http://www.google.co.id/*"
+        "https://www.google.ie/*"
+        "http://www.google.ie/*"
+        "https://www.google.co.il/*"
+        "http://www.google.co.il/*"
+        "https://www.google.im/*"
+        "http://www.google.im/*"
+        "https://www.google.co.in/*"
+        "http://www.google.co.in/*"
+        "https://www.google.iq/*"
+        "http://www.google.iq/*"
+        "https://www.google.is/*"
+        "http://www.google.is/*"
+        "https://www.google.it/*"
+        "http://www.google.it/*"
+        "https://www.google.je/*"
+        "http://www.google.je/*"
+        "https://www.google.com.jm/*"
+        "http://www.google.com.jm/*"
+        "https://www.google.jo/*"
+        "http://www.google.jo/*"
+        "https://www.google.co.jp/*"
+        "http://www.google.co.jp/*"
+        "https://www.google.co.ke/*"
+        "http://www.google.co.ke/*"
+        "https://www.google.com.kh/*"
+        "http://www.google.com.kh/*"
+        "https://www.google.ki/*"
+        "http://www.google.ki/*"
+        "https://www.google.kg/*"
+        "http://www.google.kg/*"
+        "https://www.google.co.kr/*"
+        "http://www.google.co.kr/*"
+        "https://www.google.com.kw/*"
+        "http://www.google.com.kw/*"
+        "https://www.google.kz/*"
+        "http://www.google.kz/*"
+        "https://www.google.la/*"
+        "http://www.google.la/*"
+        "https://www.google.com.lb/*"
+        "http://www.google.com.lb/*"
+        "https://www.google.li/*"
+        "http://www.google.li/*"
+        "https://www.google.lk/*"
+        "http://www.google.lk/*"
+        "https://www.google.co.ls/*"
+        "http://www.google.co.ls/*"
+        "https://www.google.lt/*"
+        "http://www.google.lt/*"
+        "https://www.google.lu/*"
+        "http://www.google.lu/*"
+        "https://www.google.lv/*"
+        "http://www.google.lv/*"
+        "https://www.google.com.ly/*"
+        "http://www.google.com.ly/*"
+        "https://www.google.co.ma/*"
+        "http://www.google.co.ma/*"
+        "https://www.google.md/*"
+        "http://www.google.md/*"
+        "https://www.google.me/*"
+        "http://www.google.me/*"
+        "https://www.google.mg/*"
+        "http://www.google.mg/*"
+        "https://www.google.mk/*"
+        "http://www.google.mk/*"
+        "https://www.google.ml/*"
+        "http://www.google.ml/*"
+        "https://www.google.com.mm/*"
+        "http://www.google.com.mm/*"
+        "https://www.google.mn/*"
+        "http://www.google.mn/*"
+        "https://www.google.ms/*"
+        "http://www.google.ms/*"
+        "https://www.google.com.mt/*"
+        "http://www.google.com.mt/*"
+        "https://www.google.mu/*"
+        "http://www.google.mu/*"
+        "https://www.google.mv/*"
+        "http://www.google.mv/*"
+        "https://www.google.mw/*"
+        "http://www.google.mw/*"
+        "https://www.google.com.mx/*"
+        "http://www.google.com.mx/*"
+        "https://www.google.com.my/*"
+        "http://www.google.com.my/*"
+        "https://www.google.co.mz/*"
+        "http://www.google.co.mz/*"
+        "https://www.google.com.na/*"
+        "http://www.google.com.na/*"
+        "https://www.google.com.ng/*"
+        "http://www.google.com.ng/*"
+        "https://www.google.com.ni/*"
+        "http://www.google.com.ni/*"
+        "https://www.google.ne/*"
+        "http://www.google.ne/*"
+        "https://www.google.nl/*"
+        "http://www.google.nl/*"
+        "https://www.google.no/*"
+        "http://www.google.no/*"
+        "https://www.google.com.np/*"
+        "http://www.google.com.np/*"
+        "https://www.google.nr/*"
+        "http://www.google.nr/*"
+        "https://www.google.nu/*"
+        "http://www.google.nu/*"
+        "https://www.google.co.nz/*"
+        "http://www.google.co.nz/*"
+        "https://www.google.com.om/*"
+        "http://www.google.com.om/*"
+        "https://www.google.com.pa/*"
+        "http://www.google.com.pa/*"
+        "https://www.google.com.pe/*"
+        "http://www.google.com.pe/*"
+        "https://www.google.com.pg/*"
+        "http://www.google.com.pg/*"
+        "https://www.google.com.ph/*"
+        "http://www.google.com.ph/*"
+        "https://www.google.com.pk/*"
+        "http://www.google.com.pk/*"
+        "https://www.google.pl/*"
+        "http://www.google.pl/*"
+        "https://www.google.pn/*"
+        "http://www.google.pn/*"
+        "https://www.google.com.pr/*"
+        "http://www.google.com.pr/*"
+        "https://www.google.ps/*"
+        "http://www.google.ps/*"
+        "https://www.google.pt/*"
+        "http://www.google.pt/*"
+        "https://www.google.com.py/*"
+        "http://www.google.com.py/*"
+        "https://www.google.com.qa/*"
+        "http://www.google.com.qa/*"
+        "https://www.google.ro/*"
+        "http://www.google.ro/*"
+        "https://www.google.ru/*"
+        "http://www.google.ru/*"
+        "https://www.google.rw/*"
+        "http://www.google.rw/*"
+        "https://www.google.com.sa/*"
+        "http://www.google.com.sa/*"
+        "https://www.google.com.sb/*"
+        "http://www.google.com.sb/*"
+        "https://www.google.sc/*"
+        "http://www.google.sc/*"
+        "https://www.google.se/*"
+        "http://www.google.se/*"
+        "https://www.google.com.sg/*"
+        "http://www.google.com.sg/*"
+        "https://www.google.sh/*"
+        "http://www.google.sh/*"
+        "https://www.google.si/*"
+        "http://www.google.si/*"
+        "https://www.google.sk/*"
+        "http://www.google.sk/*"
+        "https://www.google.com.sl/*"
+        "http://www.google.com.sl/*"
+        "https://www.google.sn/*"
+        "http://www.google.sn/*"
+        "https://www.google.so/*"
+        "http://www.google.so/*"
+        "https://www.google.sm/*"
+        "http://www.google.sm/*"
+        "https://www.google.sr/*"
+        "http://www.google.sr/*"
+        "https://www.google.st/*"
+        "http://www.google.st/*"
+        "https://www.google.com.sv/*"
+        "http://www.google.com.sv/*"
+        "https://www.google.td/*"
+        "http://www.google.td/*"
+        "https://www.google.tg/*"
+        "http://www.google.tg/*"
+        "https://www.google.co.th/*"
+        "http://www.google.co.th/*"
+        "https://www.google.com.tj/*"
+        "http://www.google.com.tj/*"
+        "https://www.google.tl/*"
+        "http://www.google.tl/*"
+        "https://www.google.tm/*"
+        "http://www.google.tm/*"
+        "https://www.google.tn/*"
+        "http://www.google.tn/*"
+        "https://www.google.to/*"
+        "http://www.google.to/*"
+        "https://www.google.com.tr/*"
+        "http://www.google.com.tr/*"
+        "https://www.google.tt/*"
+        "http://www.google.tt/*"
+        "https://www.google.com.tw/*"
+        "http://www.google.com.tw/*"
+        "https://www.google.co.tz/*"
+        "http://www.google.co.tz/*"
+        "https://www.google.com.ua/*"
+        "http://www.google.com.ua/*"
+        "https://www.google.co.ug/*"
+        "http://www.google.co.ug/*"
+        "https://www.google.co.uk/*"
+        "http://www.google.co.uk/*"
+        "https://www.google.com.uy/*"
+        "http://www.google.com.uy/*"
+        "https://www.google.co.uz/*"
+        "http://www.google.co.uz/*"
+        "https://www.google.com.vc/*"
+        "http://www.google.com.vc/*"
+        "https://www.google.co.ve/*"
+        "http://www.google.co.ve/*"
+        "https://www.google.vg/*"
+        "http://www.google.vg/*"
+        "https://www.google.co.vi/*"
+        "http://www.google.co.vi/*"
+        "https://www.google.com.vn/*"
+        "http://www.google.com.vn/*"
+        "https://www.google.vu/*"
+        "http://www.google.vu/*"
+        "https://www.google.ws/*"
+        "http://www.google.ws/*"
+        "https://www.google.rs/*"
+        "http://www.google.rs/*"
+        "https://www.google.co.za/*"
+        "http://www.google.co.za/*"
+        "https://www.google.co.zm/*"
+        "http://www.google.co.zm/*"
+        "https://www.google.co.zw/*"
+        "http://www.google.co.zw/*"
+        "https://www.google.cat/*"
+        "http://www.google.cat/*"
+        "<all_urls>"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "privacy-redirect" = buildFirefoxXpiAddon {
+    pname = "privacy-redirect";
+    version = "1.1.49";
+    addonId = "{b7f9d2cd-d772-4302-8c3f-eb941af36f76}";
+    url = "https://addons.mozilla.org/firefox/downloads/file/3815058/privacy_redirect-1.1.49.xpi";
+    sha256 = "9f1cf6e58fa3f86d180b5b99549fa666fa853a827c48cb231558566b0c1c3c75";
+    meta = with lib; {
+      homepage = "https://github.com/SimonBrazell/privacy-redirect";
+      description = "Redirects Twitter, YouTube, Instagram and more to privacy friendly alternatives.";
+      license = licenses.gpl3;
+      mozPermissions = [
+        "storage"
+        "webRequest"
+        "webRequestBlocking"
+        "<all_urls>"
+        "*://twitter.com/*"
+        "*://www.twitter.com/*"
+        "*://mobile.twitter.com/*"
+        "*://pbs.twimg.com/*"
+        "*://video.twimg.com/*"
+        "*://invidious.snopyta.org/*"
+        "*://invidious.xyz/*"
+        "*://invidious.kavin.rocks/*"
+        "*://tube.connect.cafe/*"
+        "*://invidious.zapashcanon.fr/*"
+        "*://invidiou.site/*"
+        "*://vid.mint.lgbt/*"
+        "*://invidious.site/*"
+        "*://yewtu.be/*"
+        "*://invidious.tube/*"
+        "*://invidious.silkky.cloud/*"
+        "*://invidious.himiko.cloud/*"
+        "*://inv.skyn3t.in/*"
+        "*://tube.incognet.io/*"
+        "*://invidious.tinfoil-hat.net/*"
+        "*://invidious.namazso.eu/*"
+        "*://vid.puffyan.us/*"
+        "*://dev.viewtube.io/*"
+        "*://invidious.048596.xyz/*"
+        "*://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion/*"
+        "*://qklhadlycap4cnod.onion/*"
+        "*://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion/*"
+        "*://w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion/*"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "rikaichamp" = buildFirefoxXpiAddon {
+    pname = "rikaichamp";
+    version = "1.15.1";
+    addonId = "{59812185-ea92-4cca-8ab7-cfcacee81281}";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4162143/10ten_ja_reader-1.15.1.xpi";
+    sha256 = "cf638be78da479ccd54fe6ace7990a5ba7757562ec48b2a177e24c86d2ee235c";
+    meta = with lib; {
+      homepage = "https://github.com/birchill/10ten-ja-reader/";
+      description = "Quickly translate Japanese by hovering over words. Formerly released as Rikaichamp.";
+      license = licenses.gpl3;
+      mozPermissions = [
+        "alarms"
+        "clipboardWrite"
+        "contextMenus"
+        "storage"
+        "unlimitedStorage"
+        "http://*/*"
+        "https://*/*"
+        "file:///*"
+        "https://docs.google.com/*"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "ublock-origin" = buildFirefoxXpiAddon {
+    pname = "ublock-origin";
+    version = "1.54.0";
+    addonId = "uBlock0@raymondhill.net";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4198829/ublock_origin-1.54.0.xpi";
+    sha256 = "9797160908191710ff0858536ba6dc29ecad9923c30b2ad6d3e5e371d759e44d";
+    meta = with lib; {
+      homepage = "https://github.com/gorhill/uBlock#ublock-origin";
+      description = "Finally, an efficient wide-spectrum content blocker. Easy on CPU and memory.";
+      license = licenses.gpl3;
+      mozPermissions = [
+        "dns"
+        "menus"
+        "privacy"
+        "storage"
+        "tabs"
+        "unlimitedStorage"
+        "webNavigation"
+        "webRequest"
+        "webRequestBlocking"
+        "<all_urls>"
+        "http://*/*"
+        "https://*/*"
+        "file://*/*"
+        "https://easylist.to/*"
+        "https://*.fanboy.co.nz/*"
+        "https://filterlists.com/*"
+        "https://forums.lanik.us/*"
+        "https://github.com/*"
+        "https://*.github.io/*"
+        "https://*.letsblock.it/*"
+        "https://github.com/uBlockOrigin/*"
+        "https://ublockorigin.github.io/*"
+        "https://*.reddit.com/r/uBlockOrigin/*"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "user-agent-switcher" = buildFirefoxXpiAddon {
+    pname = "user-agent-switcher";
+    version = "0.5.0";
+    addonId = "{a6c4a591-f1b2-4f03-b3ff-767e5bedf4e7}";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4098688/user_agent_string_switcher-0.5.0.xpi";
+    sha256 = "9dc8da3c8c46d4f04d12fd789c63501fa6a2f502f859b286939a090db63eae33";
+    meta = with lib; {
+      homepage = "http://add0n.com/useragent-switcher.html";
+      description = "Spoof websites trying to gather information about your web navigation—like your browser type and operating system—to deliver distinct content you may not want.";
+      license = licenses.mpl20;
+      mozPermissions = [
+        "storage"
+        "<all_urls>"
+        "webNavigation"
+        "webRequest"
+        "webRequestBlocking"
+        "contextMenus"
+        "*://*/*"
+      ];
+      platforms = platforms.all;
+    };
+  };
+  "violentmonkey" = buildFirefoxXpiAddon {
+    pname = "violentmonkey";
+    version = "2.16.0";
+    addonId = "{aecec67f-0d10-4fa7-b7c7-609a2db280cf}";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4185752/violentmonkey-2.16.0.xpi";
+    sha256 = "cd1529f42c4ee591e86d55ea382c8be523236b866ad2c06088152450f682da9c";
+    meta = with lib; {
+      homepage = "https://violentmonkey.github.io/";
+      description = "Userscript support for browsers, open source.";
+      license = licenses.mit;
+      mozPermissions = [
+        "tabs"
+        "<all_urls>"
+        "webRequest"
+        "webRequestBlocking"
+        "notifications"
+        "storage"
+        "unlimitedStorage"
+        "clipboardWrite"
+        "contextMenus"
+        "cookies"
+      ];
+      platforms = platforms.all;
+    };
+  };
+}
diff --git a/modules/nixos/firefox/default.nix b/modules/nixos/firefox/default.nix
index 041752d..a5d5c89 100644
--- a/modules/nixos/firefox/default.nix
+++ b/modules/nixos/firefox/default.nix
@@ -73,20 +73,56 @@ in {
 
           userContent = mkCssWithRoot ./userContent.css;
 
-          extensions = with pkgs.nur.repos.rycee.firefox-addons;
-            [
-              bitwarden
-              consent-o-matic
-              darkreader
-              furiganaize
-              localcdn
-              no-pdf-download
-              noscript
-              privacy-redirect
-              ublock-origin
-              violentmonkey
-            ]
-            ++ optional config.nixfiles.modules.ipfs.enable ipfs-companion;
+          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;
+              [
+                bitwarden
+                canvasblocker
+                consent-o-matic
+                darkreader
+                dont-track-me-google
+                furiganaize
+                languagetool
+                localcdn
+                no-pdf-download
+                noscript
+                privacy-redirect
+                rikaichamp
+                ublock-origin
+                user-agent-switcher
+                violentmonkey
+              ]
+              ++ optional config.nixfiles.modules.ipfs.enable ipfs-companion;
 
           search = {
             force = true;

Consider giving Nix/NixOS a try! <3