about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--configurations/eonwe/default.nix9
-rw-r--r--flake.lock91
-rw-r--r--modules/emacs/default.nix17
-rw-r--r--modules/emacs/doom/config.el8
-rw-r--r--modules/emacs/doom/init.el21
-rw-r--r--modules/emacs/doom/packages.el10
-rw-r--r--modules/firefox/addons.json3
-rw-r--r--modules/firefox/addons.nix62
-rw-r--r--modules/firefox/default.nix1
-rw-r--r--modules/games/steam.nix2
-rw-r--r--modules/ipfs.nix5
-rw-r--r--modules/murmur.nix8
-rw-r--r--overlays.nix56
-rw-r--r--packages/emacsql-sqlite.nix6
-rw-r--r--packages/parinfer-rust.nix29
-rw-r--r--packages/telegram-desktop.patch296
16 files changed, 195 insertions, 429 deletions
diff --git a/configurations/eonwe/default.nix b/configurations/eonwe/default.nix
index a35ad5c..a7505e7 100644
--- a/configurations/eonwe/default.nix
+++ b/configurations/eonwe/default.nix
@@ -24,7 +24,6 @@ with lib;
     beets.enable = true;
     bluetooth.enable = true;
     incus.enable = true;
-    ipfs.enable = true;
     libvirtd.enable = true;
     mpd.enable = true;
     qutebrowser.enable = true;
