about summary refs log tree commit diff stats
path: root/home-manager/soispha/config/firefox
diff options
context:
space:
mode:
Diffstat (limited to 'home-manager/soispha/config/firefox')
-rw-r--r--home-manager/soispha/config/firefox/config/bookmarks/default.nix26
-rw-r--r--home-manager/soispha/config/firefox/config/chrome/userChrome.css41
-rw-r--r--home-manager/soispha/config/firefox/config/extensions/extensions.json51
-rw-r--r--home-manager/soispha/config/firefox/config/prefs/default.nix23
-rw-r--r--home-manager/soispha/config/firefox/config/prefs/override.js191
-rw-r--r--home-manager/soispha/config/firefox/config/search/engines/default.nix59
-rw-r--r--home-manager/soispha/config/firefox/default.nix65
-rw-r--r--home-manager/soispha/config/firefox/functions/bookmarks/default.nix49
-rw-r--r--home-manager/soispha/config/firefox/functions/extensions/default.nix25
-rw-r--r--home-manager/soispha/config/firefox/functions/extensions/video-pauser.nix30
-rwxr-xr-xhome-manager/soispha/config/firefox/scripts/unzip_mozlz4.py43
-rwxr-xr-xhome-manager/soispha/config/firefox/scripts/update_extensions22
12 files changed, 625 insertions, 0 deletions
diff --git a/home-manager/soispha/config/firefox/config/bookmarks/default.nix b/home-manager/soispha/config/firefox/config/bookmarks/default.nix
new file mode 100644
index 00000000..4de83ac9
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/bookmarks/default.nix
@@ -0,0 +1,26 @@
+[
+  {
+    name = "Feed - Piped";
+    url = "https://piped.video/feed";
+  }
+
+  {
+    name = "DeepL Translate";
+    url = "https://www.deepl.com/translator";
+  }
+
+  {
+    name = "HM Options";
+    url = "https://mipmip.github.io/home-manager-option-search/";
+  }
+
+  {
+    name = "Nix lib";
+    url = "https://teu5us.github.io/nix-lib.html";
+  }
+
+  {
+    name = "Nixpkgs manual";
+    url = "https://ryantm.github.io/nixpkgs/";
+  }
+]
diff --git a/home-manager/soispha/config/firefox/config/chrome/userChrome.css b/home-manager/soispha/config/firefox/config/chrome/userChrome.css
new file mode 100644
index 00000000..0b3aff77
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/chrome/userChrome.css
@@ -0,0 +1,41 @@
+/* thickness of tab when you have too many open tabs */
+.tabbrowser-tab:not([pinned="true"]) {
+  min-width: 10px !important;
+  min-height: 10px !important;
+}
+
+/* tab height
+#TabsToolbar .tabbrowser-tabs {
+min-height: 10px !important;
+}
+*/
+
+/*
+.tabbrowser-tab {min-width: 016px !important;}
+.tabbrowser-tab {clip-width: 016px !important;}
+*/
+
+/* the + button that opens new tabs */
+#TabsToolbar .tabs-newtab-button {
+  margin-left: 10px !important;
+  height: Auto !important;
+}
+
+#main-window[privatebrowsingmode="temporary"] #navigator-toolbox {
+  background-color: #c40944 !important;
+}
+
+/* close button inside a tab */
+.tab-close-button * {
+  width: 10px !important;
+  height: 10px !important;
+}
+
+/* bookmark toolbar */
+#personal-bookmarks .bookmark-item > .toolbarbutton-text {
+  font-size: 10pt !important;
+}
+#personal-bookmarks .bookmark-item > .toolbarbutton-icon {
+  height: 12px !important;
+  width: 12px !important;
+}
diff --git a/home-manager/soispha/config/firefox/config/extensions/extensions.json b/home-manager/soispha/config/firefox/config/extensions/extensions.json
new file mode 100644
index 00000000..735ef932
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/extensions/extensions.json
@@ -0,0 +1,51 @@
+{
+  "darkreader": {
+    "addonId": "addon@darkreader.org",
+    "pname": "darkreader",
+    "sha256": "sha256:c09ed43a96dccab1de3445aac263de0569e3333da330d645094e3f938f13b30e",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4128489/darkreader-4.9.64.xpi",
+    "version": "4.9.64"
+  },
+  "keepassxc-browser": {
+    "addonId": "keepassxc-browser@keepassxc.org",
+    "pname": "keepassxc-browser",
+    "sha256": "sha256:deb1c3c29fabe90dd811536d434d64c200caab9a9f7febc3428aa170eefec5f2",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4134768/keepassxc_browser-1.8.7.xpi",
+    "version": "1.8.7"
+  },
+  "libredirect": {
+    "addonId": "7esoorv3@alefvanoon.anonaddy.me",
+    "pname": "libredirect",
+    "sha256": "sha256:564e56e1ccccf2f445b6cb9485c602609589a23052d2a53ab491cbce51c6b42f",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4144580/libredirect-2.7.1.xpi",
+    "version": "2.7.1"
+  },
+  "simple-tab-groups": {
+    "addonId": "simple-tab-groups@drive4ik",
+    "pname": "simple-tab-groups",
+    "sha256": "sha256:b56f30cea753a9c4d1c0e078c0e5e635f1885ea7e40305cee59b9e145fad0a6c",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4103800/simple_tab_groups-5.2.xpi",
+    "version": "5.2"
+  },
+  "tridactyl-vim": {
+    "addonId": "tridactyl.vim@cmcaine.co.uk",
+    "pname": "tridactyl-vim",
+    "sha256": "sha256:08b7af97bef05300ab3ac3ad721322ff00505631233482568fc4489c16d51b71",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4036604/tridactyl_vim-1.23.0.xpi",
+    "version": "1.23.0"
+  },
+  "ublock-origin": {
+    "addonId": "uBlock0@raymondhill.net",
+    "pname": "ublock-origin",
+    "sha256": "sha256:8b73468bc233a11dd2895219466381783d19123857dd0b6fd16a01820fca4834",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4141256/ublock_origin-1.51.0.xpi",
+    "version": "1.51.0"
+  },
+  "video-pauser": {
+    "addonId": "video-pauser@addons.vhack.eu",
+    "pname": "video-pauser",
+    "sha256": "sha256:da02e29f1d50d3a6db8a28bb7972afaeaa788bb8d38a2e9ebbfcd73d65d84841",
+    "url": "https://addons.mozilla.org/firefox/downloads/file/4098103/video_pauser-0.1.0.xpi",
+    "version": "0.1.0"
+  }
+}
diff --git a/home-manager/soispha/config/firefox/config/prefs/default.nix b/home-manager/soispha/config/firefox/config/prefs/default.nix
new file mode 100644
index 00000000..e0e72cf9
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/prefs/default.nix
@@ -0,0 +1,23 @@
+{
+  pkgs,
+  config,
+  user_js,
+  lib,
+  ...
+}: let
+  bookmarks = import ../bookmarks;
+  firefoxBookmarksFile = (import ../../functions/bookmarks) {inherit lib pkgs;};
+  user_js_override = pkgs.writeText "user.override.js" (builtins.readFile ./override.js);
+in
+  pkgs.runCommand "user.js" {} ''
+    mkdir $out;
+    cat "${user_js}/user.js" > $out/user.js;
+    cat "${user_js_override}" >> $out/user.js;
+
+    cat << EOF >> $out/user.js;
+    // My bookmarks
+    user_pref("browser.bookmarks.file", "${toString (firefoxBookmarksFile bookmarks)}");
+    user_pref("browser.startup.homepage", "file:///home/dt/home.html"); // 0103 // TODO add this from a flake
+    user_pref("browser.download.dir", "${config.home.homeDirectory}/media/downloads");
+    EOF
+  ''
diff --git a/home-manager/soispha/config/firefox/config/prefs/override.js b/home-manager/soispha/config/firefox/config/prefs/override.js
new file mode 100644
index 00000000..7e63e532
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/prefs/override.js
@@ -0,0 +1,191 @@
+/*
+  0100: STARTUP
+  0200: GEOLOCATION / LANGUAGE / LOCALE
+  0300: QUIETER FOX
+  0400: SAFE BROWSING
+  0600: BLOCK IMPLICIT OUTBOUND
+  0700: DNS / DoH / PROXY / SOCKS / IPv6
+  0800: LOCATION BAR / SEARCH BAR / SUGGESTIONS / HISTORY / FORMS
+  0900: PASSWORDS
+  1000: DISK AVOIDANCE
+  1200: HTTPS (SSL/TLS / OCSP / CERTS / HPKP)
+  1400: FONTS
+  1600: HEADERS / REFERERS
+  1700: CONTAINERS
+  2000: PLUGINS / MEDIA / WEBRTC
+  2400: DOM (DOCUMENT OBJECT MODEL)
+  2600: MISCELLANEOUS
+  2700: ETP (ENHANCED TRACKING PROTECTION)
+  2800: SHUTDOWN & SANITIZING
+  4500: RFP (RESIST FINGERPRINTING)
+  5000: OPTIONAL OPSEC
+  5500: OPTIONAL HARDENING
+  6000: DON'T TOUCH
+  7000: DON'T BOTHER
+  8000: DON'T BOTHER: FINGERPRINTING
+  9000: NON-PROJECT RELATED
+  9999: DEPRECATED / REMOVED / LEGACY / RENAMED
+*/
+
+
+// restore session
+user_pref("browser.startup.page", 3); // 0102
+
+user_pref("browser.newtabpage.enabled", true); // 0104
+
+// disable the geoservice, TODO don't know if I want this
+//user_pref("geo.provider.use_geoclue", false); // 0202
+
+// TODO is this something useful?
+user_pref("datareporting.policy.dataSubmissionEnabled", true); // 0330
+
+// enable health reports
+user_pref("datareporting.healthreport.uploadEnabled", true); // 0331
+
+// Do I want to opt-out?
+user_pref("toolkit.telemetry.coverage.opt-out", false); // 0333
+
+// enables studies
+user_pref("app.shield.optoutstudies.enabled", true); // 0340
+
+// I guess that browsing protection is useful
+user_pref("browser.safebrowsing.downloads.remote.enabled", true); // 0403
+
+// TODO does this (-> set to false) make things slower?
+user_pref("network.prefetch-next", true); // 0601
+
+// enable ipv6 because the rest of the system uses it
+user_pref("network.dns.disableIPv6", false); // 0701
+
+// TRR only
+user_pref("network.trr.mode", 3); // 0710
+
+// I trust my search engine
+user_pref("keyword.enabled", true); // 801
+user_pref("browser.search.suggest.enabled", true); // 0804
+user_pref("browser.urlbar.suggest.searches", true); // 0804
+// TODO no idea what this does, enabling it
+user_pref("browser.urlbar.showSearchTerms.enabled", true); // 9004
+
+// prefetch urls, if the get auto completed
+user_pref("browser.urlbar.speculativeConnect.enabled", true); // 0805
+
+// Disable autoScrolling (clicking with the mouse wheel)
+user_pref("general.autoScroll", false);
+
+// add new tabs after the current one
+user_pref("browser.tabs.insertAfterCurrent", true);
+
+// TODO I might want to enable this
+//user_pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); // 0807
+
+// TODO enable form and search history?
+//user_pref("browser.formfill.enable", false); // 0810
+
+// disk cache should help performance
+user_pref("browser.cache.disk.enable", true); // 1001
+
+// store extra session data (form content, cookies and POST data) 0: everywhere
+user_pref("browser.sessionstore.privacy_level", 0); // 1003
+
+// Disable unsafe passive content (images) on https sites
+user_pref("security.mixed_content.block_display_content", true); // 1241
+
+// Disable the eme banner
+user_pref("browser.eme.ui.enabled", false); // 2022
+
+// Don't delete my precious temp files
+user_pref("browser.helperApps.deleteTempFileOnExit", false); // 2603
+
+// Download to the download dir
+user_pref("browser.download.useDownloadDir", true); // 2651
+
+// Open the download panel
+user_pref("browser.download.alwaysOpenPanel", true); // 2652
+
+// Block after custom ruleset
+user_pref("browser.contentblocking.category", "custom"); // 2701
+
+// set the custom settings // 7016
+user_pref("network.cookie.cookieBehavior", 1);
+user_pref("network.http.referer.disallowCrossSiteRelaxingDefault", true);
+user_pref("network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation", true);
+user_pref("privacy.partition.network_state.ocsp_cache", true);
+user_pref("privacy.query_stripping.enabled", true);
+user_pref("privacy.trackingprotection.enabled", true);
+user_pref("privacy.trackingprotection.socialtracking.enabled", true);
+user_pref("privacy.trackingprotection.cryptomining.enabled", true);
+user_pref("privacy.trackingprotection.fingerprinting.enabled", true);
+
+
+// I might want to change that, when it hinders session restore
+//user_pref("privacy.partition.always_partition_third_party_non_cookie_storage.exempt_sessionstorage", false); // 2720
+
+// I like my history very much!
+user_pref("privacy.sanitize.sanitizeOnShutdown", false); // 2810
+
+// The downsides (light theme + potential breakages):
+//user_pref("privacy.resistFingerprinting", true); // 4501
+user_pref("privacy.resistFingerprinting.letterboxing", false); // 4504
+
+// I would like to keep my gl, even in the web
+user_pref("webgl.disabled", false); // 4520
+
+// I like my service workers and am using a service using them.
+user_pref("dom.serviceWorkers.enabled", true); // 7017
+
+// I've got a password manager already
+user_pref("signon.rememberSignons", false); // 5003
+
+// Do not track header
+user_pref("privacy.donottrackheader.enabled", true); // 7015
+
+// Allow my custom css
+user_pref("toolkit.legacyUserProfileCustomizations.stylesheets", true);
+
+// might improve performance TODO
+user_pref("gfx.webrender.all", true);
+
+// disable updates (pretty pointless with nix)
+user_pref("extensions.update.autoUpdateDefault", false);
+user_pref("extensions.update.enabled", false);
+user_pref("app.update.channel", "default");
+
+user_pref("browser.ctrlTab.recentlyUsedOrder", false);
+
+user_pref("browser.download.useDownloadDir", true);
+user_pref("browser.download.folderList", 2); # TODO
+user_pref("browser.download.viewableInternally.typeWasRegistered.svg", true);
+user_pref("browser.download.viewableInternally.typeWasRegistered.webp", true);
+user_pref("browser.download.viewableInternally.typeWasRegistered.xml", true);
+
+// TODO what does this do?
+user_pref("browser.search.widget.inNavBar", true);
+
+user_pref("browser.shell.checkDefaultBrowser", false);
+user_pref("browser.tabs.loadInBackground", true);
+user_pref("browser.urlbar.placeholderName", "Brave");
+
+// Set the tabs and bookmarks
+user_pref("browser.tabs.inTitlebar", 1);
+user_pref("browser.toolbars.bookmarks.visibility", "always");
+user_pref("browser.places.importBookmarksHTML", true);
+
+// Theme
+user_pref("extensions.activeThemeID", "firefox-alpenglow@mozilla.org");
+user_pref("extensions.extensions.activeThemeID", "firefox-alpenglow@mozilla.org");
+
+// highlight all entries when searching
+user_pref("findbar.highlightAll", true);
+
+// TODO
+//user_pref("extensions.webcompat.enable_picture_in_picture_overrides", true);
+//user_pref("extensions.webcompat.enable_shims", true);
+//user_pref("extensions.webcompat.perform_injections", true);
+//user_pref("extensions.webcompat.perform_ua_overrides", true);
+
+// onlykey / copied from a yubikey config
+//user_pref("security.webauth.u2f", true);
+//user_pref("security.webauth.webauthn", true);
+//user_pref("security.webauth.webauthn_enable_softtoken", true);
+//user_pref("security.webauth.webauthn_enable_usbtoken", true);
diff --git a/home-manager/soispha/config/firefox/config/search/engines/default.nix b/home-manager/soispha/config/firefox/config/search/engines/default.nix
new file mode 100644
index 00000000..286d7247
--- /dev/null
+++ b/home-manager/soispha/config/firefox/config/search/engines/default.nix
@@ -0,0 +1,59 @@
+{pkgs, ...}: {
+  "Brave Search" = {
+    urls = [{template = "https://search.brave.com/search?q={searchTerms}";}];
+    IconUpdateURL = "https://raw.githubusercontent.com/brave/brave-core/master/components/brave_welcome_ui/components/images/lion_logo.svg";
+    updateInterval = 24; # every day
+    definedAliases = ["@bs"];
+  };
+
+  # NIX
+  "Nix Packages" = {
+    urls = [{template = "https://search.nixos.org/packages?type=packages&query={searchTerms}";}];
+    icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+    definedAliases = ["@np"];
+  };
+  "Nix Options" = {
+    urls = [{template = "https://search.nixos.org/options?type=options&query={searchTerms}";}];
+    icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+    definedAliases = ["@no"];
+  };
+  "NixOS Wiki" = {
+    urls = [{template = "https://nixos.wiki/index.php?search={searchTerms}";}];
+    icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+    definedAliases = ["@nw"];
+  };
+
+  "Arch Wiki" = {
+    urls = [{template = "https://wiki.archlinux.org/index.php?search={searchTerms}";}];
+    iconUpdateURL = "https://upload.wikimedia.org/wikipedia/commons/a/a5/Archlinux-icon-crystal-64.svg";
+    updateInterval = 24;
+    definedAliases = ["@aw"];
+  };
+
+  # RUST
+  "Rust std" = {
+    urls = [{template = "https://doc.rust-lang.org/std/?search={searchTerms}";}];
+    iconUpdateURL = "https://rustacean.net/assets/rustacean-orig-noshadow.svg";
+    updateInterval = 24;
+    definedAliases = ["@rs"];
+  };
+
+  "Google Scholar" = {
+    urls = [{template = "https://scholar.google.com/scholar?hl=en&q={searchTerms}";}];
+    iconUpdateURL = "https://scholar.google.com/favicon.ico";
+    updateInterval = 24;
+    definedAliases = ["@gs"];
+  };
+  "Wikipedia" = {
+    urls = [{template = "https://en.wikipedia.org/wiki/{searchTerms}";}];
+    iconUpdateURL = "https://upload.wikimedia.org/wikipedia/en/8/80/Wikipedia-logo-v2.svg";
+    updateInterval = 24;
+    definedAliases = ["@wp"];
+  };
+
+  "Wikipedia (en)".metaData.hidden = true;
+  "DuckDuckGo".metaData.hidden = true;
+  "Bing".metaData.hidden = true;
+  "Google".metaData.hidden = true;
+  "Amazon.de".metaData.hidden = true;
+}
diff --git a/home-manager/soispha/config/firefox/default.nix b/home-manager/soispha/config/firefox/default.nix
new file mode 100644
index 00000000..3c792045
--- /dev/null
+++ b/home-manager/soispha/config/firefox/default.nix
@@ -0,0 +1,65 @@
+{
+  config,
+  pkgs,
+  lib,
+  user_js,
+  video_pause,
+  ...
+}: let
+  userChrome = builtins.readFile ./config/chrome/userChrome.css;
+
+  user_js_nix = (import ./config/prefs) {inherit pkgs lib config user_js;};
+
+  extensions = builtins.map buildFirefoxXpiAddon (
+    lib.attrValues (
+      lib.importJSON ./config/extensions/extensions.json
+    )
+  );
+  engines = (import ./config/search/engines) {inherit pkgs;};
+
+  # source: https://gitlab.com/rycee/nur-expressions/-/blob/master/pkgs/firefox-addons/default.nix
+  buildFirefoxXpiAddon = (import ./functions/extensions) {inherit pkgs;};
+
+  video-pauser = (import ./functions/extensions/video-pauser.nix) {inherit pkgs video_pause;};
+in {
+  home.sessionVariables = {
+    # improve touch input & make scrolling smother
+    MOZ_USE_XINPUT2 = "1";
+    # improve wayland support
+    MOZ_ENABLE_WAYLAND = 1;
+  };
+  xdg.mimeApps = {
+    enable = true;
+    defaultApplications = {
+      "text/html" = ["firefox.desktop"];
+      "x-scheme-handler/http" = ["firefox.desktop"];
+      "x-scheme-handler/https" = ["firefox.desktop"];
+      "x-scheme-handler/about" = ["firefox.desktop"];
+      "x-scheme-handler/unknown" = ["firefox.desktop"];
+    };
+  };
+  programs.firefox = {
+    enable = true;
+    package = pkgs.firefox-wayland.override {
+      extraNativeMessagingHosts = [video-pauser];
+    };
+    profiles."default" = {
+      inherit extensions;
+      isDefault = true;
+      id = 0;
+      name = "default";
+
+      inherit userChrome;
+
+      search = {
+        default = "Brave Search";
+        force = true;
+
+        inherit engines;
+      };
+
+      bookmarks = [];
+      extraConfig = builtins.readFile "${user_js_nix}/user.js";
+    };
+  };
+}
diff --git a/home-manager/soispha/config/firefox/functions/bookmarks/default.nix b/home-manager/soispha/config/firefox/functions/bookmarks/default.nix
new file mode 100644
index 00000000..d1d89dd2
--- /dev/null
+++ b/home-manager/soispha/config/firefox/functions/bookmarks/default.nix
@@ -0,0 +1,49 @@
+{
+  lib,
+  pkgs,
+}: bookmarks: let
+  indent = level:
+    lib.concatStringsSep "" (map (lib.const "  ") (lib.range 1 level));
+
+  bookmarkToHTML = indentLevel: bookmark: ''
+    ${indent indentLevel}<DT><A HREF="${
+      lib.escapeXML bookmark.url
+    }" ADD_DATE="0" LAST_MODIFIED="0">${lib.escapeXML bookmark.name}</A>'';
+
+  directoryToHTML = indentLevel: directory: ''
+    ${indent indentLevel}<DT>${
+      if directory.toolbar
+      then ''<H3 PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar''
+      else "<H3>${lib.escapeXML directory.name}"
+    }</H3>
+    ${indent indentLevel}<DL><p>
+    ${allItemsToHTML (indentLevel + 1) directory.bookmarks}
+    ${indent indentLevel}</p></DL>'';
+
+  itemToHTMLOrRecurse = indentLevel: item:
+    if item ? "url"
+    then bookmarkToHTML indentLevel item
+    else directoryToHTML indentLevel item;
+
+  allItemsToHTML = indentLevel: bookmarks:
+    lib.concatStringsSep "\n"
+    (map (itemToHTMLOrRecurse indentLevel) bookmarks);
+
+  bookmarkEntries = allItemsToHTML 1 bookmarks;
+in
+  pkgs.writeText "firefox-bookmarks.html" ''
+    <!DOCTYPE NETSCAPE-Bookmark-file-1>
+    <!-- This is an automatically generated file.
+      It will be read and overwritten.
+      DO NOT EDIT! -->
+    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
+    <TITLE>Bookmarks</TITLE>
+    <H1>Bookmarks Menu</H1>
+
+    <DL><p>
+        <DT><H3 ADD_DATE="0" LAST_MODIFIED="0" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar</H3>
+        <DL><p>
+        ${bookmarkEntries}
+        </DL><p>
+    </p></DL>
+  ''
diff --git a/home-manager/soispha/config/firefox/functions/extensions/default.nix b/home-manager/soispha/config/firefox/functions/extensions/default.nix
new file mode 100644
index 00000000..b84461c7
--- /dev/null
+++ b/home-manager/soispha/config/firefox/functions/extensions/default.nix
@@ -0,0 +1,25 @@
+{pkgs, ...}: {
+  pname,
+  version,
+  addonId,
+  url,
+  sha256,
+  #meta,
+  ...
+}:
+pkgs.stdenv.mkDerivation {
+  name = "${pname}-${version}";
+
+  #inherit meta;
+
+  src = builtins.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"
+  '';
+}
diff --git a/home-manager/soispha/config/firefox/functions/extensions/video-pauser.nix b/home-manager/soispha/config/firefox/functions/extensions/video-pauser.nix
new file mode 100644
index 00000000..c4c5238f
--- /dev/null
+++ b/home-manager/soispha/config/firefox/functions/extensions/video-pauser.nix
@@ -0,0 +1,30 @@
+{
+  pkgs,
+  video_pause,
+  ...
+}:
+pkgs.runCommand "video_pause_native_messaging" {} ''
+  install -d $out/share/
+  cat << EOF > $out/share/video_pauser.json
+  {
+    "name": "video_pauser",
+    "description": "Pause your Videos with a single key stroke!",
+    "path": "${video_pause}/bin/video_pause",
+    "type": "stdio",
+    "allowed_extensions": ["video-pauser@addons.vhack.eu"]
+  }
+  EOF
+
+  nativeMessagingPaths=(
+    /lib/mozilla/native-messaging-hosts
+    /etc/opt/chrome/native-messaging-hosts
+    /etc/chromium/native-messaging-hosts
+    /etc/vivaldi/native-messaging-hosts
+    /lib/librewolf/native-messaging-hosts
+  )
+
+  for manifestDir in "''${nativeMessagingPaths[@]}"; do
+    install -d $out$manifestDir
+    ln -s $out/share/video_pauser.json $out$manifestDir/
+  done
+''
diff --git a/home-manager/soispha/config/firefox/scripts/unzip_mozlz4.py b/home-manager/soispha/config/firefox/scripts/unzip_mozlz4.py
new file mode 100755
index 00000000..311fd214
--- /dev/null
+++ b/home-manager/soispha/config/firefox/scripts/unzip_mozlz4.py
@@ -0,0 +1,43 @@
+#!/usr/bin/python
+# source: https://unix.stackexchange.com/a/497861
+# Command-line tool to decompress mozLz4 files used for example by Firefox to store various kinds of session backup information.
+# Works in both Python 2.7.15 and 3.6.7, as of version 2.1.6 of the LZ4 Python bindings at pypi.org/project/lz4.
+# To use in another script, simply cut and paste the import statement and the mozlz4_to_text() function (lines 8 to 17).
+
+import lz4.block  # pip install lz4 --user
+
+
+def mozlz4_to_text(filepath):
+    # Given the path to a "mozlz4", "jsonlz4", "baklz4" etc. file,
+    # return the uncompressed text.
+    bytestream = open(filepath, "rb")
+    bytestream.read(8)  # skip past the b"mozLz40\0" header
+    valid_bytes = bytestream.read()
+    text = lz4.block.decompress(valid_bytes)
+    return text
+
+
+def main(args):
+  # Given command-line arguments of an input filepath for a ".mozlz4" file
+  # and optionally an output filepath, write the decompressed text to the
+  # output filepath.
+  # Default output filepath is the input filepath minus the last three characters
+  # (e.g. "foo.jsonlz4" becomes "foo.json")
+  filepath_in = args[0]
+  if len(args) < 2:
+    filepath_out = filepath_in[:-3]
+  else:
+    filepath_out = args[1]
+  text = mozlz4_to_text(filepath_in)
+  with open(filepath_out, "wb") as outfile:
+    outfile.write(text)
+  print("Wrote decompressed text to {}".format(filepath_out))
+
+
+if __name__ == "__main__":
+  import sys
+  args = sys.argv[1:]
+  if args and not args[0] in ("--help", "-h"):
+    main(args)
+  else:
+    print("Usage: mozlz4.py <mozlz4 file to read> <location to write>")
diff --git a/home-manager/soispha/config/firefox/scripts/update_extensions b/home-manager/soispha/config/firefox/scripts/update_extensions
new file mode 100755
index 00000000..05f47aad
--- /dev/null
+++ b/home-manager/soispha/config/firefox/scripts/update_extensions
@@ -0,0 +1,22 @@
+#!/bin/sh
+# shellcheck disable=SC2086
+# shellcheck source=/dev/null
+#. ~/.local/lib/shell/lib
+
+tmp=$(mktemp)
+cat << EOF > $tmp
+    darkreader
+    keepassxc-browser
+    simple-tab-groups
+    ublock-origin
+    tridactyl-vim
+    video-pauser
+    libredirect
+EOF
+
+# The bin is provided in the devshell. The cat execution should be unquoted
+generate_extensions $(cat "$tmp") > "$(dirname $0)"/../config/extensions/extensions.json
+
+
+
+rm "$tmp";