@@ -32,7 +31,7 @@ with lib;
 
   hm = {
     home.packages = with pkgs; [
-      calibre
+      # calibre # FIXME https://nixpk.gs/pr-tracker.html?pr=349884
       krita
       qolibri
       radeontop
@@ -149,6 +148,12 @@ with lib;
   };
 
   services = {
+    languagetool = {
+      enable = true;
+      port = 8081;
+      allowOrigin = "*";
+    };
+
     smartd = {
       enable = true;
       notifications.mail = {
diff --git a/flake.lock b/flake.lock
index 236aa63..af77467 100644
--- a/flake.lock
+++ b/flake.lock
@@ -230,11 +230,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1727531434,
-        "narHash": "sha256-b+GBgCWd2N6pkiTkRZaMFOPztPO4IVTaclYPrQl2uLk=",
+        "lastModified": 1729281548,
+        "narHash": "sha256-MuojlSnwAJAwfhgmW8ZtZrwm2Sko4fqubCvReqbUzYw=",
         "owner": "nix-community",
         "repo": "disko",
-        "rev": "b709e1cc33fcde71c7db43850a55ebe6449d0959",
+        "rev": "a6a3179ddf396dfc28a078e2f169354d0c137125",
         "type": "github"
       },
       "original": {
@@ -368,11 +368,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1727514110,
-        "narHash": "sha256-0YRcOxJG12VGDFH8iS8pJ0aYQQUAgo/r3ZAL+cSh9nk=",
+        "lastModified": 1729104314,
+        "narHash": "sha256-pZRZsq5oCdJt3upZIU4aslS9XwFJ+/nVtALHIciX/BI=",
         "owner": "cachix",
         "repo": "git-hooks.nix",
-        "rev": "85f7a7177c678de68224af3402ab8ee1bcee25c8",
+        "rev": "3c3e88f0f544d6bb54329832616af7eb971b6be6",
         "type": "github"
       },
       "original": {
@@ -426,11 +426,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1727383923,
-        "narHash": "sha256-4/vacp3CwdGoPf8U4e/N8OsGYtO09WTcQK5FqYfJbKs=",
+        "lastModified": 1729459288,
+        "narHash": "sha256-gBOVJv+q6Mx8jGvwX7cE6J8+sZmi1uxpRVsO7WxvVuQ=",
         "owner": "nix-community",
         "repo": "home-manager",
-        "rev": "ffe2d07e771580a005e675108212597e5b367d2d",
+        "rev": "1e27f213d77fc842603628bcf2df6681d7d08f7e",
         "type": "github"
       },
       "original": {
@@ -442,11 +442,11 @@
     "homelab-svg-assets": {
       "flake": false,
       "locked": {
-        "lastModified": 1726669367,
-        "narHash": "sha256-/dQqkVsvE1kq30LnI233tY6dK32XHnD3PNjKLjd7vvo=",
+        "lastModified": 1729175365,
+        "narHash": "sha256-r43u2HqdhRezqGwo/nbbZhHx5WUmkvAsfoLt8taFKyw=",
         "owner": "loganmarchione",
         "repo": "homelab-svg-assets",
-        "rev": "492c9eabbdce282b14b1e46156d5fdc01c26b36b",
+        "rev": "745e5d9249f2c847d58de5f1fd7ba4de2f63918e",
         "type": "github"
       },
       "original": {
@@ -457,11 +457,11 @@
     },
     "impermanence": {
       "locked": {
-        "lastModified": 1727649413,
-        "narHash": "sha256-FA53of86DjFdeQzRDVtvgWF9o52rWK70VHGx0Y8fElQ=",
+        "lastModified": 1729068498,
+        "narHash": "sha256-C2sGRJl1EmBq0nO98TNd4cbUy20ABSgnHWXLIJQWRFA=",
         "owner": "nix-community",
         "repo": "impermanence",
-        "rev": "d0b38e550039a72aff896ee65b0918e975e6d48e",
+        "rev": "e337457502571b23e449bf42153d7faa10c0a562",
         "type": "github"
       },
       "original": {
@@ -508,11 +508,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1727747697,
-        "narHash": "sha256-bNZ4ykMpxyTLrPsctiDwe5d69vafvIbNTbzbWfd2CH4=",
+        "lastModified": 1729475340,
+        "narHash": "sha256-cdOVgmC6/ZNUu4ZGCwxy/vTaMJ6WaxBa9EZYcCCzxPA=",
         "owner": "Infinidoge",
         "repo": "nix-minecraft",
-        "rev": "30af58cedcc444da772a73286e16287f94a9fef1",
+        "rev": "c5905ddb8c23d6f549e47cec51038c603093d49f",
         "type": "github"
       },
       "original": {
@@ -528,11 +528,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1727658919,
-        "narHash": "sha256-YAePt2GldkkRJ08LvZNHcuS6shIVStj+K+1DZN3gbnM=",
+        "lastModified": 1729394935,
+        "narHash": "sha256-2ntUG+NJKdfhlrh/tF+jOU0fOesO7lm5ZZVSYitsvH8=",
         "owner": "nix-community",
         "repo": "nix-index-database",
-        "rev": "f9fdf8285690a351e8998f1e703ebdf9cdf51dee",
+        "rev": "04f8a11f247ba00263b060fbcdc95484fd046104",
         "type": "github"
       },
       "original": {
@@ -570,11 +570,11 @@
     },
     "nixos-hardware": {
       "locked": {
-        "lastModified": 1727665282,
-        "narHash": "sha256-oKtfbQB1MBypqIyzkC8QCQcVGOa1soaXaGgcBIoh14o=",
+        "lastModified": 1729455275,
+        "narHash": "sha256-THqzn/7um3oMHUEGXyq+1CJQE7EogwR3HjLMNOlhFBE=",
         "owner": "NixOS",
         "repo": "nixos-hardware",
-        "rev": "11c43c830e533dad1be527ecce379fcf994fbbb5",
+        "rev": "9fcf30fccf8435f6390efec4a4d38e69c2268a36",
         "type": "github"
       },
       "original": {
@@ -585,11 +585,11 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1727716680,
-        "narHash": "sha256-uMVkVHL4r3QmlZ1JM+UoJwxqa46cgHnIfqGzVlw5ca4=",
+        "lastModified": 1729265718,
+        "narHash": "sha256-4HQI+6LsO3kpWTYuVGIzhJs1cetFcwT7quWCk/6rqeo=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "b5b22b42c0d10c7d2463e90a546c394711e3a724",
+        "rev": "ccc0c2126893dd20963580b6478d1a10a4512185",
         "type": "github"
       },
       "original": {
@@ -632,11 +632,11 @@
     },
     "nixpkgs-master": {
       "locked": {
-        "lastModified": 1727796460,
-        "narHash": "sha256-ZERpx+GPuZ7Cg54iDNxhw/9BYmqpmzgMitvU27R5rzs=",
+        "lastModified": 1729497599,
+        "narHash": "sha256-VIL7URnjTkpYc7FQ0QJhV7Q2n2/hi3AgiFr5Ul1/glo=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "8348471506d3f8abad30e848fe113cb4489ba2e9",
+        "rev": "f6bdbd1605b17cfbd8af51ba68db779e130d54b3",
         "type": "github"
       },
       "original": {
@@ -648,11 +648,11 @@
     },
     "nixpkgs-stable": {
       "locked": {
-        "lastModified": 1727793663,
-        "narHash": "sha256-PIwGt3UeeAtiwuikQYlqxXGuOdlCHFzxyrw3FIWJ1BY=",
+        "lastModified": 1729489324,
+        "narHash": "sha256-xAa7WPbtymWsI/15oC2zUBjkpHYCZ+gFMiav2lrlRH8=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "3d5d583ab403703be5b0aab368ba8d8ccc481000",
+        "rev": "e2589a4d25269cfa6a22022d01cd740d8abaa82b",
         "type": "github"
       },
       "original": {
@@ -731,11 +731,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1727723127,
-        "narHash": "sha256-1Wy+v5xPsAb8GvHtU4egpIo8Rhmw1faAbGaIDduVG9I=",
+        "lastModified": 1729472124,
+        "narHash": "sha256-l1uqRV0XPDrCVXb8irXSnIHOdzmss78KiUqB6WkhDMw=",
         "owner": "nix-community",
         "repo": "srvos",
-        "rev": "3368388007de976ceb40f3e19f31ffd8667c36a7",
+        "rev": "5607765a4ac3a567cfe6bf4efb3c352193604f57",
         "type": "github"
       },
       "original": {
@@ -767,11 +767,11 @@
         "tinted-tmux": "tinted-tmux"
       },
       "locked": {
-        "lastModified": 1727723275,
-        "narHash": "sha256-k4HrG8TJQ0RqDS1tlDz71kvWFBNQ7qZI9T5Z0qLR85Y=",
+        "lastModified": 1729380793,
+        "narHash": "sha256-TV6NYBUqTHI9t5fqNu4Qyr4BZUD2yGxAn3E+d5/mqaI=",
         "owner": "danth",
         "repo": "stylix",
-        "rev": "e7e97059776da7e34b739415a7bc8f80f606b803",
+        "rev": "fb9399b7e2c855f42dae76a363bab28d4f24aa8d",
         "type": "github"
       },
       "original": {
@@ -859,16 +859,17 @@
     "tinted-kitty": {
       "flake": false,
       "locked": {
-        "lastModified": 1665001328,
-        "narHash": "sha256-aRaizTYPpuWEcvoYE9U+YRX+Wsc8+iG0guQJbvxEdJY=",
+        "lastModified": 1716423189,
+        "narHash": "sha256-2xF3sH7UIwegn+2gKzMpFi3pk5DlIlM18+vj17Uf82U=",
         "owner": "tinted-theming",
         "repo": "tinted-kitty",
-        "rev": "06bb401fa9a0ffb84365905ffbb959ae5bf40805",
+        "rev": "eb39e141db14baef052893285df9f266df041ff8",
         "type": "github"
       },
       "original": {
         "owner": "tinted-theming",
         "repo": "tinted-kitty",
+        "rev": "eb39e141db14baef052893285df9f266df041ff8",
         "type": "github"
       }
     },
@@ -901,11 +902,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1727747703,
-        "narHash": "sha256-YbKSShfCRNC4edx39kagpdpMYgu21L4f+sMStDI5rjc=",
+        "lastModified": 1729475384,
+        "narHash": "sha256-x7ODafOKfxXMdgs/wPXVpmf04vOr7cJLEDWYT/TBjY0=",
         "owner": "nix-community",
         "repo": "nix-vscode-extensions",
-        "rev": "2e8837496c0f58c4342ed84d309a8bc57677bc41",
+        "rev": "77a421d6c7ea09381c7e33d90c3017c9727dfbc3",
         "type": "github"
       },
       "original": {
diff --git a/modules/emacs/default.nix b/modules/emacs/default.nix
index a182d4c..455f710 100644
--- a/modules/emacs/default.nix
+++ b/modules/emacs/default.nix
@@ -61,11 +61,11 @@ in
                 if [[ -x "$EMACSDIR/bin/doom" ]]; then
                   if [[ ! -d "$EMACSDIR/.local" ]]; then
                     PATH="''${PATH:-/bin}:${emacs.package}/bin:${git.package}/bin" \
-                      "$EMACSDIR/bin/doom" install --force --verbose
+                      "$EMACSDIR/bin/doom" install --aot --force --verbose
                   fi
 
                   PATH="''${PATH:-/bin:}:${emacs.package}/bin:${git.package}/bin" \
-                    "$EMACSDIR/bin/doom" sync -e --gc --force --verbose
+                    "$EMACSDIR/bin/doom" sync -e --gc --aot --force --verbose
                 fi
               '';
             }
@@ -166,17 +166,24 @@ in
                     (setq exec-path (append exec-path '(${concatMapStringsSep " " (x: ''"${x}/bin"'') extraBins})))
                     (setenv "PATH" (concat (getenv "PATH") ":${concatMapStringsSep ":" (x: "${x}/bin") extraBins}"))
 
+                    (appendq! auth-sources '(("${config.secrets.authinfo.path}")))
+
                     ;; HACK Explicitly load specific Emacs packages from Nixpkgs.
                     ;; For some reason providing them as "extraPackages" doesn't
                     ;; work.
                     (add-to-list 'load-path "${pkgs.mu.mu4e}/share/emacs/site-lisp/mu4e")
                     (add-to-list 'load-path "${pkgs.emacsPackages.vterm}/share/emacs/site-lisp/elpa/vterm-${pkgs.emacsPackages.vterm.version}")
-
-                    (appendq! auth-sources '(("${config.secrets.authinfo.path}")))
+                    (load "${
+                      pkgs.fetchurl {
+                        name = "tvl.el";
+                        url = "https://code.tvl.fyi/plain/tools/emacs-pkgs/tvl/tvl.el?id=84a82f6f41b422f7f76e44e3705ee509b6c6eaf6";
+                        hash = "sha256-vJsV7w4aMV9Y9zbXLHMIR53xAsXdUVBIXrxUTjdvty0=";
+                      }
+                    }")
 
                     ;; :input japanese
                     (setq migemo-dictionary "${pkgs.cmigemo}/share/migemo/utf-8/migemo-dict"
-                          skk-large-jisyo "${pkgs.skk-dicts}/share/SKK-JISYO.L")
+                          skk-large-jisyo "${pkgs.skkDictionaries.l}/share/skk/SKK-JISYO.L")
 
                     ;; :editor parinfer
                     (setq parinfer-rust-library "${pkgs.parinfer-rust-emacs}/lib/libparinfer_rust.so")
diff --git a/modules/emacs/doom/config.el b/modules/emacs/doom/config.el
index fe3b5b4..85fe4a9 100644
--- a/modules/emacs/doom/config.el
+++ b/modules/emacs/doom/config.el
@@ -33,12 +33,6 @@
        doom-modeline-height 30)
 
 ;;
-;;; TVL
-;;
-
-(use-package! tvl)
-
-;;
 ;;; Editorconfig
 ;;
 
@@ -87,7 +81,7 @@
 ;;; Org
 ;;
 
-(setq org-directory "~/doc/org/")
+(setq! org-directory "~/doc/org/")
 
 ;; For some reason only using `after!' work here. `setq-hook!' and etc doesn't
 ;; produce expected results.
diff --git a/modules/emacs/doom/init.el b/modules/emacs/doom/init.el
index b031880..8575c3f 100644
--- a/modules/emacs/doom/init.el
+++ b/modules/emacs/doom/init.el
@@ -2,10 +2,12 @@
        japanese
 
        :completion
-       company
+       ;; company
+       (corfu +icons +orderless +dabbrev)
        vertico
 
        :ui
+       deft
        doom
        (emoji +unicode)
        hl-todo
@@ -23,14 +25,19 @@
        (evil +everywhere)
        file-templates
        fold
-       format
+       (format +onsave)
+       lispy
+       ;; multiple-cursors
+       ;; objed
        parinfer
+       ;; rotate-text
        snippets
        word-wrap
 
        :emacs
        dired
        electric
+       eww
        ibuffer
        undo
        vc
@@ -41,7 +48,7 @@
 
        :checkers
        syntax
-       (spell +aspell +everywhere)
+       (spell +everywhere +icons)
        grammar
 
        :tools
@@ -57,12 +64,12 @@
        make
        (pass +auth)
        pdf
+       prodigy
        (terraform +lsp)
        tree-sitter
        upload
 
        :os
-       (:if (featurep :system 'macos) macos)
        tty
 
        :lang
@@ -70,6 +77,7 @@
        data
        emacs-lisp
        (go +lsp +tree-sitter)
+       (graphql +lsp +tree-sitter)
        (haskell +lsp +tree-sitter)
        javascript
        (json +lsp +tree-sitter)
@@ -78,8 +86,12 @@
        (nix +lsp +tree-sitter)
        (org +pandoc +roam2)
        plantuml
+       graphviz
        (python +poetry +pyright +lsp +tree-sitter)
+       ;; (racket +lsp +tree-sitter +xp +hash-lang)
+       rest
        (rust +lsp +tree-sitter)
+       ;; (scheme +chicken +guile +racket)
        (sh +lsp +tree-sitter)
        web
        (yaml +lsp +tree-sitter)
@@ -89,6 +101,7 @@
 
        :app
        calendar
+       emms
        irc
        (rss +org)
 
diff --git a/modules/emacs/doom/packages.el b/modules/emacs/doom/packages.el
index 0f908df..fb521bc 100644
--- a/modules/emacs/doom/packages.el
+++ b/modules/emacs/doom/packages.el
@@ -2,6 +2,8 @@
 
 (unpin! (:editor parinfer))
 
+(unpin! evil-collection)
+
 (package! xclip)
 
 (package! org-roam-ui)
@@ -19,7 +21,7 @@
   :recipe (:host gitlab
            :repo "emacs-ansible/emacs-ansible"))
 
-(package! tvl
-  :recipe (:host nil
-           :repo "https://code.tvl.fyi/depot.git:/tools/emacs-pkgs/tvl.git"
-           :build nil))
+;; (package! tvl
+;;   :recipe (:host nil
+;;            :repo "https://code.tvl.fyi/depot.git:/tools/emacs-pkgs/tvl.git"
+;;            :build nil))
diff --git a/modules/firefox/addons.json b/modules/firefox/addons.json
index c1ea3fa..5c6a090 100644
--- a/modules/firefox/addons.json
+++ b/modules/firefox/addons.json
@@ -40,5 +40,8 @@
   },
   {
     "slug": "violentmonkey"
+  },
+  {
+    "slug": "switchyomega"
   }
 ]
diff --git a/modules/firefox/addons.nix b/modules/firefox/addons.nix
index 753a413..e416a3f 100644
--- a/modules/firefox/addons.nix
+++ b/modules/firefox/addons.nix
@@ -5,10 +5,10 @@
 {
   "bitwarden" = buildFirefoxXpiAddon {
     pname = "bitwarden";
-    version = "2024.9.0";
+    version = "2024.10.0";
     addonId = "{446900e4-71c2-419f-a6a7-df9c091e268b}";
-    url = "https://addons.mozilla.org/firefox/downloads/file/4350677/bitwarden_password_manager-2024.9.0.xpi";
-    sha256 = "8c8b97b445fe65cbdd91eda4bd07e8946d6c1b21ac89c771205a3b9225e2ef12";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4363548/bitwarden_password_manager-2024.10.0.xpi";
+    sha256 = "9ea9428444870a74ae1999d77eb12d97a45275c85e83d6afdcbc4597fa3eccfb";
     meta = with lib; {
       homepage = "https://bitwarden.com";
       description = "At home, at work, or on the go, Bitwarden easily secures all your passwords, passkeys, and sensitive information.";
@@ -35,10 +35,10 @@
   };
   "consent-o-matic" = buildFirefoxXpiAddon {
     pname = "consent-o-matic";
-    version = "1.1.0";
+    version = "1.1.3";
     addonId = "gdpr@cavi.au.dk";
-    url = "https://addons.mozilla.org/firefox/downloads/file/4298698/consent_o_matic-1.1.0.xpi";
-    sha256 = "c23631cdf746fcf2896e99ba0dbc6192bd92c24275d05b0802dc7d7038b4815a";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4362793/consent_o_matic-1.1.3.xpi";
+    sha256 = "a3ca5c64ac50376366beb4cce610d0af80e687c8c6a8c21a107c6118059896f8";
     meta = with lib; {
       homepage = "https://consentomatic.au.dk/";
       description = "Automatic handling of GDPR consent forms";
@@ -54,10 +54,10 @@
   };
   "darkreader" = buildFirefoxXpiAddon {
     pname = "darkreader";
-    version = "4.9.92";
+    version = "4.9.94";
     addonId = "addon@darkreader.org";
-    url = "https://addons.mozilla.org/firefox/downloads/file/4351387/darkreader-4.9.92.xpi";
-    sha256 = "be55b3ea5bab95743d43823d9290fa820035b89c4d07943b568111d837a98226";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4359254/darkreader-4.9.94.xpi";
+    sha256 = "251c4e7d0a30c0cab006803600e59ab92dcc0c606429740d42677846d4c9ccd6";
     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.";
@@ -187,10 +187,10 @@
   };
   "rikaichamp" = buildFirefoxXpiAddon {
     pname = "rikaichamp";
-    version = "1.20.0";
+    version = "1.21.1";
     addonId = "{59812185-ea92-4cca-8ab7-cfcacee81281}";
-    url = "https://addons.mozilla.org/firefox/downloads/file/4325631/10ten_ja_reader-1.20.0.xpi";
-    sha256 = "25215fe0211f2e01b5f7b75a3311214eb647999e48e4a77268e36e5ccc4efbd2";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4355635/10ten_ja_reader-1.21.1.xpi";
+    sha256 = "81d85cfdc03cb0c921cac84547e7a7a539af11ff9a81dd901b3f3bfa67ba45f1";
     meta = with lib; {
       homepage = "https://github.com/birchill/10ten-ja-reader/";
       description = "Quickly translate Japanese by hovering over words. Formerly released as Rikaichamp.";
@@ -230,12 +230,38 @@
       platforms = platforms.all;
     };
   };
+  "switchyomega" = buildFirefoxXpiAddon {
+    pname = "switchyomega";
+    version = "2.5.10";
+    addonId = "switchyomega@feliscatus.addons.mozilla.org";
+    url = "https://addons.mozilla.org/firefox/downloads/file/848109/switchyomega-2.5.10.xpi";
+    sha256 = "dfefc2da59eeb2e92a32fc75fb05426feeea4c39ee01b7a797395ed29ed7cf77";
+    meta = with lib; {
+      homepage = "https://github.com/FelisCatus/SwitchyOmega";
+      description = "Manage and switch between multiple proxies quickly & easily.";
+      license = licenses.gpl3;
+      mozPermissions = [
+        "proxy"
+        "tabs"
+        "alarms"
+        "storage"
+        "webRequest"
+        "downloads"
+        "webRequestBlocking"
+        "contextMenus"
+        "http://*/*"
+        "https://*/*"
+        "<all_urls>"
+      ];
+      platforms = platforms.all;
+    };
+  };
   "ublock-origin" = buildFirefoxXpiAddon {
     pname = "ublock-origin";
-    version = "1.59.0";
+    version = "1.60.0";
     addonId = "uBlock0@raymondhill.net";
-    url = "https://addons.mozilla.org/firefox/downloads/file/4328681/ublock_origin-1.59.0.xpi";
-    sha256 = "1db9c676a07d141f8d36dbbc24f9e3d64a6cc2340dbfc6c848bc4395f96cfb14";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4359936/ublock_origin-1.60.0.xpi";
+    sha256 = "e2cda9b2a1b0a7f6e5ef0da9f87f28df52f8560587ba2e51a3003121cfb81600";
     meta = with lib; {
       homepage = "https://github.com/gorhill/uBlock#ublock-origin";
       description = "Finally, an efficient wide-spectrum content blocker. Easy on CPU and memory.";
@@ -292,10 +318,10 @@
   };
   "violentmonkey" = buildFirefoxXpiAddon {
     pname = "violentmonkey";
-    version = "2.23.0";
+    version = "2.26.0";
     addonId = "{aecec67f-0d10-4fa7-b7c7-609a2db280cf}";
-    url = "https://addons.mozilla.org/firefox/downloads/file/4352761/violentmonkey-2.23.0.xpi";
-    sha256 = "b3eadf855b6093376590aa63ae05933c5812e9515c9acf558550a4f2c78ab49b";
+    url = "https://addons.mozilla.org/firefox/downloads/file/4362578/violentmonkey-2.26.0.xpi";
+    sha256 = "47b61fd463602a38bf67591ab94c60d3f1a02ad4f81b9a8a3de97d5461b2e12e";
     meta = with lib; {
       homepage = "https://violentmonkey.github.io/";
       description = "Userscript support for browsers, open source.";
diff --git a/modules/firefox/default.nix b/modules/firefox/default.nix
index c694a7f..b7e47b6 100644
--- a/modules/firefox/default.nix
+++ b/modules/firefox/default.nix
@@ -131,6 +131,7 @@ in
                 redirector
                 rikaichamp
                 skip-redirect
+                switchyomega
                 ublock-origin
                 user-agent-switcher
                 violentmonkey
diff --git a/modules/games/steam.nix b/modules/games/steam.nix
index 23b4f14..d1da8ee 100644
--- a/modules/games/steam.nix
+++ b/modules/games/steam.nix
@@ -15,8 +15,8 @@ in
     nixfiles.modules = {
       common.nix.allowedUnfreePackages = [
         "steam"
-        "steam-original"
         "steam-run"
+        "steam-unwrapped"
       ];
 
       games = {
diff --git a/modules/ipfs.nix b/modules/ipfs.nix
index 1e1d23f..25f7fce 100644
--- a/modules/ipfs.nix
+++ b/modules/ipfs.nix
@@ -144,6 +144,11 @@ in
         allowedUDPPorts = allowedTCPPorts;
       };
 
+      boot.kernel.sysctl = {
+        "net.core.rmem_max" = 7500000;
+        "net.core.wmem_max" = 7500000;
+      };
+
       topology = with cfg; {
         nodes.${this.hostname}.services.ipfs-kubo = {
           name = "IPFS Kubo";
diff --git a/modules/murmur.nix b/modules/murmur.nix
index 7621c9e..d334015 100644
--- a/modules/murmur.nix
+++ b/modules/murmur.nix
@@ -22,10 +22,18 @@ in
 
     services.murmur = {
       enable = true;
+
       openFirewall = true;
+
       logDays = -1;
+
       registerName = mkDefault my.domain.shire;
+      registerHostname = mkDefault my.domain.shire;
+
+      bandwidth = 256000;
+
       password = "$MURMUR_PASSWORD";
+
       environmentFile = config.secrets."murmur-environment".path;
     };
   };
diff --git a/overlays.nix b/overlays.nix
index a9dc2ec..5800a76 100644
--- a/overlays.nix
+++ b/overlays.nix
@@ -62,13 +62,39 @@
 
     openssl_1_0_0 = prev.callPackage ./packages/openssl_1_0_0.nix { };
 
-    parinfer-rust = prev.callPackage ./packages/parinfer-rust.nix { };
-
     telegram-desktop =
       (prev.telegram-desktop.override (finalAttrs: {
         stdenv = final.useMoldLinker finalAttrs.stdenv;
       })).overrideAttrs
-        (_: super: { patches = (super.patches or [ ]) ++ [ ./packages/telegram-desktop.patch ]; });
+        (
+          _: super: {
+            patches =
+              (super.patches or [ ])
+              ++ (
+                let
+                  patches = "https://raw.githubusercontent.com/msva/mva-overlay/4c89938831bcce03fae22081809e53a47bdee31b/net-im/telegram-desktop/files/patches";
+                in
+                [
+                  (prev.fetchpatch {
+                    url = "${patches}/0/conditional/tdesktop_patches_hide-sponsored-messages/0000-data_data_sponsored_messages.cpp.patch";
+                    hash = "sha256-vVucKG0YNY41MVdqibhKfxL/2/nNPPtYw+otwat971U=";
+                  })
+                  (prev.fetchpatch {
+                    url = "${patches}/0/conditional/tdesktop_patches_allow-disable-stories/option-to-disable-stories.patch";
+                    hash = "sha256-ctL9wIn3cLtqgCcQFNnx7WQuBw+9IjDlMJUicmVt8no=";
+                  })
+                  (prev.fetchpatch {
+                    url = "${patches}/0/conditional/tdesktop_patches_hide-banned/0000_hide-messages-from-blocked-users.patch";
+                    hash = "sha256-61U3wQsUdLvB4ymHPjVecw9WvhW8W/V0Jf1cnvYUkHk=";
+                  })
+                  (prev.fetchpatch {
+                    url = "${patches}/0/conditional/tdesktop_patches_wide-baloons/style.patch";
+                    hash = "sha256-Ot2kb49YsEhaunw/yMgLaqrDYYS+pHPf79Yiwahxj+g=";
+                  })
+                ]
+              );
+          }
+        );
 
     vesktop =
       (prev.vesktop.overrideAttrs (
@@ -91,30 +117,30 @@
           withTTS = false;
         };
 
-    linuxPackages_xanmod_latest = prev.linuxPackages_xanmod_latest.extend (
-      f: _: {
+    linuxPackages_latest = prev.linuxPackages_latest.extend (
+      x: _: {
         amneziawg =
-          inputs.nixpkgs-amneziawg.legacyPackages.${final.system}.linuxPackages_xanmod_latest.amneziawg.override
+          inputs.nixpkgs-amneziawg.legacyPackages.${final.system}.linuxPackages_latest.amneziawg.override
             {
-              inherit (f) kernel;
+              inherit (x) kernel;
             };
       }
     );
-    linuxPackages_latest = prev.linuxPackages_latest.extend (
-      f: _: {
+    linuxPackages_hardened = prev.linuxPackages_hardened.extend (
+      x: _: {
         amneziawg =
-          inputs.nixpkgs-amneziawg.legacyPackages.${final.system}.linuxPackages_latest.amneziawg.override
+          inputs.nixpkgs-amneziawg.legacyPackages.${final.system}.linuxPackages_hardened.amneziawg.override
             {
-              inherit (f) kernel;
+              inherit (x) kernel;
             };
       }
     );
-    linuxPackages_hardened = prev.linuxPackages_hardened.extend (
-      f: _: {
+    linuxPackages_xanmod_latest = prev.linuxPackages_xanmod_latest.extend (
+      x: _: {
         amneziawg =
-          inputs.nixpkgs-amneziawg.legacyPackages.${final.system}.linuxPackages_hardened.amneziawg.override
+          inputs.nixpkgs-amneziawg.legacyPackages.${final.system}.linuxPackages_xanmod_latest.amneziawg.override
             {
-              inherit (f) kernel;
+              inherit (x) kernel;
             };
       }
     );
diff --git a/packages/emacsql-sqlite.nix b/packages/emacsql-sqlite.nix
index c9745fd..ad948bc 100644
--- a/packages/emacsql-sqlite.nix
+++ b/packages/emacsql-sqlite.nix
@@ -5,13 +5,13 @@
 }:
 stdenv.mkDerivation (finalAttrs: {
   pname = "emacsql-sqlite";
-  version = "3.1.1";
+  version = "4.0.3";
 
   src = fetchFromGitHub {
     owner = "magit";
     repo = "emacsql";
-    rev = finalAttrs.version;
-    hash = "sha256-b/QEpWMTyVOdkOEhPNJ0x8ukUy9Gc9gYGjnlh0WU9fY=";
+    rev = "v${finalAttrs.version}";
+    hash = "sha256-MaL3t+2MhWOE6eLmt8m4ImpsKeNeUZ4S8zEoQVu51ZY=";
   };
 
   sourceRoot = "source/sqlite";
diff --git a/packages/parinfer-rust.nix b/packages/parinfer-rust.nix
deleted file mode 100644
index a925834..0000000
--- a/packages/parinfer-rust.nix
+++ /dev/null
@@ -1,29 +0,0 @@
-{
-  lib,
-  fetchFromGitHub,
-  rustPlatform,
-}:
-rustPlatform.buildRustPackage rec {
-  pname = "parinfer-rust";
-  version = "0.5.0-unstable-2024-05-07";
-
-  src = fetchFromGitHub {
-    owner = "eraserhd";
-    repo = "parinfer-rust";
-    rev = "d84828b453e158d06406f6b5e9056f6b54ff76c9";
-    hash = "sha256-Q2fYogfn5QcNDEie4sUaVydAmDmcFXnsvz35cxPCf+M=";
-  };
-
-  cargoHash = "sha256-awps5BAtImc7q/D2W/vPOrFVh45k43xqUJXbOTyZF+s=";
-
-  buildFeatures = [ "emacs" ];
-
-  nativeBuildInputs = [ rustPlatform.bindgenHook ];
-
-  meta = with lib; {
-    description = "A Rust port of parinfer";
-    inherit (src.meta) homepage;
-    license = licenses.isc;
-    maintainers = with maintainers; [ azahi ];
-  };
-}
diff --git a/packages/telegram-desktop.patch b/packages/telegram-desktop.patch
deleted file mode 100644
index 8fe272b..0000000
--- a/packages/telegram-desktop.patch
+++ /dev/null
@@ -1,296 +0,0 @@
-diff --git i/Telegram/SourceFiles/core/click_handler_types.cpp w/Telegram/SourceFiles/core/click_handler_types.cpp
-index 9b03e0b74..25af14f67 100644
---- i/Telegram/SourceFiles/core/click_handler_types.cpp
-+++ w/Telegram/SourceFiles/core/click_handler_types.cpp
-@@ -345,9 +345,7 @@ void MonospaceClickHandler::onClick(ClickContext context) const {
- 	if (const auto controller = my.sessionWindow.get()) {
- 		auto &data = controller->session().data();
- 		const auto item = data.message(my.itemId);
--		const auto hasCopyRestriction = item
--			&& (!item->history()->peer->allowsForwarding()
--				|| item->forbidsForward());
-+		const auto hasCopyRestriction = false;
- 		if (hasCopyRestriction) {
- 			controller->showToast(item->history()->peer->isBroadcast()
- 				? tr::lng_error_nocopy_channel(tr::now)
-diff --git i/Telegram/SourceFiles/data/components/sponsored_messages.cpp w/Telegram/SourceFiles/data/components/sponsored_messages.cpp
-index c20ec967e..bb3de6794 100644
---- i/Telegram/SourceFiles/data/components/sponsored_messages.cpp
-+++ w/Telegram/SourceFiles/data/components/sponsored_messages.cpp
-@@ -193,7 +193,7 @@ void SponsoredMessages::inject(
- }
- 
- bool SponsoredMessages::canHaveFor(not_null<History*> history) const {
--	return history->peer->isChannel();
-+	return false;
- }
- 
- void SponsoredMessages::request(not_null<History*> history, Fn<void()> done) {
-diff --git i/Telegram/SourceFiles/data/data_channel.cpp w/Telegram/SourceFiles/data/data_channel.cpp
-index 2f7694395..4468729e1 100644
---- i/Telegram/SourceFiles/data/data_channel.cpp
-+++ w/Telegram/SourceFiles/data/data_channel.cpp
-@@ -884,7 +884,7 @@ void ChannelData::clearInvitePeek() {
- }
- 
- TimeId ChannelData::invitePeekExpires() const {
--	return _invitePeek ? _invitePeek->expires : 0;
-+	return 0;
- }
- 
- QString ChannelData::invitePeekHash() const {
-diff --git i/Telegram/SourceFiles/data/data_stories.cpp w/Telegram/SourceFiles/data/data_stories.cpp
-index 668ec4c45..0a738e229 100644
---- i/Telegram/SourceFiles/data/data_stories.cpp
-+++ w/Telegram/SourceFiles/data/data_stories.cpp
-@@ -442,70 +442,7 @@ Story *Stories::parseAndApply(
- 		not_null<PeerData*> peer,
- 		const MTPDstoryItem &data,
- 		TimeId now) {
--	const auto media = ParseMedia(_owner, data.vmedia());
--	if (!media) {
--		return nullptr;
--	}
--	const auto expires = data.vexpire_date().v;
--	const auto expired = (expires <= now);
--	if (expired && !data.is_pinned() && !hasArchive(peer)) {
--		return nullptr;
--	}
--	const auto id = data.vid().v;
--	const auto fullId = FullStoryId{ peer->id, id };
--	auto &stories = _stories[peer->id];
--	const auto i = stories.find(id);
--	if (i != end(stories)) {
--		const auto result = i->second.get();
--		const auto mediaChanged = (result->media() != *media);
--		result->applyChanges(*media, data, now);
--		const auto j = _pollingSettings.find(result);
--		if (j != end(_pollingSettings)) {
--			maybeSchedulePolling(result, j->second, now);
--		}
--		if (mediaChanged) {
--			_preloaded.remove(fullId);
--			if (_preloading && _preloading->id() == fullId) {
--				_preloading = nullptr;
--				rebuildPreloadSources(StorySourcesList::NotHidden);
--				rebuildPreloadSources(StorySourcesList::Hidden);
--				continuePreloading();
--			}
--			_owner->refreshStoryItemViews(fullId);
--		}
--		return result;
--	}
--	const auto wasDeleted = _deleted.remove(fullId);
--	const auto result = stories.emplace(id, std::make_unique<Story>(
--		id,
--		peer,
--		StoryMedia{ *media },
--		data,
--		now
--	)).first->second.get();
--
--	if (const auto archive = lookupArchive(peer)) {
--		const auto added = archive->ids.list.emplace(id).second;
--		if (added) {
--			if (archive->total >= 0 && id > archive->lastId) {
--				++archive->total;
--			}
--			_archiveChanged.fire_copy(peer->id);
--		}
--	}
--
--	if (expired) {
--		_expiring.remove(expires, fullId);
--		applyExpired(fullId);
--	} else {
--		registerExpiring(expires, fullId);
--	}
--
--	if (wasDeleted) {
--		_owner->refreshStoryItemViews(fullId);
--	}
--
--	return result;
-+	return nullptr;
- }
- 
- StoryIdDates Stories::parseAndApply(
-diff --git i/Telegram/SourceFiles/history/history_inner_widget.cpp w/Telegram/SourceFiles/history/history_inner_widget.cpp
-index 1a302bd10..44ecffbed 100644
---- i/Telegram/SourceFiles/history/history_inner_widget.cpp
-+++ w/Telegram/SourceFiles/history/history_inner_widget.cpp
-@@ -558,14 +558,7 @@ void HistoryInner::setupSharingDisallowed() {
- }
- 
- bool HistoryInner::hasSelectRestriction() const {
--	if (!_sharingDisallowed.current()) {
--		return false;
--	} else if (const auto chat = _peer->asChat()) {
--		return !chat->canDeleteMessages();
--	} else if (const auto channel = _peer->asChannel()) {
--		return !channel->canDeleteMessages();
--	}
--	return true;
-+	return false;
- }
- 
- void HistoryInner::messagesReceived(
-@@ -2844,12 +2837,12 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
- }
- 
- bool HistoryInner::hasCopyRestriction(HistoryItem *item) const {
--	return !_peer->allowsForwarding() || (item && item->forbidsForward());
-+	return false;
- }
- 
- bool HistoryInner::hasCopyMediaRestriction(
- 		not_null<HistoryItem*> item) const {
--	return hasCopyRestriction(item) || item->forbidsSaving();
-+	return false;
- }
- 
- bool HistoryInner::showCopyRestriction(HistoryItem *item) {
-diff --git i/Telegram/SourceFiles/history/history_item.cpp w/Telegram/SourceFiles/history/history_item.cpp
-index d9c306013..5fcd7d02b 100644
---- i/Telegram/SourceFiles/history/history_item.cpp
-+++ w/Telegram/SourceFiles/history/history_item.cpp
-@@ -2243,11 +2243,6 @@ bool HistoryItem::forbidsForward() const {
- }
- 
- bool HistoryItem::forbidsSaving() const {
--	if (forbidsForward()) {
--		return true;
--	} else if (const auto invoice = _media ? _media->invoice() : nullptr) {
--		return HasExtendedMedia(*invoice);
--	}
- 	return false;
- }
- 
-diff --git i/Telegram/SourceFiles/history/view/history_view_list_widget.cpp w/Telegram/SourceFiles/history/view/history_view_list_widget.cpp
-index 4155adf9b..1775ef4f4 100644
---- i/Telegram/SourceFiles/history/view/history_view_list_widget.cpp
-+++ w/Telegram/SourceFiles/history/view/history_view_list_widget.cpp
-@@ -1515,13 +1515,11 @@ bool ListWidget::isEmpty() const {
- }
- 
- bool ListWidget::hasCopyRestriction(HistoryItem *item) const {
--	return _delegate->listCopyRestrictionType(item)
--		!= CopyRestrictionType::None;
-+	return false;
- }
- 
- bool ListWidget::hasCopyMediaRestriction(not_null<HistoryItem*> item) const {
--	return _delegate->listCopyMediaRestrictionType(item)
--		!= CopyRestrictionType::None;
-+	return false;
- }
- 
- bool ListWidget::showCopyRestriction(HistoryItem *item) {
-@@ -1547,21 +1545,6 @@ bool ListWidget::showCopyMediaRestriction(not_null<HistoryItem*> item) {
- }
- 
- bool ListWidget::hasCopyRestrictionForSelected() const {
--	if (hasCopyRestriction()) {
--		return true;
--	}
--	if (_selected.empty()) {
--		if (_selectedTextItem && _selectedTextItem->forbidsForward()) {
--			return true;
--		}
--	}
--	for (const auto &[itemId, selection] : _selected) {
--		if (const auto item = session().data().message(itemId)) {
--			if (item->forbidsForward()) {
--				return true;
--			}
--		}
--	}
- 	return false;
- }
- 
-@@ -1580,8 +1563,7 @@ bool ListWidget::showCopyRestrictionForSelected() {
- }
- 
- bool ListWidget::hasSelectRestriction() const {
--	return _delegate->listSelectRestrictionType()
--		!= CopyRestrictionType::None;
-+	return false;
- }
- 
- Element *ListWidget::lookupItemByY(int y) const {
-diff --git i/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp w/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp
-index 92bd21800..297ddf1f2 100644
---- i/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp
-+++ w/Telegram/SourceFiles/history/view/history_view_top_bar_widget.cpp
-@@ -1240,15 +1240,14 @@ void TopBarWidget::updateMembersShowArea() {
- }
- 
- bool TopBarWidget::showSelectedState() const {
--	return (_selectedCount > 0)
--		&& (_canDelete || _canForward || _canSendNow);
-+	return _selectedCount > 0;
- }
- 
- void TopBarWidget::showSelected(SelectedState state) {
- 	auto canDelete = (state.count > 0 && state.count == state.canDeleteCount);
- 	auto canForward = (state.count > 0 && state.count == state.canForwardCount);
- 	auto canSendNow = (state.count > 0 && state.count == state.canSendNowCount);
--	auto count = (!canDelete && !canForward && !canSendNow) ? 0 : state.count;
-+	auto count = state.count;
- 	if (_selectedCount == count
- 		&& _canDelete == canDelete
- 		&& _canForward == canForward
-diff --git i/Telegram/SourceFiles/info/media/info_media_provider.cpp w/Telegram/SourceFiles/info/media/info_media_provider.cpp
-index 2fc69733e..2e830b73e 100644
---- i/Telegram/SourceFiles/info/media/info_media_provider.cpp
-+++ w/Telegram/SourceFiles/info/media/info_media_provider.cpp
-@@ -88,14 +88,7 @@ Type Provider::type() {
- }
- 
- bool Provider::hasSelectRestriction() {
--	if (_peer->allowsForwarding()) {
--		return false;
--	} else if (const auto chat = _peer->asChat()) {
--		return !chat->canDeleteMessages();
--	} else if (const auto channel = _peer->asChannel()) {
--		return !channel->canDeleteMessages();
--	}
--	return true;
-+	return false;
- }
- 
- rpl::producer<bool> Provider::hasSelectRestrictionChanges() {
-diff --git i/Telegram/SourceFiles/main/main_domain.h w/Telegram/SourceFiles/main/main_domain.h
-index 2e69222b9..b3e08fd66 100644
---- i/Telegram/SourceFiles/main/main_domain.h
-+++ w/Telegram/SourceFiles/main/main_domain.h
-@@ -31,8 +31,8 @@ public:
- 		std::unique_ptr<Account> account;
- 	};
- 
--	static constexpr auto kMaxAccounts = 3;
--	static constexpr auto kPremiumMaxAccounts = 6;
-+	static constexpr auto kMaxAccounts = 255;
-+	static constexpr auto kPremiumMaxAccounts = 255;
- 
- 	explicit Domain(const QString &dataName);
- 	~Domain();
-diff --git i/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp w/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
-index c6a7e9c6e..88c4d66ef 100644
---- i/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
-+++ w/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp
-@@ -1033,13 +1033,7 @@ QSize OverlayWidget::flipSizeByRotation(QSize size) const {
- }
- 
- bool OverlayWidget::hasCopyMediaRestriction(bool skipPremiumCheck) const {
--	if (const auto story = _stories ? _stories->story() : nullptr) {
--		return skipPremiumCheck
--			? !story->canDownloadIfPremium()
--			: !story->canDownloadChecked();
--	}
--	return (_history && !_history->peer->allowsForwarding())
--		|| (_message && _message->forbidsSaving());
-+	return false;
- }
- 
- bool OverlayWidget::showCopyMediaRestriction(bool skipPRemiumCheck) {

Consider giving Nix/NixOS a try! <3