about summary refs log tree commit diff stats
path: root/modules/by-name
diff options
context:
space:
mode:
Diffstat (limited to 'modules/by-name')
-rw-r--r--modules/by-name/ad/adb/module.nix6
-rw-r--r--modules/by-name/al/alacritty/module.nix468
-rw-r--r--modules/by-name/al/alacritty/theme.toml89
-rw-r--r--modules/by-name/ba/backup/module.nix14
-rw-r--r--modules/by-name/co/constants/module.nix57
-rw-r--r--modules/by-name/co/coredump/module.nix17
-rw-r--r--modules/by-name/dh/dhcpcd/module.nix21
-rw-r--r--modules/by-name/di/disks/module.nix13
-rw-r--r--modules/by-name/fo/fonts/module.nix16
-rw-r--r--modules/by-name/fw/fwupd/module.nix6
-rw-r--r--modules/by-name/gi/git/module.nix42
-rw-r--r--modules/by-name/ha/hardware/module.nix2
-rw-r--r--modules/by-name/hl/lhedger/module.nix57
-rw-r--r--modules/by-name/i3/i3bar-river/module.nix4
-rw-r--r--modules/by-name/i3/i3status-rust/module.nix6
-rw-r--r--modules/by-name/ia/iamb/module.nix59
-rw-r--r--modules/by-name/im/impermanence/module.nix20
-rw-r--r--modules/by-name/le/less/module.nix2
-rw-r--r--modules/by-name/lf/lf/commands/default.nix46
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/application/pdf/default.nix2
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/audio/audio.sh2
-rw-r--r--modules/by-name/lf/lf/ctpv/prev/text/default.nix5
-rw-r--r--modules/by-name/lf/lf/keybindings/default.nix2
-rw-r--r--modules/by-name/lf/lf/module.nix2
-rw-r--r--modules/by-name/lo/locale/keymaps/dvorak_modified.xkb4
-rw-r--r--modules/by-name/mp/mpv/module.nix4
-rw-r--r--modules/by-name/ms/msr/module.nix17
-rw-r--r--modules/by-name/ne/networking/module.nix9
-rw-r--r--modules/by-name/ni/nix-index/command_not_found.sh4
-rw-r--r--modules/by-name/ni/nix-index/module.nix2
-rw-r--r--modules/by-name/ni/nixpkgs/config.nix43
-rw-r--r--modules/by-name/ni/nixpkgs/module.nix6
-rw-r--r--modules/by-name/ns/nscd/module.nix18
-rw-r--r--modules/by-name/nv/nvim/mappings/default.nix13
-rw-r--r--modules/by-name/nv/nvim/module.nix38
-rw-r--r--modules/by-name/nv/nvim/performance/default.nix24
-rw-r--r--modules/by-name/nv/nvim/plgs/comment-nvim/default.nix1
-rw-r--r--modules/by-name/nv/nvim/plgs/debugprint/default.nix82
-rw-r--r--modules/by-name/nv/nvim/plgs/debugprint/lua/debugprint.lua13
-rw-r--r--modules/by-name/nv/nvim/plgs/default.nix42
-rw-r--r--modules/by-name/nv/nvim/plgs/femaco/default.nix10
-rw-r--r--modules/by-name/nv/nvim/plgs/femaco/lua/femaco.lua50
-rw-r--r--modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix33
-rw-r--r--modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua114
-rw-r--r--modules/by-name/nv/nvim/plgs/leap/default.nix74
-rw-r--r--modules/by-name/nv/nvim/plgs/lf-nvim/default.nix83
-rw-r--r--modules/by-name/nv/nvim/plgs/lf-nvim/lua/lf-nvim.lua53
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix62
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua156
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/openscad.nix6
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/quick-lint-js.nix4
-rw-r--r--modules/by-name/nv/nvim/plgs/lsp/servers/servers/ruff-lsp.nix2
-rw-r--r--modules/by-name/nv/nvim/plgs/lspkind/default.nix2
-rw-r--r--modules/by-name/nv/nvim/plgs/raw_plugins/default.nix26
-rw-r--r--modules/by-name/nv/nvim/plgs/treesitter/default.nix2
-rw-r--r--modules/by-name/nv/nvim/plgs/vim-tex/default.nix2
-rw-r--r--modules/by-name/oo/oomd/module.nix18
-rw-r--r--modules/by-name/op/openssh/module.nix42
-rw-r--r--modules/by-name/po/polkit/module.nix3
-rw-r--r--modules/by-name/pr/printing/module.nix (renamed from modules/by-name/pi/printing/module.nix)26
-rw-r--r--modules/by-name/qu/qutebrowser/settings/default.nix11
-rw-r--r--modules/by-name/re/resolvconf/module.nix15
-rwxr-xr-xmodules/by-name/ri/river/init_base.sh5
-rw-r--r--modules/by-name/ri/river/keymap.nix189
-rw-r--r--modules/by-name/ri/river/module.nix24
-rw-r--r--modules/by-name/ri/river/river-start/package.nix4
-rwxr-xr-xmodules/by-name/ri/river/river-start/river-start.sh3
-rw-r--r--modules/by-name/ro/rofi/module.nix31
-rw-r--r--modules/by-name/ro/rofi/nord-twoLines.rasi101
-rw-r--r--modules/by-name/ro/rofi/nord-twoLines.rasi.license (renamed from modules/by-name/yt/yt/input.conf.license)0
-rw-r--r--modules/by-name/so/sound/module.nix8
-rw-r--r--modules/by-name/ss/ssh/module.nix34
-rw-r--r--modules/by-name/st/steam/module.nix5
-rw-r--r--modules/by-name/ta/taskwarrior/module.nix2
-rw-r--r--modules/by-name/up/upower/module.nix23
-rw-r--r--modules/by-name/us/users/module.nix2
-rw-r--r--modules/by-name/xd/xdg/module.nix6
-rw-r--r--modules/by-name/ya/yambar/config/config.yml52
-rw-r--r--modules/by-name/ya/yambar/module.nix78
-rwxr-xr-xmodules/by-name/ya/yambar/scripts/disk.sh31
-rwxr-xr-xmodules/by-name/ya/yambar/scripts/mpd_song_name.sh31
-rwxr-xr-xmodules/by-name/ya/yambar/scripts/network.sh57
-rwxr-xr-xmodules/by-name/ya/yambar/scripts/sound-volume.sh30
-rw-r--r--modules/by-name/ya/yambar/settings/default.nix383
-rw-r--r--modules/by-name/yt/yt/config.toml12
-rwxr-xr-xmodules/by-name/yt/yt/external_commands_script.sh9
-rw-r--r--modules/by-name/yt/yt/input.conf14
-rw-r--r--modules/by-name/yt/yt/module.nix99
-rw-r--r--modules/by-name/yt/yt/mpv.conf1
-rw-r--r--modules/by-name/yt/yt/mpv.conf.license9
-rw-r--r--modules/by-name/zs/zsh/config/command_not_found/command_not_found_insult.sh309
-rw-r--r--modules/by-name/zs/zsh/module.nix13
92 files changed, 1724 insertions, 1913 deletions
diff --git a/modules/by-name/ad/adb/module.nix b/modules/by-name/ad/adb/module.nix
index 71bd3c9b..cf13168a 100644
--- a/modules/by-name/ad/adb/module.nix
+++ b/modules/by-name/ad/adb/module.nix
@@ -26,6 +26,10 @@ in {
 
   config = lib.mkIf cfg.enable {
     programs.adb.enable = true;
-    users.users."${cfg.user}".extraGroups = ["adbusers"];
+
+    users = {
+      users."${cfg.user}".extraGroups = ["adbusers"];
+      groups.adbusers.gid = config.soispha.constants.ids.gids.adbusers;
+    };
   };
 }
diff --git a/modules/by-name/al/alacritty/module.nix b/modules/by-name/al/alacritty/module.nix
new file mode 100644
index 00000000..73860a57
--- /dev/null
+++ b/modules/by-name/al/alacritty/module.nix
@@ -0,0 +1,468 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  pkgs,
+  libraries,
+  ...
+}: let
+  cfg = config.soispha.programs.alacritty;
+in {
+  options.soispha.programs.alacritty = {
+    enable = libraries.base.options.mkEnable "alacritty";
+
+    package = lib.mkPackageOption pkgs "alacritty" {};
+  };
+
+  config = lib.mkIf cfg.enable {
+    home-manager.users.soispha = {
+      home.sessionVariables = {
+        # This is **not** the TERM variable but a special one to signify my favorite terminal.
+        TERMINAL = "alacritty";
+      };
+
+      programs.alacritty = {
+        enable = true;
+        inherit (cfg) package;
+
+        settings = {
+          bell = {
+            duration = 0;
+          };
+
+          colors = builtins.fromTOML (builtins.readFile ./theme.toml);
+
+          cursor = {
+            blink_interval = 750;
+            blink_timeout = 5;
+            style = {
+              blinking = "On";
+              shape = "Beam";
+            };
+            thickness = 0.15;
+            unfocused_hollow = true;
+            vi_mode_style = "None";
+          };
+
+          env = {
+            COLORTERM = "truecolor";
+            TERM = "alacritty";
+          };
+
+          font = {
+            builtin_box_drawing = true;
+            glyph_offset = {
+              x = -1;
+              y = -1;
+            };
+            normal = {
+              family = "SauceCodePro Nerd Font Mono";
+              style = "Regular";
+            };
+            offset = {
+              x = -1;
+              y = -1;
+            };
+            size = 12;
+          };
+
+          general = {
+            ipc_socket = true;
+            live_config_reload = true;
+          };
+
+          hints = {
+            alphabet = "jfkdls;ahgurieowpq";
+            enabled = [
+              {
+                binding = {
+                  key = "U";
+                  mods = "Control|Shift";
+                };
+                command = "xdg-open";
+                hyperlinks = true;
+                mouse = {
+                  enabled = true;
+                };
+                persist = false;
+                post_processing = true;
+                regex = "(ipfs:|ipns:|magnet:|mailto:|gemini://|gopher://|https://|http://|news:|file:|git://|ssh:|ftp://)[^\\u0000-\\u001F\\u007F-\\u009F<>\"\\\\s{-}\\\\^⟨⟩`]+";
+              }
+              {
+                action = "Paste";
+                binding = {
+                  key = "T";
+                  mods = "Control|Shift";
+                };
+                post_processing = false;
+                regex = "([^ '\"`=:\\\\[\\\\(]*/)([^/: '\"`\\\\)\\\\]]*)";
+              }
+              {
+                action = "Paste";
+                binding = {
+                  key = "H";
+                  mods = "Control|Shift";
+                };
+                post_processing = false;
+                regex = ''([a-z0-9]{7,40})\\s'';
+              }
+            ];
+          };
+
+          keyboard = {
+            bindings = [
+              {
+                action = "Paste";
+                key = "P";
+                mods = "Control";
+              }
+              {
+                action = "Paste";
+                key = "Insert";
+                mods = "Shift";
+              }
+              {
+                chars = "gc";
+                key = "Slash";
+                mods = "Control";
+              }
+              {
+                action = "Copy";
+                key = "Y";
+                mods = "Control";
+              }
+              {
+                action = "ResetFontSize";
+                key = "Key0";
+                mods = "Control";
+              }
+              {
+                action = "IncreaseFontSize";
+                key = "Equals";
+                mods = "Control";
+              }
+              {
+                action = "IncreaseFontSize";
+                key = "Plus";
+                mods = "Control";
+              }
+              {
+                action = "DecreaseFontSize";
+                key = "Minus";
+                mods = "Control";
+              }
+              {
+                action = "ToggleViMode";
+                key = "Space";
+                mods = "Control";
+              }
+              {
+                action = "ScrollToBottom";
+                key = "Space";
+                mode = "Vi";
+                mods = "Control";
+              }
+              {
+                action = "ScrollToBottom";
+                key = "I";
+                mode = "Vi";
+              }
+              {
+                action = "ToggleViMode";
+                key = "I";
+                mode = "Vi";
+              }
+              {
+                action = "ScrollToBottom";
+                key = "C";
+                mode = "Vi";
+                mods = "Control";
+              }
+              {
+                action = "ToggleViMode";
+                key = "C";
+                mode = "Vi";
+                mods = "Control";
+              }
+              {
+                action = "ClearSelection";
+                key = "Escape";
+                mode = "Vi";
+              }
+              {
+                action = "ScrollLineUp";
+                key = "Y";
+                mode = "Vi";
+                mods = "Control";
+              }
+              {
+                action = "ScrollLineDown";
+                key = "E";
+                mode = "Vi";
+                mods = "Control";
+              }
+              {
+                action = "ScrollToTop";
+                key = "G";
+                mode = "Vi";
+              }
+              {
+                action = "ScrollToBottom";
+                key = "G";
+                mode = "Vi";
+                mods = "Shift";
+              }
+              {
+                action = "ScrollPageUp";
+                key = "B";
+                mode = "Vi";
+                mods = "Control";
+              }
+              {
+                action = "ScrollPageDown";
+                key = "F";
+                mode = "Vi";
+                mods = "Control";
+              }
+              {
+                action = "ScrollHalfPageUp";
+                key = "U";
+                mode = "Vi";
+                mods = "Control";
+              }
+              {
+                action = "ScrollHalfPageDown";
+                key = "D";
+                mode = "Vi";
+                mods = "Control";
+              }
+              {
+                action = "Copy";
+                key = "Y";
+                mode = "Vi";
+              }
+              {
+                action = "ClearSelection";
+                key = "Y";
+                mode = "Vi";
+              }
+              {
+                action = "ToggleNormalSelection";
+                key = "V";
+                mode = "Vi";
+              }
+              {
+                action = "ToggleLineSelection";
+                key = "V";
+                mode = "Vi";
+                mods = "Shift";
+              }
+              {
+                action = "ToggleBlockSelection";
+                key = "V";
+                mode = "Vi";
+                mods = "Control";
+              }
+              {
+                action = "ToggleSemanticSelection";
+                key = "V";
+                mode = "Vi";
+                mods = "Alt";
+              }
+              {
+                action = "Open";
+                key = "Return";
+                mode = "Vi";
+              }
+              {
+                action = "Up";
+                key = "K";
+                mode = "Vi";
+              }
+              {
+                action = "Down";
+                key = "J";
+                mode = "Vi";
+              }
+              {
+                action = "Left";
+                key = "H";
+                mode = "Vi";
+              }
+              {
+                action = "Right";
+                key = "L";
+                mode = "Vi";
+              }
+              {
+                action = "Up";
+                key = "Up";
+                mode = "Vi";
+              }
+              {
+                action = "Down";
+                key = "Down";
+                mode = "Vi";
+              }
+              {
+                action = "Left";
+                key = "Left";
+                mode = "Vi";
+              }
+              {
+                action = "Right";
+                key = "Right";
+                mode = "Vi";
+              }
+              {
+                action = "First";
+                key = "Key0";
+                mode = "Vi";
+              }
+              {
+                action = "Last";
+                key = "Key4";
+                mode = "Vi";
+              }
+              {
+                action = "FirstOccupied";
+                key = "Key6";
+                mode = "Vi";
+                mods = "Shift";
+              }
+              {
+                action = "High";
+                key = "H";
+                mode = "Vi";
+                mods = "Shift";
+              }
+              {
+                action = "Middle";
+                key = "M";
+                mode = "Vi";
+                mods = "Shift";
+              }
+              {
+                action = "Low";
+                key = "L";
+                mode = "Vi";
+                mods = "Shift";
+              }
+              {
+                action = "SemanticLeft";
+                key = "B";
+                mode = "Vi";
+              }
+              {
+                action = "SemanticRight";
+                key = "W";
+                mode = "Vi";
+              }
+              {
+                action = "SemanticRightEnd";
+                key = "E";
+                mode = "Vi";
+              }
+              {
+                action = "WordLeft";
+                key = "B";
+                mode = "Vi";
+                mods = "Shift";
+              }
+              {
+                action = "WordRight";
+                key = "W";
+                mode = "Vi";
+                mods = "Shift";
+              }
+              {
+                action = "WordRightEnd";
+                key = "E";
+                mode = "Vi";
+                mods = "Shift";
+              }
+              {
+                action = "Bracket";
+                key = "Key5";
+                mode = "Vi";
+                mods = "Shift";
+              }
+              {
+                action = "SearchForward";
+                key = "Slash";
+                mode = "Vi";
+              }
+              {
+                action = "SearchBackward";
+                key = "Slash";
+                mode = "Vi";
+                mods = "Shift";
+              }
+              {
+                action = "SearchNext";
+                key = "N";
+                mode = "Vi";
+              }
+              {
+                action = "SearchPrevious";
+                key = "N";
+                mode = "Vi";
+                mods = "Shift";
+              }
+            ];
+          };
+
+          mouse = {
+            bindings = [
+              {
+                action = "Copy";
+                mouse = "Middle";
+              }
+            ];
+            hide_when_typing =
+              false;
+          };
+
+          scrolling = {
+            history = 10000;
+            multiplier = 3;
+          };
+
+          selection = {
+            save_to_clipboard = false;
+            semantic_escape_chars = ",│`|:\"' ()[]{}<>\t";
+          };
+
+          window = {
+            class = {
+              general = "Alacritty";
+              instance = "Alacritty";
+            };
+            decorations = "none";
+            decorations_theme_variant = "None";
+            dimensions = {
+              columns = 0;
+              lines = 0;
+            };
+            dynamic_title = true;
+            opacity = 0.9;
+            padding = {
+              x = 5;
+              y = 5;
+            };
+            startup_mode = "Windowed";
+            title = "Alacritty";
+          };
+        };
+      };
+    };
+  };
+}
diff --git a/modules/by-name/al/alacritty/theme.toml b/modules/by-name/al/alacritty/theme.toml
new file mode 100644
index 00000000..2b326e43
--- /dev/null
+++ b/modules/by-name/al/alacritty/theme.toml
@@ -0,0 +1,89 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+# Nightfox Alacritty Colors
+## name: carbonfox
+## upstream: https://github.com/edeneast/nightfox.nvim/raw/main/extra/carbonfox/alacritty.toml
+
+[primary]
+background = "#161616"
+foreground = "#f2f4f8"
+dim_foreground = "#b6b8bb"
+bright_foreground = "#f9fbff"
+
+[cursor]
+text = "#f2f4f8"
+cursor = "#b6b8bb"
+
+[vi_mode_cursor]
+text = "#f2f4f8"
+cursor = "#33b1ff"
+
+[search.matches]
+foreground = "#f2f4f8"
+background = "#525253"
+
+[search.focused_match]
+foreground = "#f2f4f8"
+background = "#3ddbd9"
+
+[footer_bar]
+foreground = "#f2f4f8"
+background = "#353535"
+
+[hints.start]
+foreground = "#f2f4f8"
+background = "#3ddbd9"
+
+[hints.end]
+foreground = "#f2f4f8"
+background = "#353535"
+
+[selection]
+text = "#f2f4f8"
+background = "#2a2a2a"
+
+[normal]
+black = "#282828"
+red = "#ee5396"
+green = "#25be6a"
+yellow = "#08bdba"
+blue = "#78a9ff"
+magenta = "#be95ff"
+cyan = "#33b1ff"
+white = "#dfdfe0"
+
+[bright]
+black = "#484848"
+red = "#f16da6"
+green = "#46c880"
+yellow = "#2dc7c4"
+blue = "#8cb6ff"
+magenta = "#c8a5ff"
+cyan = "#52bdff"
+white = "#e4e4e5"
+
+[dim]
+black = "#222222"
+red = "#ca4780"
+green = "#1fa25a"
+yellow = "#07a19e"
+blue = "#6690d9"
+magenta = "#a27fd9"
+cyan = "#2b96d9"
+white = "#bebebe"
+
+[[indexed_colors]]
+index = 16
+color = "#3ddbd9"
+
+[[indexed_colors]]
+index = 17
+color = "#ff7eb6"
diff --git a/modules/by-name/ba/backup/module.nix b/modules/by-name/ba/backup/module.nix
index d0805092..7a788764 100644
--- a/modules/by-name/ba/backup/module.nix
+++ b/modules/by-name/ba/backup/module.nix
@@ -11,6 +11,7 @@
   lib,
   config,
   pkgs,
+  libraries,
   ...
 }: let
   cfg = config.soispha.services.backup;
@@ -18,6 +19,8 @@
   snapshotDir = "/srv/last_snapshot";
 in {
   options.soispha.services.backup = {
+    enable = libraries.base.options.mkEnable "backups via restic";
+
     storagebox = {
       enable = lib.mkEnableOption "remote backups";
       user = lib.mkOption {
@@ -56,7 +59,16 @@ in {
     };
   };
 
-  config = {
+  config = lib.mkIf cfg.enable {
+    soispha.impermanence.directories = lib.mkMerge [
+      (lib.mkIf cfg.storagebox.enable [
+        "/var/cache/restic-backups-storagebox"
+      ])
+      (lib.mkIf cfg.local.enable [
+        "/var/cache/restic-backups-local"
+      ])
+    ];
+
     age.secrets = {
       resticStorageboxSshKey = lib.mkIf cfg.storagebox.enable {
         file = cfg.storagebox.sshKey;
diff --git a/modules/by-name/co/constants/module.nix b/modules/by-name/co/constants/module.nix
new file mode 100644
index 00000000..5711e9cf
--- /dev/null
+++ b/modules/by-name/co/constants/module.nix
@@ -0,0 +1,57 @@
+# This file is inspired by the `nixos/modules/misc/ids.nix`
+# file in nixpkgs.
+{lib, ...}: {
+  options.soispha.constants = {
+    ids.uids = lib.mkOption {
+      internal = true;
+      description = ''
+        The user IDs used in this nixos config.
+      '';
+      type = lib.types.attrsOf (lib.types.ints.between 0 1000);
+    };
+    ids.gids = lib.mkOption {
+      internal = true;
+      description = ''
+        The group IDs used in this nixos config.
+      '';
+      type = lib.types.attrsOf (lib.types.ints.between 0 1000);
+    };
+  };
+
+  config.soispha.constants = {
+    ids.uids = {
+      # Keep this sorted with `!sort --numeric-sort --key=2 --field-separator="="`
+
+      dhcpcd = 992;
+      systemd-oom = 993;
+      sshd = 994;
+      rtkit = 995;
+      nscd = 996;
+      nm-iodine = 997;
+      fwupd-refresh = 998;
+      avahi = 999;
+
+      # As per the NixOS file, the uids should not be greater or equal to 400;
+    };
+    ids.gids = {
+      # Please add your groups to the users and inherit them here.
+      # This avoids having an user/group id mismatch.
+
+      dhcpcd = 987;
+      lpadmin = 988;
+      resolvconf = 989;
+      systemd-oom = 990;
+      systemd-coredump = 991;
+      sshd = 992;
+      rtkit = 993;
+      polkituser = 994;
+      nscd = 995;
+      msr = 996;
+      fwupd-refresh = 997;
+      avahi = 998;
+      adbusers = 999;
+
+      # The gid should match the uid. Thus should not be >= 400;
+    };
+  };
+}
diff --git a/modules/by-name/co/coredump/module.nix b/modules/by-name/co/coredump/module.nix
new file mode 100644
index 00000000..79e764eb
--- /dev/null
+++ b/modules/by-name/co/coredump/module.nix
@@ -0,0 +1,17 @@
+{
+  config,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.systemd.coredump;
+in {
+  options.soispha.systemd.coredump = {
+    enable = (lib.mkEnableOption "oomd") // {default = config.systemd.coredump.enable;};
+  };
+
+  config = lib.mkIf cfg.enable {
+    users = {
+      groups.systemd-coredump.gid = config.soispha.constants.ids.gids.systemd-coredump;
+    };
+  };
+}
diff --git a/modules/by-name/dh/dhcpcd/module.nix b/modules/by-name/dh/dhcpcd/module.nix
new file mode 100644
index 00000000..5fee0100
--- /dev/null
+++ b/modules/by-name/dh/dhcpcd/module.nix
@@ -0,0 +1,21 @@
+{
+  config,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.dhcpcd;
+in {
+  options.soispha.dhcpcd = {
+    enable = (lib.mkEnableOption "dhcpcd") // {default = config.networking.dhcpcd.enable;};
+  };
+
+  config = lib.mkIf cfg.enable {
+    users = {
+      users.dhcpcd = {
+        uid = config.soispha.constants.ids.uids.dhcpcd;
+        group = "dhcpcd";
+      };
+      groups.dhcpcd.gid = config.soispha.constants.ids.gids.dhcpcd;
+    };
+  };
+}
diff --git a/modules/by-name/di/disks/module.nix b/modules/by-name/di/disks/module.nix
index d88fa3df..d5746ecf 100644
--- a/modules/by-name/di/disks/module.nix
+++ b/modules/by-name/di/disks/module.nix
@@ -109,11 +109,20 @@ in {
       nodev = {
         "/" = {
           fsType = "tmpfs";
-          mountOptions = ["defaults" "size=4G" "mode=755"];
+          mountOptions = ["defaults" "size=25%" "mode=0755"];
         };
         "/tmp" = {
           fsType = "tmpfs";
-          mountOptions = ["defaults" "size=16G" "mode=755"];
+          mountOptions = ["defaults" "size=50%" "mode=0755"];
+        };
+        "/nix/var/nix/builds" = {
+          fsType = "tmpfs";
+          mountOptions = [
+            "defaults"
+            "noswap" # Otherwise, we might run into io-based slowdowns
+            "size=75%"
+            "mode=0755"
+          ];
         };
       };
     };
diff --git a/modules/by-name/fo/fonts/module.nix b/modules/by-name/fo/fonts/module.nix
index f8752ae6..4bf9a612 100644
--- a/modules/by-name/fo/fonts/module.nix
+++ b/modules/by-name/fo/fonts/module.nix
@@ -20,10 +20,14 @@ in {
 
     fonts = lib.mkOption {
       type = lib.types.listOf lib.types.package;
-      example = lib.literalExpression ''with pkgs.nerdfonts; [SourceCodePro Overpass FiraCode]'';
-      default = with pkgs.nerd-fonts; [
-        sauce-code-pro
-        overpass
+      example = lib.literalExpression ''        [
+                pkgs.nerd-fonts.source-code-pro
+                pkgs.nerd-fonts.overpass
+                pkgs.nerd-fonts.fira-code
+            ]'';
+      default = [
+        pkgs.nerd-fonts.sauce-code-pro
+        pkgs.nerd-fonts.overpass
       ];
       description = "The nerd-fonts to install";
     };
@@ -35,8 +39,8 @@ in {
     fonts = {
       packages =
         cfg.fonts
-        ++ (with pkgs; [liberation_ttf])
-        ++ lib.optional cfg.enableEmoji pkgs.noto-fonts-emoji;
+        ++ [pkgs.liberation_ttf]
+        ++ lib.optional cfg.enableEmoji pkgs.noto-fonts-color-emoji;
 
       fontconfig = {
         # NOTE: This is responsible for color emoji support <2023-08-28>
diff --git a/modules/by-name/fw/fwupd/module.nix b/modules/by-name/fw/fwupd/module.nix
index 0c4a7bf3..7252c170 100644
--- a/modules/by-name/fw/fwupd/module.nix
+++ b/modules/by-name/fw/fwupd/module.nix
@@ -17,7 +17,13 @@ in {
   options.soispha.services.fwupd = {
     enable = lib.mkEnableOption "fwupd";
   };
+
   config = lib.mkIf cfg.enable {
     services.fwupd.enable = true;
+
+    users = {
+      users.fwupd-refresh.uid = config.soispha.constants.ids.uids.fwupd-refresh;
+      groups.fwupd-refresh.gid = config.soispha.constants.ids.gids.fwupd-refresh;
+    };
   };
 }
diff --git a/modules/by-name/gi/git/module.nix b/modules/by-name/gi/git/module.nix
index a70c38d7..77cfce54 100644
--- a/modules/by-name/gi/git/module.nix
+++ b/modules/by-name/gi/git/module.nix
@@ -21,21 +21,37 @@ in {
     enable = lib.mkEnableOption "an opinionated git config";
     defaultBranchName = lib.mkOption {
       type = lib.types.str;
-      description = "The Name of the default branch.";
+      description = "The name of the default branch.";
       default = "prime";
     };
   };
 
   config = lib.mkIf cfg.enable {
     home-manager.users.soispha = {
+      programs.delta = {
+        enable = true;
+        enableGitIntegration = true;
+        options = {
+          decorations = {
+            commit-decoration-style = "bold yellow box ul";
+            file-decoration-style = "none";
+            file-style = "bold yellow ul";
+          };
+          keep-plus-minus-markers = true;
+          features = "decorations";
+          whitespace-error-style = "22 reverse";
+        };
+      };
+
       programs.git = {
         enable = true;
         #package = pkgs.gitAndTools.gitFull; # TODO: for git send-email support
-        aliases = import ./aliases.nix {
-          inherit lib;
-          inherit (cfg) defaultBranchName;
-        };
-        extraConfig = {
+        settings = {
+          alias = import ./aliases.nix {
+            inherit lib;
+            inherit (cfg) defaultBranchName;
+          };
+
           core = {
             excludesFile = "${gitIgnoreFile}";
           };
@@ -100,19 +116,7 @@ in {
             };
           };
         };
-        delta = {
-          enable = true;
-          options = {
-            decorations = {
-              commit-decoration-style = "bold yellow box ul";
-              file-decoration-style = "none";
-              file-style = "bold yellow ul";
-            };
-            keep-plus-minus-markers = true;
-            features = "decorations";
-            whitespace-error-style = "22 reverse";
-          };
-        };
+
         signing = {
           key = "8321ED3A8DB999A51F3BF80FF2682914EA42DE26";
           signByDefault = true;
diff --git a/modules/by-name/ha/hardware/module.nix b/modules/by-name/ha/hardware/module.nix
index 599f5d23..69ef819f 100644
--- a/modules/by-name/ha/hardware/module.nix
+++ b/modules/by-name/ha/hardware/module.nix
@@ -48,7 +48,7 @@ in {
         extraPackages = builtins.attrValues {
           inherit
             (pkgs)
-            vaapiVdpau
+            libva-vdpau-driver
             libvdpau-va-gl
             ;
         };
diff --git a/modules/by-name/hl/lhedger/module.nix b/modules/by-name/hl/lhedger/module.nix
new file mode 100644
index 00000000..68de85d0
--- /dev/null
+++ b/modules/by-name/hl/lhedger/module.nix
@@ -0,0 +1,57 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  pkgs,
+  libraries,
+  ...
+}: let
+  cfg = config.soispha.hledger;
+  ledgerFile = "${config.home-manager.users.soispha.xdg.dataHome}/hledger/2025.journal";
+in {
+  options.soispha.hledger = {
+    enable = libraries.base.options.mkEnable "hledger";
+  };
+
+  config = lib.mkIf cfg.enable {
+    environment.variables = {
+      LEDGER_FILE = ledgerFile;
+    };
+
+    home-manager.users.soispha = {
+      home.packages = [
+        pkgs.hledger
+
+        (pkgs.writeShellApplication {
+          name = "hledger-edit";
+
+          text = ''
+            "$EDITOR" ${lib.strings.escapeShellArg ledgerFile}
+          '';
+
+          inheritPath = true; # needs access to nvim
+        })
+      ];
+
+      xdg.configFile = {
+        "hledger/hledger.conf".text =
+          # ledger
+          ''
+            # Actually enforce more checks.
+            --strict
+
+            # Use boxdrawing characters when possible.
+            --pretty
+          '';
+      };
+    };
+  };
+}
diff --git a/modules/by-name/i3/i3bar-river/module.nix b/modules/by-name/i3/i3bar-river/module.nix
index b32ec6a5..8a2203aa 100644
--- a/modules/by-name/i3/i3bar-river/module.nix
+++ b/modules/by-name/i3/i3bar-river/module.nix
@@ -119,7 +119,7 @@ in {
 
         settings = {
           theme = {
-            palette = {
+            focused = {
               # Colors
               background = toString cfg.colors.none;
               color = toString cfg.colors.white; # Only used, if blocks do not specify one
@@ -146,7 +146,7 @@ in {
               show_tags = true;
             };
 
-            unfocused_palette = {
+            unfocused = {
               hide_inactive_tags = true;
 
               color = toString (substractColor cfg.colors.white cfg.colors.unfocused_offset);
diff --git a/modules/by-name/i3/i3status-rust/module.nix b/modules/by-name/i3/i3status-rust/module.nix
index 5bd911d8..48bcd5de 100644
--- a/modules/by-name/i3/i3status-rust/module.nix
+++ b/modules/by-name/i3/i3status-rust/module.nix
@@ -81,11 +81,12 @@ in {
             }
             {
               block = "memory";
-              format = " $icon $mem_used_percents {($swap_used_percents.eng(range:1..)) | }";
+              format = " $icon $mem_used_percents{ ($swap_used_percents.eng(range:1..))|} ";
             }
             {
               block = "amd_gpu";
-              format = "  $icon $utilization (^icon_memory_mem $vram_used_percents) ";
+              format = " $icon $utilization (^icon_memory_mem $vram_used_percents) ";
+              error_format = "";
             }
 
             {
@@ -117,6 +118,7 @@ in {
             }
             {
               block = "battery";
+              format = " $icon $percentage{ $time_remaining.dur(hms:true, min_unit:m)|}{ $power|} ";
               missing_format = "";
             }
 
diff --git a/modules/by-name/ia/iamb/module.nix b/modules/by-name/ia/iamb/module.nix
new file mode 100644
index 00000000..ef46f5e0
--- /dev/null
+++ b/modules/by-name/ia/iamb/module.nix
@@ -0,0 +1,59 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  libraries,
+  ...
+}: let
+  cfg = config.soispha.programs.iamb;
+in {
+  options.soispha.programs.iamb = {
+    enable = libraries.base.options.mkEnable "iamb";
+  };
+
+  config = lib.mkIf cfg.enable {
+    soispha.impermanence.userDirectories = [
+      ".config/iamb/profiles"
+    ];
+
+    home-manager.users.soispha = {
+      programs.iamb = {
+        enable = true;
+
+        settings = {
+          default_profile = "soispha";
+
+          profiles = {
+            soispha = {
+              user_id = "@soispha:vhack.eu";
+              url = "https://matrix.vhack.eu";
+            };
+          };
+
+          settings = {
+            username_display = "displayname";
+
+            notifications = {
+              enabled = true;
+            };
+
+            image_preview = {
+              size = {
+                height = 10;
+                width = 66;
+              };
+            };
+          };
+        };
+      };
+    };
+  };
+}
diff --git a/modules/by-name/im/impermanence/module.nix b/modules/by-name/im/impermanence/module.nix
index e31cfaaf..78ad570f 100644
--- a/modules/by-name/im/impermanence/module.nix
+++ b/modules/by-name/im/impermanence/module.nix
@@ -31,6 +31,21 @@ in {
       }));
       description = "The directories to persist";
     };
+
+    userDirectories = lib.mkOption {
+      type = lib.types.listOf (lib.types.either lib.types.str (lib.types.submodule {
+        options = {
+          directory = lib.mkOption {
+            type = lib.types.str;
+          };
+          mode = lib.mkOption {
+            type = lib.types.str;
+          };
+        };
+      }));
+      default = [];
+      description = "The directories to persist";
+    };
   };
 
   imports = [
@@ -53,14 +68,13 @@ in {
             ".local/state/wireplumber"
 
             ".config/Signal"
-            ".config/iamb/profiles"
 
             ".cache"
 
             "media"
             "repos"
-            "school"
-          ];
+            "documents"
+          ] ++ cfg.userDirectories;
         };
 
         files = [
diff --git a/modules/by-name/le/less/module.nix b/modules/by-name/le/less/module.nix
index 0dd45a90..e3b47f13 100644
--- a/modules/by-name/le/less/module.nix
+++ b/modules/by-name/le/less/module.nix
@@ -31,7 +31,7 @@ in {
 
       programs.less = {
         enable = true;
-        keys =
+        config =
           builtins.readFile ./command.less
           + builtins.readFile ./line-edit.less
           + builtins.readFile ./env.less;
diff --git a/modules/by-name/lf/lf/commands/default.nix b/modules/by-name/lf/lf/commands/default.nix
index f953834b..055bfa2c 100644
--- a/modules/by-name/lf/lf/commands/default.nix
+++ b/modules/by-name/lf/lf/commands/default.nix
@@ -48,20 +48,20 @@
 in {
   archive_compress = shell {
     name = "archive_compress";
-    dependencies = with pkgs; [
-      fzf
-      gnutar
-      xz
-      p7zip
-      zip
+    dependencies = [
+      pkgs.fzf
+      pkgs.gnutar
+      pkgs.xz
+      pkgs.p7zip
+      pkgs.zip
     ];
   };
   archive_decompress = pipe {
     name = "archive_decompress";
-    dependencies = with pkgs; [
-      gnutar
-      unzip
-      p7zip
+    dependencies = [
+      pkgs.gnutar
+      pkgs.unzip
+      pkgs.p7zip
     ];
   };
 
@@ -122,10 +122,10 @@ in {
   };
   set_wallpaper = pipe {
     name = "set_wallpaper";
-    dependencies = with pkgs; [
-      river # for `riverctl`
-      swaybg
-      procps
+    dependencies = [
+      pkgs.river-classic # for `riverctl`
+      pkgs.swaybg
+      pkgs.procps
     ];
   };
 
@@ -140,16 +140,28 @@ in {
   };
   trash_clear = shell {
     name = "trash_clear";
-    dependencies = with pkgs; [conceal fzf gawk trashy gnused];
+    dependencies = [
+      pkgs.conceal
+      pkgs.fzf
+      pkgs.gawk
+      pkgs.trashy
+      pkgs.gnused
+    ];
   };
   trash_restore = shell {
     name = "trash_restore";
-    dependencies = with pkgs; [conceal fzf gawk trashy gnused];
+    dependencies = [
+      pkgs.conceal
+      pkgs.fzf
+      pkgs.gawk
+      pkgs.trashy
+      pkgs.gnused
+    ];
   };
 
   view_file = async {
     name = "view_file";
-    dependencies = with pkgs; [file];
+    dependencies = [pkgs.file];
     keepPath = true;
   };
 }
diff --git a/modules/by-name/lf/lf/ctpv/prev/application/pdf/default.nix b/modules/by-name/lf/lf/ctpv/prev/application/pdf/default.nix
index e30aab3e..bc8abf8f 100644
--- a/modules/by-name/lf/lf/ctpv/prev/application/pdf/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/application/pdf/default.nix
@@ -14,7 +14,7 @@
       matches.mime = ["application/pdf"];
       priority = 1;
       dependencies = [
-        pkgs.poppler_utils # for `pdftoppm`
+        pkgs.poppler-utils # for `pdftoppm`
         pkgs.chafa
         pkgs.gnused
         pkgs.coreutils
diff --git a/modules/by-name/lf/lf/ctpv/prev/audio/audio.sh b/modules/by-name/lf/lf/ctpv/prev/audio/audio.sh
index 324a2170..22894ca2 100644
--- a/modules/by-name/lf/lf/ctpv/prev/audio/audio.sh
+++ b/modules/by-name/lf/lf/ctpv/prev/audio/audio.sh
@@ -19,7 +19,7 @@ audio() {
     ffmpegthumbnailer -i "$f" -s 0 -q 5 -t 10 -o "$cache_f" 2>/dev/null
 }
 
-x="$(ffmpeg -hide_banner -i "$f" 2>&1)"
+x="$(ffprobe -hide_banner "$f" 2>&1)"
 printf '%s\n' "$x"
 y=$((y + $(printf '%s\n' "$x" | wc -l)))
 
diff --git a/modules/by-name/lf/lf/ctpv/prev/text/default.nix b/modules/by-name/lf/lf/ctpv/prev/text/default.nix
index edb6e09d..ca042646 100644
--- a/modules/by-name/lf/lf/ctpv/prev/text/default.nix
+++ b/modules/by-name/lf/lf/ctpv/prev/text/default.nix
@@ -21,7 +21,10 @@
     bat = {
       priority = 0;
       previewer = ./bat.sh;
-      matches.mime = ["text/*"];
+      matches.mime = [
+        "text/*"
+        "application/postscript"
+      ];
       dependencies = [
         pkgs.bat
       ];
diff --git a/modules/by-name/lf/lf/keybindings/default.nix b/modules/by-name/lf/lf/keybindings/default.nix
index d4c2a6a3..fbc33f6f 100644
--- a/modules/by-name/lf/lf/keybindings/default.nix
+++ b/modules/by-name/lf/lf/keybindings/default.nix
@@ -94,7 +94,7 @@
   gc = "cd ~/.config";
   gl = "cd ~/.local";
   gE = "cd /etc";
-  gd = "cd ${downloadDir}";
+  gD = "cd ${downloadDir}";
 
   "gU." = "cd /usr";
   gUs = " cd /usr/share";
diff --git a/modules/by-name/lf/lf/module.nix b/modules/by-name/lf/lf/module.nix
index ea9970ef..e66c3a8a 100644
--- a/modules/by-name/lf/lf/module.nix
+++ b/modules/by-name/lf/lf/module.nix
@@ -101,7 +101,7 @@ in {
           # (Otherwise, the remote command is silently dropped: https://github.com/gokcehan/lf/issues/495)
           &{{
             tmp="$(mktemp)"
-            ${lib.getExe pkgs.lf-make-map} --depth 4 generate ~/media ~/repos ~/school >"$tmp"
+            ${lib.getExe pkgs.lf-make-map} --depth 4 generate ~/media ~/repos ~/documents >"$tmp"
 
             lf -remote "send $id source $tmp"
             sleep 1
diff --git a/modules/by-name/lo/locale/keymaps/dvorak_modified.xkb b/modules/by-name/lo/locale/keymaps/dvorak_modified.xkb
index 63f5d4fb..092e17ea 100644
--- a/modules/by-name/lo/locale/keymaps/dvorak_modified.xkb
+++ b/modules/by-name/lo/locale/keymaps/dvorak_modified.xkb
@@ -7,6 +7,10 @@ xkb_symbols "dvorak-modified" {
     key <AC01>  {type[Group1]="EIGHT_LEVEL",
                  [  a,  A,  adiaeresis,  Adiaeresis,  aring,  Aring]};
 
+    key <AC10> {[  s,  S,  scaron,  Scaron]};
+    key <AD08> {[  c,  C,  ccaron,  Ccaron]};
+    key <AB10> {[  z,  Z,  zcaron,  Zcaron]};
+
 
     include "us(dvorak)"
     include "level3(caps_switch)"
diff --git a/modules/by-name/mp/mpv/module.nix b/modules/by-name/mp/mpv/module.nix
index 7c8435d5..4416b295 100644
--- a/modules/by-name/mp/mpv/module.nix
+++ b/modules/by-name/mp/mpv/module.nix
@@ -46,8 +46,8 @@ in {
           max_width = 250;
         };
       };
-      scripts = with pkgs.mpvScripts; [
-        thumbfast
+      scripts = [
+        pkgs.mpvScripts.thumbfast
       ];
     };
   };
diff --git a/modules/by-name/ms/msr/module.nix b/modules/by-name/ms/msr/module.nix
new file mode 100644
index 00000000..521b3a40
--- /dev/null
+++ b/modules/by-name/ms/msr/module.nix
@@ -0,0 +1,17 @@
+{
+  config,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.msr;
+in {
+  options.soispha.msr = {
+    enable = (lib.mkEnableOption "msr") // {default = config.hardware.cpu.x86.msr.enable;};
+  };
+
+  config = lib.mkIf cfg.enable {
+    users = {
+      groups.msr.gid = config.soispha.constants.ids.gids.msr;
+    };
+  };
+}
diff --git a/modules/by-name/ne/networking/module.nix b/modules/by-name/ne/networking/module.nix
index 6f8633e8..ea080ea4 100644
--- a/modules/by-name/ne/networking/module.nix
+++ b/modules/by-name/ne/networking/module.nix
@@ -100,9 +100,12 @@ in {
           "/etc/NetworkManager"
         ];
 
-        users.users."${cfg.userName}".extraGroups = [
-          "networkmanager" # allows to configure NetworkManager as this user
-        ];
+        users.users = {
+          "${cfg.userName}".extraGroups = [
+            "networkmanager" # allows to configure NetworkManager as this user
+          ];
+          nm-iodine.uid = config.soispha.constants.ids.uids.nm-iodine;
+        };
       })
     ]);
 }
diff --git a/modules/by-name/ni/nix-index/command_not_found.sh b/modules/by-name/ni/nix-index/command_not_found.sh
index f650cf7b..579f9db4 100644
--- a/modules/by-name/ni/nix-index/command_not_found.sh
+++ b/modules/by-name/ni/nix-index/command_not_found.sh
@@ -26,12 +26,12 @@ command_not_found_handle() {
 
     toplevel=nixpkgs # nixpkgs should always be available even in NixOS
     cmd="$1"
-    attrs=$(nix-locate --minimal --no-group --type x --type s --top-level --whole-name --at-root "/bin/$cmd")
+    attrs=$(nix-locate --minimal --no-group --type x --type s --whole-name --at-root "/bin/$cmd")
     len=$(if [ -n "$attrs" ]; then echo "$attrs" | wc -l; else echo 0; fi)
 
     case "$len" in
     0)
-        eprintln "$cmd: command not found"
+        printf "%s: command not found\n" "$cmd" >&2
         ;;
     1)
         # If only one package provides this, then we can invoke it
diff --git a/modules/by-name/ni/nix-index/module.nix b/modules/by-name/ni/nix-index/module.nix
index 06acfc8a..5ddaece3 100644
--- a/modules/by-name/ni/nix-index/module.nix
+++ b/modules/by-name/ni/nix-index/module.nix
@@ -23,7 +23,7 @@ in {
     soispha.programs.zsh.integrations.nix-index = ./command_not_found.sh;
     home-manager.users.soispha = {
       imports = [
-        modules.nix-index-database.hmModules.nix-index
+        modules.nix-index-database.homeModules.nix-index
       ];
 
       programs.nix-index = {
diff --git a/modules/by-name/ni/nixpkgs/config.nix b/modules/by-name/ni/nixpkgs/config.nix
deleted file mode 100644
index ea8f3c45..00000000
--- a/modules/by-name/ni/nixpkgs/config.nix
+++ /dev/null
@@ -1,43 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-{
-  cfg,
-  lib,
-  packageSets,
-  ...
-}: let
-  myPkgsOverlay = self: super: packageSets.soispha;
-in {
-  nixpkgs = {
-    hostPlatform = cfg.systemName;
-
-    overlays = [
-      myPkgsOverlay
-    ];
-
-    config = {
-      # TODO: this fails because of the root tempsize, which should be increased
-      # contentAddressedByDefault = true;
-
-      hostSystem = cfg.systemName;
-
-      allowUnfreePredicate = pkg:
-        builtins.elem (lib.getName pkg) [
-          "pypemicro" # required by pynitrokey
-
-          # TODO(@bpeetz): Allow moving them to their respective module. <2025-04-25>
-          "steam"
-          "steam-unwrapped"
-          "steam-original"
-          "steam-run"
-        ];
-    };
-  };
-}
diff --git a/modules/by-name/ni/nixpkgs/module.nix b/modules/by-name/ni/nixpkgs/module.nix
index fcde9505..502bcff2 100644
--- a/modules/by-name/ni/nixpkgs/module.nix
+++ b/modules/by-name/ni/nixpkgs/module.nix
@@ -44,12 +44,6 @@ in {
           allowUnfreePredicate = pkg:
             builtins.elem (lib.getName pkg) [
               "pypemicro" # required by pynitrokey
-
-              # TODO(@bpeetz): Allow moving them to their respective module. <2025-04-25>
-              "steam"
-              "steam-unwrapped"
-              "steam-original"
-              "steam-run"
             ];
         };
       };
diff --git a/modules/by-name/ns/nscd/module.nix b/modules/by-name/ns/nscd/module.nix
new file mode 100644
index 00000000..94ca4874
--- /dev/null
+++ b/modules/by-name/ns/nscd/module.nix
@@ -0,0 +1,18 @@
+{
+  config,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.nscd;
+in {
+  options.soispha.nscd = {
+    enable = (lib.mkEnableOption "nscd") // {default = config.services.nscd.enableNsncd;};
+  };
+
+  config = lib.mkIf cfg.enable {
+    users = {
+      users.nscd.uid = config.soispha.constants.ids.uids.nscd;
+      groups.nscd.gid = config.soispha.constants.ids.gids.nscd;
+    };
+  };
+}
diff --git a/modules/by-name/nv/nvim/mappings/default.nix b/modules/by-name/nv/nvim/mappings/default.nix
index 4997f66c..683b0465 100644
--- a/modules/by-name/nv/nvim/mappings/default.nix
+++ b/modules/by-name/nv/nvim/mappings/default.nix
@@ -189,12 +189,13 @@ in {
           action = "\"_dP";
           options.desc = "keep the cut thing in the base register";
         }
-        {
-          mode = ["n"];
-          key = "<leader>c";
-          action = "\"_c";
-          options.desc = "change without saving to register";
-        }
+        # Overlaps with the femaco mapping (`<Space>cc`).
+        # {
+        #   mode = ["n"];
+        #   key = "<leader>c";
+        #   action = "\"_c";
+        #   options.desc = "change without saving to register";
+        # }
 
         {
           mode = ["n"];
diff --git a/modules/by-name/nv/nvim/module.nix b/modules/by-name/nv/nvim/module.nix
index 819646d6..81d7febf 100644
--- a/modules/by-name/nv/nvim/module.nix
+++ b/modules/by-name/nv/nvim/module.nix
@@ -12,17 +12,26 @@
   lib,
   config,
   modules,
+  libraries,
   ...
 }: let
   cfg = config.soispha.programs.nvim;
+
+  plgs = builtins.attrValues (libraries.extra.mkByName {
+    useShards = false;
+    baseDirectory = ./plgs;
+    fileName = "default.nix";
+  });
 in {
-  imports = [
-    ./autocmds
-    ./clipboard
-    ./mappings
-    ./options
-    ./plgs
-  ];
+  imports =
+    [
+      ./autocmds
+      ./clipboard
+      ./mappings
+      ./options
+      ./performance
+    ]
+    ++ plgs;
 
   options.soispha.programs.nvim = {
     enable = lib.mkEnableOption "custom nvim config";
@@ -35,7 +44,7 @@ in {
   config = lib.mkIf cfg.enable {
     home-manager.users.soispha = {
       imports = [
-        modules.nixvim.homeManagerModules.nixvim
+        modules.nixvim.homeModules.nixvim
       ];
 
       home.sessionVariables = {
@@ -43,6 +52,7 @@ in {
         VISUAL = "nvim";
         CODEEDITOR = "nvim";
       };
+
       programs.nixvim = {
         enable = true;
 
@@ -63,21 +73,21 @@ in {
           ---------------------------------------------------------------------------
         '';
 
-        extraPackages = with pkgs; [
+        extraPackages = [
           /*
           These are mostly linters and formatters used for different file types.
           Including them here is fine, as they are not necessarily-sync able to different people.
           */
           # nix
-          alejandra
-          statix
+          pkgs.alejandra
+          pkgs.statix
 
           # yaml
-          yamllint
+          pkgs.yamllint
 
           # shell
-          shellcheck
-          shfmt
+          pkgs.shellcheck
+          pkgs.shfmt
         ];
       };
     };
diff --git a/modules/by-name/nv/nvim/performance/default.nix b/modules/by-name/nv/nvim/performance/default.nix
new file mode 100644
index 00000000..a392a672
--- /dev/null
+++ b/modules/by-name/nv/nvim/performance/default.nix
@@ -0,0 +1,24 @@
+{
+  config,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.programs.nvim;
+in {
+  home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
+    performance = {
+      combinePlugins = {
+        enable = true;
+      };
+
+      byteCompileLua = {
+        enable = true;
+        configs = true;
+        initLua = true;
+        luaLib = true;
+        nvimRuntime = true;
+        plugins = true;
+      };
+    };
+  };
+}
diff --git a/modules/by-name/nv/nvim/plgs/comment-nvim/default.nix b/modules/by-name/nv/nvim/plgs/comment-nvim/default.nix
index b404843e..68a88d32 100644
--- a/modules/by-name/nv/nvim/plgs/comment-nvim/default.nix
+++ b/modules/by-name/nv/nvim/plgs/comment-nvim/default.nix
@@ -26,6 +26,7 @@ in {
         };
       };
     };
+
     keymaps = [
       {
         key = "gcc";
diff --git a/modules/by-name/nv/nvim/plgs/debugprint/default.nix b/modules/by-name/nv/nvim/plgs/debugprint/default.nix
deleted file mode 100644
index 79e557bd..00000000
--- a/modules/by-name/nv/nvim/plgs/debugprint/default.nix
+++ /dev/null
@@ -1,82 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-{
-  pkgs,
-  lib,
-  config,
-  ...
-}: let
-  cfg = config.soispha.programs.nvim;
-in {
-  home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
-    # TODO: package debugprint though a module
-    extraConfigLuaPost = ''
-      ${lib.strings.fileContents ./lua/debugprint.lua}
-    '';
-    extraPlugins = [
-      pkgs.vimExtraPlugins.debugprint-nvim
-    ];
-
-    keymaps = [
-      {
-        key = "g?v";
-        mode = ["v" "n"];
-        action.__raw = ''
-          function()
-            return require('debugprint').debugprint({variable = true;});
-          end
-        '';
-        options.expr = true;
-        options.desc = ''
-          'variable' debug line below the current line
-        '';
-      }
-      {
-        key = "g?V";
-        mode = ["v" "n"];
-        action.__raw = ''
-          function()
-            return require('debugprint').debugprint({above = true; variable = true;}) ;
-          end
-        '';
-        options.expr = true;
-        options.desc = ''
-          'variable' debug line above the current line
-        '';
-      }
-      {
-        key = "g?p";
-        mode = "n";
-        action.__raw = ''
-          function()
-            return require('debugprint').debugprint();
-          end
-        '';
-        options.expr = true;
-        options.desc = ''
-          'plain' debug line below the current line
-        '';
-      }
-      {
-        key = "g?P";
-        mode = "n";
-        action.__raw = ''
-          function()
-            return require('debugprint').debugprint({above = true;});
-          end
-        '';
-        options.expr = true;
-        options.desc = ''
-          'plain' debug line above the current line
-        '';
-      }
-    ];
-  };
-}
diff --git a/modules/by-name/nv/nvim/plgs/debugprint/lua/debugprint.lua b/modules/by-name/nv/nvim/plgs/debugprint/lua/debugprint.lua
deleted file mode 100644
index b934d619..00000000
--- a/modules/by-name/nv/nvim/plgs/debugprint/lua/debugprint.lua
+++ /dev/null
@@ -1,13 +0,0 @@
--- nixos-config - My current NixOS configuration
---
--- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
--- SPDX-License-Identifier: GPL-3.0-or-later
---
--- This file is part of my nixos-config.
---
--- You should have received a copy of the License along with this program.
--- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-
-require("debugprint").setup({
-  create_keymaps = false,
-})
diff --git a/modules/by-name/nv/nvim/plgs/default.nix b/modules/by-name/nv/nvim/plgs/default.nix
deleted file mode 100644
index aaebb3b1..00000000
--- a/modules/by-name/nv/nvim/plgs/default.nix
+++ /dev/null
@@ -1,42 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-{...}: {
-  imports =
-    [
-      # Plugins not yet packaged in nixpkgs
-      # ./debugprint
-      ./lf-nvim
-      # ./lsp-progress-nvim
-    ]
-    ++ [
-      # Already packaged in nixpkgs
-      ./colorscheme
-      ./comment-nvim
-      ./femaco
-      ./flatten-nvim
-      ./goto-preview
-      ./harpoon
-      ./leap
-      ./lsp
-      ./lspkind
-      ./ltex_extra
-      ./lualine
-      ./luasnip
-      ./neorg
-      ./nvim-cmp
-      ./nvim-lint
-      ./raw_plugins
-      ./telescope
-      ./todo-comments
-      ./treesitter
-      ./vim-tex
-      ./which-key
-    ];
-}
diff --git a/modules/by-name/nv/nvim/plgs/femaco/default.nix b/modules/by-name/nv/nvim/plgs/femaco/default.nix
index a30bb59f..0388844a 100644
--- a/modules/by-name/nv/nvim/plgs/femaco/default.nix
+++ b/modules/by-name/nv/nvim/plgs/femaco/default.nix
@@ -8,7 +8,6 @@
 # You should have received a copy of the License along with this program.
 # If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
-  pkgs,
   lib,
   config,
   ...
@@ -16,13 +15,14 @@
   cfg = config.soispha.programs.nvim;
 in {
   home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
-    # TODO: package femaco through a module
+    plugins.femaco = {
+      enable = true;
+    };
+
     extraConfigLuaPost = ''
       ${lib.strings.fileContents ./lua/femaco.lua}
     '';
-    extraPlugins = [
-      pkgs.vimPlugins.nvim-FeMaco-lua
-    ];
+
     keymaps = [
       {
         key = "<leader>cc";
diff --git a/modules/by-name/nv/nvim/plgs/femaco/lua/femaco.lua b/modules/by-name/nv/nvim/plgs/femaco/lua/femaco.lua
index 1371a825..50a6cb23 100644
--- a/modules/by-name/nv/nvim/plgs/femaco/lua/femaco.lua
+++ b/modules/by-name/nv/nvim/plgs/femaco/lua/femaco.lua
@@ -8,7 +8,9 @@
 -- You should have received a copy of the License along with this program.
 -- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
+
 local clip_val = require("femaco.utils").clip_val
+
 require("femaco").setup({
   -- should prepare a new buffer and return the winid
   -- by default opens a floating window
@@ -17,7 +19,8 @@ require("femaco").setup({
   prepare_buffer = function(opts)
     local buf = vim.api.nvim_create_buf(false, false)
     return vim.api.nvim_open_win(buf, true, opts)
-  end,
+  end;
+
   -- should return options passed to nvim_open_win
   -- @param code_block: data about the code-block with the keys
   --   * range
@@ -25,30 +28,43 @@ require("femaco").setup({
   --   * lang
   float_opts = function(code_block)
     return {
-      relative = "cursor",
-      width = clip_val(5, 120, vim.api.nvim_win_get_width(0) - 10), -- TODO: how to offset sign column etc?
-      height = clip_val(5, #code_block.lines, vim.api.nvim_win_get_height(0) - 6),
-      anchor = "NW",
-      row = 0,
-      col = 0,
-      style = "minimal",
-      border = "rounded",
-      zindex = 1,
+      relative = "cursor";
+      width = clip_val(5, 120, vim.api.nvim_win_get_width(0) - 10); -- TODO how to offset sign column etc?
+      height = clip_val(5, #code_block.lines, vim.api.nvim_win_get_height(0) - 6);
+      anchor = "NW";
+      row = 0;
+      col = 0;
+      style = "minimal";
+      border = "rounded";
+      zindex = 1;
     }
-  end,
+  end;
+
   -- return filetype to use for a given lang
   -- lang can be nil
-  ft_from_lang = function(lang) return lang end,
+  ft_from_lang = function(lang)
+    return lang
+  end;
+
   -- what to do after opening the float
-  post_open_float = function(winnr) vim.wo.signcolumn = "no" end,
+  post_open_float = function(winnr)
+    vim.wo.signcolumn = "no"
+  end;
+
   -- create the path to a temporary file
-  create_tmp_filepath = function(filetype) return os.tmpname() end,
+  create_tmp_filepath = function(filetype)
+    return os.tmpname()
+  end;
+
   -- if a newline should always be used, useful for multiline injections
   -- which separators needs to be on separate lines such as markdown, neorg etc
   -- @param base_filetype: The filetype which FeMaco is called from, not the
   -- filetype of the injected language (this is the current buffer so you can
   -- get it from vim.bo.filetyp).
-  ensure_newline = function(base_filetype) return false end,
+  ensure_newline = function(base_filetype)
+    return base_filetype == "nix"
+  end;
+
   -- Return true if the indentation should be normalized. Useful when the
   -- injected language inherits indentation from the construction scope (e.g. an
   -- inline multiline sql string). If true, the leading indentation is detected,
@@ -57,5 +73,7 @@ require("femaco").setup({
   -- @param base_filetype: The filetype which FeMaco is called from, not the
   -- filetype of the injected language (this is the current buffer, so you can
   -- get it from vim.bo.filetype).
-  normalize_indent = function(base_filetype) return false end,
+  normalize_indent = function(base_filetype)
+    return base_filetype == "nix"
+  end;
 })
diff --git a/modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix b/modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix
deleted file mode 100644
index 8d61d859..00000000
--- a/modules/by-name/nv/nvim/plgs/flatten-nvim/default.nix
+++ /dev/null
@@ -1,33 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-{
-  pkgs,
-  lib,
-  config,
-  ...
-}: let
-  cfg = config.soispha.programs.nvim;
-in {
-  # TODO: Get this plugin working again <2025-01-29>
-  home-manager.users.soispha.programs.nixvim = lib.mkIf false {
-    # TODO: package flatten-nvim though a module
-
-    extraConfigLuaPre = ''
-      ${lib.strings.fileContents ./lua/flatten-nvim.lua}
-      if os.getenv("NVIM") ~= nil then
-        -- Avoid loading plugins because the host will take control of the instance anyways
-        return
-      end
-    '';
-    extraPlugins = [
-      pkgs.vimPlugins.flatten-nvim
-    ];
-  };
-}
diff --git a/modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua b/modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua
deleted file mode 100644
index 0c86cd27..00000000
--- a/modules/by-name/nv/nvim/plgs/flatten-nvim/lua/flatten-nvim.lua
+++ /dev/null
@@ -1,114 +0,0 @@
--- nixos-config - My current NixOS configuration
---
--- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
--- SPDX-License-Identifier: GPL-3.0-or-later
---
--- This file is part of my nixos-config.
---
--- You should have received a copy of the License along with this program.
--- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-
----Types:
---
--- Passed to callbacks that handle opening files
----@alias BufInfo { fname: string, bufnr: buffer }
---
--- Needed aliases
----@alias buffer integer: Buffer id
----@alias window integer: Window id
---
--- The first argument is a list of BufInfo tables representing the newly opened files.
--- The third argument is a single BufInfo table, only provided when a buffer is created from stdin.
---
--- IMPORTANT: For `block_for` to work, you need to return a buffer number OR a buffer number and a window number.
---            The `winnr` return value is not required, `vim.fn.bufwinid(bufnr)` is used if it is not provided.
---            The `filetype` of this buffer will determine whether block should happen or not.
---
----@alias OpenHandler fun(files: BufInfo[], argv: string[], stdin_buf: BufInfo, guest_cwd: string):window, buffer
---
-require("flatten").setup({
-  callbacks = {
-    ---Called to determine if a nested session should wait for the host to close the file.
-    ---param argv: a list of all the arguments in the nested session
-    ---@type fun(argv: table): boolean
-    should_block = require("flatten").default_should_block,
-
-    ---If this returns true, the nested session will be opened.
-    ---If false, default behavior is used, and
-    ---config.nest_if_no_args is respected.
-    ---@type fun(host: channel):boolean
-    should_nest = require("flatten").default_should_nest,
-
-    ---Called before a nested session is opened.
-    pre_open = function() end,
-
-    ---Called after a nested session is opened.
-    ---@param bufnr buffer
-    ---@param winnr window
-    ---@param filetype string
-    ---@param is_blocking boolean
-    ---@param is_diff boolean
-    post_open = function(bufnr, winnr, filetype, is_blocking, is_diff)
-      -- If the file is a git commit, create one-shot autocmd to delete its buffer on write
-      if filetype == "gitcommit" or filetype == "gitrebase" then
-        vim.api.nvim_create_autocmd("BufWritePost", {
-          buffer = bufnr,
-          once = true,
-          callback = vim.schedule_wrap(function() vim.api.nvim_buf_delete(bufnr, {}) end),
-        })
-      end
-    end,
-
-    ---Called when a nested session is done waiting for the host.
-    ---@param filetype string
-    block_end = function(filetype) end,
-  },
-  -- <String, Bool> dictionary of filetypes that should be blocking
-  block_for = {
-    gitcommit = true,
-  },
-  -- Command passthrough
-  allow_cmd_passthrough = true,
-  -- Allow a nested session to open if Neovim is opened without arguments
-  nest_if_no_args = false,
-  -- Window options
-  window = {
-    -- Options:
-    -- current        -> open in current window (default)
-    -- alternate      -> open in alternate window (recommended)
-    -- tab            -> open in new tab
-    -- split          -> open in split
-    -- vsplit         -> open in vsplit
-    -- smart          -> smart open (avoids special buffers)
-    -- OpenHandler    -> allows you to handle file opening yourself (see Types)
-    --
-    -- TODO: Open gitcommit filetypes in the current buffer, everything else in a new tab <2023-08-29>
-    open = "split",
-
-    -- Options:
-    -- vsplit         -> opens files in diff vsplits
-    -- split          -> opens files in diff splits
-    -- tab_vsplit     -> creates a new tabpage, and opens diff vsplits
-    -- tab_split      -> creates a new tabpage, and opens diff splits
-    -- OpenHandler    -> allows you to handle file opening yourself (see Types)
-    diff = "tab_vsplit",
-
-    -- Affects which file gets focused when opening multiple at once
-    -- Options:
-    -- "first"        -> open first file of new files (default)
-    -- "last"         -> open last file of new files
-    focus = "first",
-  },
-  -- Override this function to use a different socket to connect to the host
-  -- On the host side this can return nil or the socket address.
-  -- On the guest side this should return the socket address
-  -- or a non-zero channel id from `sockconnect`
-  -- flatten.nvim will detect if the address refers to this instance of nvim, to determine if this is a host or a guest
-  pipe_path = require("flatten").default_pipe_path,
-  -- The `default_pipe_path` will treat the first nvim instance within a single kitty/wezterm session as the host
-  -- You can configure this behaviour using the following:
-  one_per = {
-    kitty = true, -- Flatten all instance in the current Kitty session
-    wezterm = true, -- Flatten all instance in the current Wezterm session
-  },
-})
diff --git a/modules/by-name/nv/nvim/plgs/leap/default.nix b/modules/by-name/nv/nvim/plgs/leap/default.nix
deleted file mode 100644
index e5c42d2f..00000000
--- a/modules/by-name/nv/nvim/plgs/leap/default.nix
+++ /dev/null
@@ -1,74 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-{
-  config,
-  lib,
-  ...
-}: let
-  cfg = config.soispha.programs.nvim;
-in {
-  home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
-    plugins.leap = {
-      enable = true;
-      addDefaultMappings = false; # They don't work with dvorak.
-      safeLabels = [
-        "f"
-        "j"
-        "k"
-        "l"
-        "/"
-        "z"
-        "S"
-        "F"
-        "J"
-        "K"
-        "L"
-        "H"
-        "W"
-        "E"
-        "M"
-        "B"
-        "U"
-        "X"
-        "?"
-        "Z"
-      ];
-    };
-    keymaps = [
-      {
-        key = "j";
-        action = "<Plug>(leap-forward-to)";
-        options.desc = "jump forward to";
-      }
-      {
-        key = "J";
-        action = "<Plug>(leap-backward-to)";
-        options.desc = "jump backward to";
-      }
-      {
-        key = "gj";
-        action = "<Plug>(leap-from-window)";
-        options.desc = "jump to enterable windows";
-      }
-      /*
-            {key= "x";
-              mode = "v";
-              action = "<Plug>(leap-forward-till)";
-      options.desc = "leap forward till";
-            }
-            {key= "X";
-              mode = "v";
-              action = "<Plug>(leap-backward-till)";
-      options.desc = "leap backward till";
-            }
-      */
-    ];
-  };
-}
diff --git a/modules/by-name/nv/nvim/plgs/lf-nvim/default.nix b/modules/by-name/nv/nvim/plgs/lf-nvim/default.nix
index 3a1c6bf9..e652a60d 100644
--- a/modules/by-name/nv/nvim/plgs/lf-nvim/default.nix
+++ b/modules/by-name/nv/nvim/plgs/lf-nvim/default.nix
@@ -8,21 +8,88 @@
 # You should have received a copy of the License along with this program.
 # If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
-  pkgs,
   lib,
   config,
   ...
 }: let
   cfg = config.soispha.programs.nvim;
 in {
-  # TODO: package lf-nvim though a module
   # TODO: change the nvim path, when I change the path with lf
   home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
-    extraConfigLuaPost = ''
-      ${lib.strings.fileContents ./lua/lf-nvim.lua}
-    '';
-    extraPlugins = [
-      pkgs.vimPlugins.lf-nvim
-    ];
+    plugins.lf = {
+      enable = true;
+
+      settings = {
+        default_actions = {
+          "<C-o>" = "tab drop";
+          "<C-t>" = "tabedit";
+          "<C-v>" = "vsplit";
+          "<C-x>" = "split";
+        };
+
+        default_action = "drop";
+
+        winblend = 10;
+        dir = "";
+        direction = "float";
+        border = "rounded";
+        height.__raw = "vim.fn.float2nr(vim.fn.round(0.75 * vim.o.lines))";
+        width.__raw = "vim.fn.float2nr(vim.fn.round(0.75 * vim.o.columns))";
+        escape_quit = true;
+        focus_on_open = true;
+        mappings = true;
+        tmux = false;
+        default_file_manager = true;
+        disable_netrw_warning = true;
+        highlights = {
+          Normal = {link = "Normal";};
+          NormalFloat = {link = "Normal";};
+          FloatBorder = {
+            guifg = "#cdcbe0";
+            guibg = "#191726";
+          };
+        };
+
+        layout_mapping = "<M-u>";
+        views = [
+          {
+            width = 0.800;
+            height = 0.800;
+          }
+          {
+            width = 0.600;
+            height = 0.600;
+          }
+          {
+            width = 0.950;
+            height = 0.950;
+          }
+          {
+            width = 0.500;
+            height = 0.500;
+            col = 0;
+            row = 0;
+          }
+          {
+            width = 0.500;
+            height = 0.500;
+            col = 0;
+            row = 0.5;
+          }
+          {
+            width = 0.500;
+            height = 0.500;
+            col = 0.5;
+            row = 0;
+          }
+          {
+            width = 0.500;
+            height = 0.500;
+            col = 0.5;
+            row = 0.5;
+          }
+        ];
+      };
+    };
   };
 }
diff --git a/modules/by-name/nv/nvim/plgs/lf-nvim/lua/lf-nvim.lua b/modules/by-name/nv/nvim/plgs/lf-nvim/lua/lf-nvim.lua
deleted file mode 100644
index 8c40ab50..00000000
--- a/modules/by-name/nv/nvim/plgs/lf-nvim/lua/lf-nvim.lua
+++ /dev/null
@@ -1,53 +0,0 @@
--- nixos-config - My current NixOS configuration
---
--- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
--- SPDX-License-Identifier: GPL-3.0-or-later
---
--- This file is part of my nixos-config.
---
--- You should have received a copy of the License along with this program.
--- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-
-local fn = vim.fn
-
--- Defaults
-require("lf").setup({
-  default_action = "drop", -- default action when `Lf` opens a file
-  -- TODO: what do these mappings do?
-  default_actions = { -- default action keybindings
-    ["<C-t>"] = "tabedit",
-    ["<C-x>"] = "split",
-    ["<C-v>"] = "vsplit",
-    ["<C-o>"] = "tab drop",
-  },
-
-  winblend = 10, -- psuedotransparency level
-  dir = "", -- directory where `lf` starts ('gwd' is git-working-directory, ""/nil is CWD)
-  direction = "float", -- window type: float horizontal vertical
-  border = "rounded", -- border kind: single double shadow curved
-  height = fn.float2nr(fn.round(0.75 * vim.o.lines)), -- height of the *floating* window
-  width = fn.float2nr(fn.round(0.75 * vim.o.columns)), -- width of the *floating* window
-  escape_quit = true, -- map escape to the quit command (so it doesn't go into a meta normal mode)
-  focus_on_open = true, -- focus the current file when opening Lf (experimental)
-  mappings = true, -- whether terminal buffer mapping is enabled
-  tmux = false, -- tmux statusline can be disabled on opening of Lf
-  default_file_manager = true, -- make lf default file manager
-  disable_netrw_warning = true, -- don't display a message when opening a directory with `default_file_manager` as true
-  highlights = { -- highlights passed to toggleterm
-    Normal = { link = "Normal" },
-    NormalFloat = { link = "Normal" },
-    FloatBorder = { guifg = "#cdcbe0", guibg = "#191726" },
-  },
-
-  -- Layout configurations
-  layout_mapping = "<M-u>", -- resize window with this key
-  views = { -- window dimensions to rotate through
-    { width = 0.800, height = 0.800 },
-    { width = 0.600, height = 0.600 },
-    { width = 0.950, height = 0.950 },
-    { width = 0.500, height = 0.500, col = 0, row = 0 },
-    { width = 0.500, height = 0.500, col = 0, row = 0.5 },
-    { width = 0.500, height = 0.500, col = 0.5, row = 0 },
-    { width = 0.500, height = 0.500, col = 0.5, row = 0.5 },
-  },
-})
diff --git a/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix b/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix
deleted file mode 100644
index 85458310..00000000
--- a/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/default.nix
+++ /dev/null
@@ -1,62 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-{
-  lib,
-  config,
-  pkgs,
-  ...
-}: let
-  cfg = config.soispha.programs.nvim;
-in {
-  home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
-    # TODO: package lsp-progress-nvim though a module
-    extraConfigLuaPost = ''
-      ${lib.strings.fileContents ./lua/lsp-progress-nvim.lua}
-    '';
-    extraPlugins = [
-      pkgs.vimExtraPlugins.lsp-progress-nvim
-    ];
-
-    # Status line setup
-    autoGroups.lsp_refresh.clear = true;
-    autoCmd = [
-      {
-        event = ["User LspProgressStatusUpdated"];
-        pattern = ["*"];
-        callback =
-          /*
-          lua
-          */
-          {
-            __raw = ''
-              require("lualine").refresh
-            '';
-          };
-        group = "lsp_refresh";
-        description = "Refresh the statusbar when the lsp status was updated.";
-      }
-    ];
-    plugins.lualine = let
-      get_lsp_progress = {
-        __raw =
-          /*
-          lua
-          */
-          ''
-            require('lsp-progress').progress
-          '';
-      };
-    in {
-      sections = {
-        lualine_c = [{name = get_lsp_progress;}];
-      };
-    };
-  };
-}
diff --git a/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua b/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua
deleted file mode 100644
index 2886d821..00000000
--- a/modules/by-name/nv/nvim/plgs/lsp-progress-nvim/lua/lsp-progress-nvim.lua
+++ /dev/null
@@ -1,156 +0,0 @@
--- nixos-config - My current NixOS configuration
---
--- Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
--- SPDX-License-Identifier: GPL-3.0-or-later
---
--- This file is part of my nixos-config.
---
--- You should have received a copy of the License along with this program.
--- If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-
---- @type table<string, any>
-require("lsp-progress").setup({
-  -- Spinning icons.
-  --
-  --- @type string[]
-  spinner = { "⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷" },
-
-  -- Spinning update time in milliseconds.
-  --
-  --- @type integer
-  spin_update_time = 200,
-
-  -- Last message cached decay time in milliseconds.
-  --
-  -- Message could be really fast(appear and disappear in an
-  -- instant) that user cannot even see it, thus we cache the last message
-  -- for a while for user view.
-  --
-  --- @type integer
-  decay = 700,
-
-  -- User event name.
-  --
-  --- @type string
-  event = "LspProgressStatusUpdated",
-
-  -- Event update time limit in milliseconds.
-  --
-  -- Sometimes progress handler could emit many events in an instant, while
-  -- refreshing statusline cause too heavy synchronized IO, so we limit the
-  -- event rate to reduce this cost.
-  --
-  --- @type integer
-  event_update_time_limit = 100,
-
-  -- Max progress string length, by default -1 is unlimited.
-  --
-  --- @type integer
-  max_size = -1,
-
-  -- Regular internal update time.
-  --
-  -- Emit user event to update the lsp progress status, even there's no new
-  -- message.
-  --
-  --- @type integer
-  regular_internal_update_time = 500,
-
-  -- Disable emitting events on specific mode/filetype.
-  -- User events would interrupt insert mode, thus break which-key like plugins behaviour.
-  -- See:
-  --  * https://github.com/linrongbin16/lsp-progress.nvim/issues/50
-  --  * https://neovim.io/doc/user/builtin.html#mode()
-  --
-  --- @type table[]
-  disable_events_opts = { { mode = "i", filetype = "TelescopePrompt" } },
-
-  -- Format series message.
-  --
-  -- By default it looks like: `formatting isort (100%) - done`.
-  --
-  --- @param title string|nil
-  ---     Message title.
-  --- @param message string|nil
-  ---     Message body.
-  --- @param percentage number|nil
-  ---     Progress in percentage numbers: 0-100.
-  --- @param done boolean
-  ---     Indicate whether this series is the last one in progress.
-  --- @return string|nil messages
-  ---     The returned value will be passed to function `client_format` as
-  ---     one of the `series_messages` array, or ignored if return nil.
-  series_format = function(title, message, percentage, done)
-    local builder = {}
-    local has_title = false
-    local has_message = false
-    if title and title ~= "" then
-      table.insert(builder, title)
-      has_title = true
-    end
-    if message and message ~= "" then
-      table.insert(builder, message)
-      has_message = true
-    end
-    if percentage and (has_title or has_message) then table.insert(builder, string.format("(%.0f%%%%)", percentage)) end
-    if done and (has_title or has_message) then table.insert(builder, "- done") end
-    return table.concat(builder, " ")
-  end,
-
-  -- Format client message.
-  --
-  -- By default it looks like:
-  -- `[null-ls] ⣷ formatting isort (100%) - done, formatting black (50%)`.
-  --
-  --- @param client_name string
-  ---     Client name.
-  --- @param spinner string
-  ---     Spinner icon.
-  --- @param series_messages string[]|table[]
-  ---     Messages array.
-  --- @return string|nil messages
-  ---     The returned value will be passed to function `format` as one of the
-  ---     `client_messages` array, or ignored if return nil.
-  client_format = function(client_name, spinner, series_messages)
-    return #series_messages > 0
-        and ("[" .. client_name .. "] " .. spinner .. " " .. table.concat(series_messages, ", "))
-      or nil
-  end,
-
-  -- Format (final) message.
-  --
-  -- By default it looks like:
-  -- ` LSP [null-ls] ⣷ formatting isort (100%) - done, formatting black (50%)`
-  --
-  --- @param client_messages string[]|table[]
-  ---     Client messages array.
-  --- @return nil|string message
-  ---     The returned value will be returned from `progress` API.
-  format = function(client_messages)
-    local sign = " LSP" -- nf-fa-gear \uf013
-    return #client_messages > 0 and (sign .. " " .. table.concat(client_messages, " ")) or sign
-  end,
-
-  -- Enable debug.
-  --
-  --- @type boolean
-  debug = false,
-
-  -- Print log to console(command line).
-  --
-  --- @type boolean
-  console_log = false,
-
-  -- Print log to file.
-  --
-  --- @type boolean
-  file_log = true,
-
-  -- Log file to write, work with `file_log=true`.
-  --
-  -- For Windows: `$env:USERPROFILE\AppData\Local\nvim-data\lsp-progress.log`.
-  -- For *NIX: `~/.local/share/nvim/lsp-progress.log`.
-  --
-  --- @type string
-  file_log_name = "lsp-progress.log",
-})
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/openscad.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/openscad.nix
index fba1113f..3d55adfa 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/openscad.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/openscad.nix
@@ -25,9 +25,9 @@ in {
           cmd = {"openscad-lsp", "--stdio", "--fmt-style", "WebKit"},
         }
       '';
-    extraPackages = with pkgs; [
-      openscad-lsp
-      clang-tools # Need to satisfy `clang-format` (which is used by openscad-lsp)
+    extraPackages = [
+      pkgs.openscad-lsp
+      pkgs.clang-tools # Need to satisfy `clang-format` (which is used by openscad-lsp)
     ];
   };
 }
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/quick-lint-js.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/quick-lint-js.nix
index 82d3b5a9..404784f1 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/quick-lint-js.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/quick-lint-js.nix
@@ -24,8 +24,8 @@ in {
         require('lspconfig').quick_lint_js.setup{
         }
       '';
-    extraPackages = with pkgs; [
-      quick-lint-js
+    extraPackages = [
+      pkgs.quick-lint-js
     ];
   };
 }
diff --git a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ruff-lsp.nix b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ruff-lsp.nix
index 4f9834ee..3ad3ad8f 100644
--- a/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ruff-lsp.nix
+++ b/modules/by-name/nv/nvim/plgs/lsp/servers/servers/ruff-lsp.nix
@@ -21,6 +21,6 @@ in {
         enable = true;
       };
     };
-    extraPackages = with pkgs; [ruff];
+    extraPackages = [pkgs.ruff];
   };
 }
diff --git a/modules/by-name/nv/nvim/plgs/lspkind/default.nix b/modules/by-name/nv/nvim/plgs/lspkind/default.nix
index 6e966ad1..3846fa32 100644
--- a/modules/by-name/nv/nvim/plgs/lspkind/default.nix
+++ b/modules/by-name/nv/nvim/plgs/lspkind/default.nix
@@ -16,6 +16,6 @@
 in {
   home-manager.users.soispha.programs.nixvim.plugins.lspkind = lib.mkIf cfg.enable {
     enable = true;
-    preset = "default"; # "codicons" is only for a font patched with vscode-codeicons.
+    settings.preset = "default"; # "codicons" is only for a font patched with vscode-codeicons.
   };
 }
diff --git a/modules/by-name/nv/nvim/plgs/raw_plugins/default.nix b/modules/by-name/nv/nvim/plgs/raw_plugins/default.nix
deleted file mode 100644
index c981ee08..00000000
--- a/modules/by-name/nv/nvim/plgs/raw_plugins/default.nix
+++ /dev/null
@@ -1,26 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-{
-  config,
-  lib,
-  ...
-}: let
-  cfg = config.soispha.programs.nvim;
-in {
-  home-manager.users.soispha.programs.nixvim = lib.mkIf cfg.enable {
-    # Not all plugins have own modules
-    # You can add missing plugins here
-    # `pkgs.vimExtraPlugins` is added by the overlay you added at the beginning
-    # For a list of available plugins, look here:
-    # https://github.com/jooooscha/nixpkgs-vim-extra-plugins/blob/main/plugins.md
-    extraPlugins = [
-    ];
-  };
-}
diff --git a/modules/by-name/nv/nvim/plgs/treesitter/default.nix b/modules/by-name/nv/nvim/plgs/treesitter/default.nix
index c8b48cd1..ed1499f8 100644
--- a/modules/by-name/nv/nvim/plgs/treesitter/default.nix
+++ b/modules/by-name/nv/nvim/plgs/treesitter/default.nix
@@ -50,7 +50,7 @@ in {
           #  Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
           #  Using this option may slow down your editor; and you may see some duplicate highlights.
           #  Instead of true it can also be a list of languages
-          additionalVimRegexHighlighting = ["latex"];
+          additionalVimRegexHighlighting = [];
         };
 
         incrementalSelection = {
diff --git a/modules/by-name/nv/nvim/plgs/vim-tex/default.nix b/modules/by-name/nv/nvim/plgs/vim-tex/default.nix
index 739b69d9..9ee657c3 100644
--- a/modules/by-name/nv/nvim/plgs/vim-tex/default.nix
+++ b/modules/by-name/nv/nvim/plgs/vim-tex/default.nix
@@ -18,7 +18,7 @@ in {
     opts.conceallevel = 0;
 
     plugins.vimtex = {
-      enable = true;
+      enable = false;
       settings = {
         view_method = "zathura";
         quickfix_mode = -1;
diff --git a/modules/by-name/oo/oomd/module.nix b/modules/by-name/oo/oomd/module.nix
new file mode 100644
index 00000000..ca332939
--- /dev/null
+++ b/modules/by-name/oo/oomd/module.nix
@@ -0,0 +1,18 @@
+{
+  config,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.systemd.oomd;
+in {
+  options.soispha.systemd.oomd = {
+    enable = (lib.mkEnableOption "oomd") // {default = config.systemd.oomd.enable;};
+  };
+
+  config = lib.mkIf cfg.enable {
+    users = {
+      users.systemd-oom.uid = config.soispha.constants.ids.uids.systemd-oom;
+      groups.systemd-oom.gid = config.soispha.constants.ids.gids.systemd-oom;
+    };
+  };
+}
diff --git a/modules/by-name/op/openssh/module.nix b/modules/by-name/op/openssh/module.nix
index 97cf7fd7..f77c357b 100644
--- a/modules/by-name/op/openssh/module.nix
+++ b/modules/by-name/op/openssh/module.nix
@@ -7,18 +7,36 @@
 #
 # You should have received a copy of the License along with this program.
 # If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-{...}: {
-  services.openssh = {
-    enable = true;
-    hostKeys = [
-      {
-        path = "/srv/sshd/ssh_host_ed25519_key";
-        rounds = 1000;
-        type = "ed25519";
-      }
-    ];
-    settings = {
-      PasswordAuthentication = false;
+{
+  config,
+  lib,
+  libraries,
+  ...
+}: let
+  cfg = config.soispha.services.openssh;
+in {
+  options.soispha.services.openssh = {
+    enable = libraries.base.options.mkEnable "openssh";
+  };
+
+  config = lib.mkIf cfg.enable {
+    services.openssh = {
+      enable = true;
+      hostKeys = [
+        {
+          path = "/srv/sshd/ssh_host_ed25519_key";
+          rounds = 1000;
+          type = "ed25519";
+        }
+      ];
+
+      settings = {
+        PasswordAuthentication = false;
+      };
+    };
+    users = {
+      users.sshd.uid = config.soispha.constants.ids.uids.sshd;
+      groups.sshd.gid = config.soispha.constants.ids.gids.sshd;
     };
   };
 }
diff --git a/modules/by-name/po/polkit/module.nix b/modules/by-name/po/polkit/module.nix
index c6d1c750..d8dd51b0 100644
--- a/modules/by-name/po/polkit/module.nix
+++ b/modules/by-name/po/polkit/module.nix
@@ -17,7 +17,10 @@ in {
   options.soispha.polkit = {
     enable = lib.mkEnableOption "polkit";
   };
+
   config = lib.mkIf cfg.enable {
     security.polkit.enable = true;
+
+    users.groups.polkituser.gid = config.soispha.constants.ids.gids.polkituser;
   };
 }
diff --git a/modules/by-name/pi/printing/module.nix b/modules/by-name/pr/printing/module.nix
index cfcd2154..2e230570 100644
--- a/modules/by-name/pi/printing/module.nix
+++ b/modules/by-name/pr/printing/module.nix
@@ -19,6 +19,10 @@ in {
   };
 
   config = lib.mkIf cfg.enable {
+    soispha.impermanence.directories = [
+      "/var/lib/cups"
+    ];
+
     services.avahi = {
       enable = true;
       nssmdns4 = true;
@@ -26,29 +30,21 @@ in {
       openFirewall = true;
     };
 
+    users = {
+      users.avahi.uid = config.soispha.constants.ids.uids.avahi;
+      groups.avahi.gid = config.soispha.constants.ids.gids.avahi;
+      groups.lpadmin.gid = config.soispha.constants.ids.gids.lpadmin;
+    };
+
     services.printing = {
       enable = true;
       startWhenNeeded = true;
       webInterface = true;
 
       # deletes `/var/cache/cups`, `/var/lib/cups` and `/var/spool/cups` on cups startup
-      stateless = true;
+      stateless = false;
 
       drivers = [];
     };
-
-    hardware = {
-      printers = {
-        ensurePrinters = [
-          {
-            name = "Brother";
-            description = "Brother DCP-9022CDW";
-            model = "everywhere";
-            deviceUri = "dnssd://Brother%20DCP-9022CDW._ipp._tcp.local/?uuid=e3248000-80ce-11db-8000-30055c773bcf";
-          }
-        ];
-        ensureDefaultPrinter = "Brother";
-      };
-    };
   };
 }
diff --git a/modules/by-name/qu/qutebrowser/settings/default.nix b/modules/by-name/qu/qutebrowser/settings/default.nix
index a637796f..282c5816 100644
--- a/modules/by-name/qu/qutebrowser/settings/default.nix
+++ b/modules/by-name/qu/qutebrowser/settings/default.nix
@@ -7,7 +7,7 @@
   second = 1000 * millisecond;
 
   wordlist =
-    pkgs.runCommandNoCCLocal "wordlist" {
+    pkgs.runCommandLocal "wordlist" {
       nativeBuildInputs = [pkgs.python3];
     }
     ''
@@ -410,8 +410,7 @@ in {
 
   session = {
     default_name = null;
-    # TODO(@bpeetz): See https://github.com/qutebrowser/qutebrowser/issues/67 <2025-06-04>
-    lazy_restore = false;
+    lazy_restore = true;
   };
 
   spellcheck = {
@@ -497,10 +496,10 @@ in {
 
     open_base_url = false; # Of search engine.
     searchengines = rec {
-      DEFAULT = leta;
+      DEFAULT = duckduckgo;
 
-      leta = "https://leta.mullvad.net/search?q={}";
-      "@ls" = leta;
+      duckduckgo = "https://duckduckgo.com/search?q={}";
+      "@du" = duckduckgo;
 
       # NIX
       "@np" = "https://search.nixos.org/packages?type=packages&query={}"; # Nix packages
diff --git a/modules/by-name/re/resolvconf/module.nix b/modules/by-name/re/resolvconf/module.nix
new file mode 100644
index 00000000..e1817e2b
--- /dev/null
+++ b/modules/by-name/re/resolvconf/module.nix
@@ -0,0 +1,15 @@
+{
+  config,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.resolvconf;
+in {
+  options.soispha.resolvconf = {
+    enable = lib.mkEnableOption "resolvconf" // {default = config.networking.resolvconf.enable;};
+  };
+
+  config = lib.mkIf cfg.enable {
+    users.groups.resolvconf.gid = config.soispha.constants.ids.gids.resolvconf;
+  };
+}
diff --git a/modules/by-name/ri/river/init_base.sh b/modules/by-name/ri/river/init_base.sh
index b68d147b..edd7827f 100755
--- a/modules/by-name/ri/river/init_base.sh
+++ b/modules/by-name/ri/river/init_base.sh
@@ -10,8 +10,9 @@
 # You should have received a copy of the License along with this program.
 # If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# NOTE: Keep this in sync with the file from `river-start` <2025-02-03>
-RIVER_LOG_FILE="$HOME/.cache/river/log"
+RIVER_LOG_FILE="$HOME/.cache/river/init-log"
+
+echo >"$RIVER_LOG_FILE"
 
 err_fail() {
     if ! "$@"; then
diff --git a/modules/by-name/ri/river/keymap.nix b/modules/by-name/ri/river/keymap.nix
new file mode 100644
index 00000000..ca7ab69d
--- /dev/null
+++ b/modules/by-name/ri/river/keymap.nix
@@ -0,0 +1,189 @@
+{
+  lib,
+  pkgs,
+  libraries,
+  config,
+  ...
+}: let
+  index2tag = input: builtins.toString (libraries.base.pow 2 (input - 1));
+
+  mkTagCommand = name: index: [name (index2tag index)];
+  mkSpawn' = pkg: binaryName: args: further: (further
+    // (let
+      maybeSpace =
+        if args == ""
+        then ""
+        else " ";
+      maybeQuote =
+        if args == ""
+        then ""
+        else "\"";
+    in {
+      command = [
+        "spawn"
+        "${lib.getExe pkgs.notify-run} \"${lib.getExe' pkg binaryName}\"${maybeSpace}${maybeQuote}${args}${maybeQuote}"
+      ];
+
+      description = "${binaryName}${maybeSpace}${args}";
+    }));
+
+  mkSpawn = pkg: args: further: (mkSpawn' pkg pkg.meta.mainProgram args further);
+
+  setMode = path: {
+    command = [
+      "enter-mode"
+      (builtins.concatStringsSep "" path)
+    ];
+  };
+
+  cfg = config.soispha.programs.river;
+in {
+  soispha.programs.river.init.mappings.keymap = lib.mkIf cfg.enable (lib.fixedPoints.fix
+    (self: {
+      "<LEFT_SUPER>" = {
+        # Spawn standard programs
+        "r" = {
+          "a" = mkSpawn pkgs.alacritty "" {};
+          "b" = mkSpawn pkgs.tskm "open select" {once = true;};
+          "k" = mkSpawn pkgs.keepassxc "" {once = true;};
+          "s" = mkSpawn pkgs.signal-desktop "" {once = true;};
+          "p" = mkSpawn pkgs.screenshot_persistent "" {once = true;};
+          "i" = mkSpawn pkgs.anki "" {once = true;};
+        };
+
+        # Client changes
+        "c" = {
+          "F" = setMode ["<LEFT_META>" "f"];
+
+          "f" = ["toggle-fullscreen"];
+          "c" = ["close"];
+          " " = ["toggle-float"];
+          "<ENTER>" = ["zoom"];
+        };
+
+        # This is a fill in for <Super-L>, as that is otherwise nearly impossible to input.
+        "l" = self."<LEFT_SUPER>".x.l;
+
+        # River compositor control.
+        "x" = {
+          "q" = ["exit"];
+          "l" = mkSpawn pkgs.lock "" {once = true;};
+          "h" = mkSpawn' pkgs.procps "pkill" "--signal USR1 i3bar-river" {once = true;};
+        };
+
+        # Media control
+        "m" = {
+          "u" = mkSpawn' pkgs.wireplumber "wpctl" "set-volume @DEFAULT_SINK@ 5%+" {};
+          "d" = mkSpawn' pkgs.wireplumber "wpctl" "set-volume @DEFAULT_SINK@ 5%-" {};
+          "m" = mkSpawn' pkgs.wireplumber "wpctl" "set-mute @DEFAULT_SINK@ toggle" {};
+          "n" = mkSpawn pkgs.mpp "next" {};
+          "p" = mkSpawn pkgs.mpp "prev" {};
+          "t" = mkSpawn pkgs.mpp "toggle" {};
+        };
+
+        # Select tags for view.
+        "v" = {
+          "c" = setMode ["<LEFT_META>" "c"];
+          "f" = setMode ["<LEFT_META>" "f"];
+
+          "t" = ["swap" "next"];
+          "n" = ["swap" "previous"];
+          "T" = ["send-to-output" "next"];
+          "N" = ["send-to-output" "previous"];
+
+          "0" = ["set-view-tags" (builtins.toString ((libraries.base.pow 2 32) - 1))];
+          "p" = ["send-to-previous-tags"];
+
+          "1" = mkTagCommand "set-view-tags" 1;
+          "2" = mkTagCommand "set-view-tags" 2;
+          "3" = mkTagCommand "set-view-tags" 3;
+          "4" = mkTagCommand "set-view-tags" 4;
+          "5" = mkTagCommand "set-view-tags" 5;
+          "6" = mkTagCommand "set-view-tags" 6;
+          "7" = mkTagCommand "set-view-tags" 7;
+          "8" = mkTagCommand "set-view-tags" 8;
+          "9" = mkTagCommand "set-view-tags" 9;
+
+          # Add tags to view.
+          "a" = {
+            "1" = mkTagCommand "toggle-view-tags" 1;
+            "2" = mkTagCommand "toggle-view-tags" 2;
+            "3" = mkTagCommand "toggle-view-tags" 3;
+            "4" = mkTagCommand "toggle-view-tags" 4;
+            "5" = mkTagCommand "toggle-view-tags" 5;
+            "6" = mkTagCommand "toggle-view-tags" 6;
+            "7" = mkTagCommand "toggle-view-tags" 7;
+            "8" = mkTagCommand "toggle-view-tags" 8;
+            "9" = mkTagCommand "toggle-view-tags" 9;
+          };
+        };
+
+        # Select tags to focus,
+        # and change focus
+        "f" = {
+          "c" = setMode ["<LEFT_META>" "c"];
+          "v" = setMode ["<LEFT_META>" "v"];
+
+          "t" = ["focus-view" "next"];
+          "n" = ["focus-view" "previous"];
+          "T" = ["focus-output" "next"];
+          "N" = ["focus-output" "previous"];
+
+          "0" = ["set-focused-tags" (builtins.toString ((libraries.base.pow 2 32) - 1))];
+          "p" = ["focus-previous-tags"];
+
+          "1" = mkTagCommand "set-focused-tags" 1;
+          "2" = mkTagCommand "set-focused-tags" 2;
+          "3" = mkTagCommand "set-focused-tags" 3;
+          "4" = mkTagCommand "set-focused-tags" 4;
+          "5" = mkTagCommand "set-focused-tags" 5;
+          "6" = mkTagCommand "set-focused-tags" 6;
+          "7" = mkTagCommand "set-focused-tags" 7;
+          "8" = mkTagCommand "set-focused-tags" 8;
+          "9" = mkTagCommand "set-focused-tags" 9;
+        };
+      };
+
+      # Screen locking
+      "<Super-l>" = self."<LEFT_SUPER>".x.l;
+
+      # Audio
+      "<MEDIA_RAISEVOLUME>" =
+        self."<LEFT_SUPER>".m.u
+        // {
+          allow_locked = true;
+        };
+      "<MEDIA_LOWERVOLUME>" =
+        self."<LEFT_SUPER>".m.d
+        // {
+          allow_locked = true;
+        };
+      "<MEDIA_MUTEVOLUME>" =
+        self."<LEFT_SUPER>".m.m
+        // {
+          allow_locked = true;
+        };
+      "<MEDIA_TRACKNEXT>" =
+        self."<LEFT_SUPER>".m.n
+        // {
+          allow_locked = true;
+        };
+      "<MEDIA_TRACKPREVIOUS>" =
+        self."<LEFT_SUPER>".m.p
+        // {
+          allow_locked = true;
+        };
+      "<MEDIA_PLAY>" =
+        self."<LEFT_SUPER>".m.t
+        // {
+          allow_locked = true;
+        };
+
+      # Mouse
+      "<Alt-<MOUSE_LEFT>>" = ["move-view"];
+      "<Alt-<MOUSE_RIGHT>>" = ["resize-view"];
+
+      # Screenshot
+      "<PRINTSCREEN>" = self."<LEFT_SUPER>".r.p;
+    }));
+}
diff --git a/modules/by-name/ri/river/module.nix b/modules/by-name/ri/river/module.nix
index 38d4bdef..75725a8d 100644
--- a/modules/by-name/ri/river/module.nix
+++ b/modules/by-name/ri/river/module.nix
@@ -17,7 +17,7 @@
 }: let
   cfg = config.soispha.programs.river;
   esa = lib.strings.escapeShellArg;
-  riverctl = lib.getExe' pkgs.river "riverctl";
+  riverctl = lib.getExe' cfg.package "riverctl";
 
   mkOutputFlags = output: flags: let
     expandedFlags = builtins.concatStringsSep " " (lib.attrsets.mapAttrsToList (flag: value: "--${esa flag} ${esa value}") flags);
@@ -36,10 +36,22 @@
   longRunningPrograms = builtins.concatStringsSep "\n" (builtins.map mkLrProgram cfg.init.backgroundStart);
 
   keymapFormat = pkgs.formats.json {};
+  keymapGenerate = name: value:
+    pkgs.runCommandLocal "mk-${name}-and-check" {
+      nativeBuildInputs = [pkgs.river-mk-keymap];
+      preferLocalBuild = true;
+
+      env = {
+        JSON_FILE = keymapFormat.generate name value;
+      };
+    } ''
+      river-mk-keymap --keymap "$JSON_FILE" init --dry-run;
+      cp "$JSON_FILE" "$out"
+    '';
 
   keymappings = ''
     err_fail ${riverctl} keyboard-layout ${esa cfg.init.mappings.layout}
-    err_fail ${lib.getExe pkgs.river-mk-keymap} ${keymapFormat.generate "keys.json" cfg.init.mappings.keymap}
+    err_fail ${lib.getExe pkgs.river-mk-keymap} --keymap ${keymapGenerate "keys.json" cfg.init.mappings.keymap} init
   '';
 
   mkRule = {
@@ -72,6 +84,8 @@ in {
   options.soispha.programs.river = {
     enable = lib.mkEnableOption "river";
 
+    package = lib.mkPackageOption pkgs "river-classic" {};
+
     unicodeInput = {
       enable = lib.mkEnableOption "udev rules for rawhid based unicode input";
     };
@@ -175,6 +189,10 @@ in {
     };
   };
 
+  imports = [
+    ./keymap.nix
+  ];
+
   config = lib.mkIf cfg.enable {
     services.udev.packages = lib.mkIf cfg.unicodeInput.enable [externalBinaries.qmk_firmware.packages.${system}.qmk_unicode_type];
 
@@ -219,7 +237,7 @@ in {
           + mkHeading "Background services" longRunningPrograms
           + mkHeading "Layout Setup" ''
             err_fail ${riverctl} default-layout rivertile
-            ${lib.getExe' pkgs.river "rivertile"} -main-ratio 0.5 -view-padding 1 -outer-padding 0
+            ${lib.getExe' cfg.package "rivertile"} -main-ratio 0.5 -view-padding 1 -outer-padding 0
           '';
       };
     };
diff --git a/modules/by-name/ri/river/river-start/package.nix b/modules/by-name/ri/river/river-start/package.nix
index 10957cc0..3ae204b7 100644
--- a/modules/by-name/ri/river/river-start/package.nix
+++ b/modules/by-name/ri/river/river-start/package.nix
@@ -9,13 +9,13 @@
 # If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   writeShellApplication,
-  river,
+  river-classic,
 }:
 writeShellApplication {
   name = "river-start";
   text = builtins.readFile ./river-start.sh;
   runtimeInputs = [
-    river
+    river-classic
   ];
   meta = {
     mainProgram = "river-start";
diff --git a/modules/by-name/ri/river/river-start/river-start.sh b/modules/by-name/ri/river/river-start/river-start.sh
index b4c5b0a6..55eddfcf 100755
--- a/modules/by-name/ri/river/river-start/river-start.sh
+++ b/modules/by-name/ri/river/river-start/river-start.sh
@@ -10,8 +10,7 @@
 # You should have received a copy of the License along with this program.
 # If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 
-# NOTE: Keep this in sync with the file from `base_init.sh` <2025-02-03>
-RIVER_LOG_FILE="$HOME/.cache/river/log"
+RIVER_LOG_FILE="$HOME/.cache/river/wm-log"
 
 [ -d "$(dirname "$RIVER_LOG_FILE")" ] || mkdir --parents "$(dirname "$RIVER_LOG_FILE")"
 
diff --git a/modules/by-name/ro/rofi/module.nix b/modules/by-name/ro/rofi/module.nix
new file mode 100644
index 00000000..f2b404d6
--- /dev/null
+++ b/modules/by-name/ro/rofi/module.nix
@@ -0,0 +1,31 @@
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+{
+  config,
+  lib,
+  libraries,
+  ...
+}: let
+  cfg = config.soispha.programs.rofi;
+in {
+  options.soispha.programs.rofi = {
+    enable = libraries.base.options.mkEnable "rofi";
+  };
+
+  config = lib.mkIf cfg.enable {
+    home-manager.users.soispha = {
+      programs.rofi = {
+        enable = true;
+        terminal = lib.getExe config.soispha.programs.alacritty.package;
+        theme = ./nord-twoLines.rasi;
+      };
+    };
+  };
+}
diff --git a/modules/by-name/ro/rofi/nord-twoLines.rasi b/modules/by-name/ro/rofi/nord-twoLines.rasi
new file mode 100644
index 00000000..612b907f
--- /dev/null
+++ b/modules/by-name/ro/rofi/nord-twoLines.rasi
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * ROFI TWO LINES THEME USING THE NORD COLOR PALETTE
+ * User                 : LR-Tech
+ * Theme Repo           : https://github.com/lr-tech/rofi-themes-collection
+ * Nord Project Repo    : https://github.com/arcticicestudio/nord
+ *******************************************************************************/
+
+* {
+    font:   "Fira Code 10";
+
+    nord0:     #2e3440;
+    nord1:     #3b4252;
+    nord2:     #434c5e;
+    nord3:     #4c566a;
+
+    nord4:     #d8dee9;
+    nord5:     #e5e9f0;
+    nord6:     #eceff4;
+
+    nord7:     #8fbcbb;
+    nord8:     #88c0d0;
+    nord9:     #81a1c1;
+    nord10:    #5e81ac;
+    nord11:    #bf616a;
+
+    nord12:    #d08770;
+    nord13:    #ebcb8b;
+    nord14:    #a3be8c;
+    nord15:    #b48ead;
+
+    background-color:   transparent;
+    text-color:         @nord4;
+    accent-color:       @nord8;
+
+    margin:     0px;
+    padding:    0px;
+    spacing:    0px;
+}
+
+window {
+    background-color:   @nord0;
+
+    location:   north;
+    width:      100%;
+}
+
+inputbar {
+    padding:    2px 8px;
+    spacing:    8px;
+    children:   [ prompt, entry ];
+}
+
+prompt, entry, element-text, element-icon {
+    vertical-align: 0.5;
+}
+
+prompt {
+    text-color: @accent-color;
+}
+
+listview {
+    lines:      1;
+    columns:    4;
+}
+
+element {
+    padding:    1px 8px;
+    spacing:    4px;
+}
+
+element normal urgent {
+    text-color: @nord13;
+}
+
+element normal active {
+    text-color: @accent-color;
+}
+
+element selected {
+    text-color: @nord0;
+}
+
+element selected normal {
+    background-color:   @accent-color;
+}
+
+element selected urgent {
+    background-color:   @nord13;
+}
+
+element selected active {
+    background-color:   @nord8;
+}
+
+element-icon {
+    size:   0.75em;
+}
+
+element-text {
+    text-color: inherit;
+}
diff --git a/modules/by-name/yt/yt/input.conf.license b/modules/by-name/ro/rofi/nord-twoLines.rasi.license
index eae6a84c..eae6a84c 100644
--- a/modules/by-name/yt/yt/input.conf.license
+++ b/modules/by-name/ro/rofi/nord-twoLines.rasi.license
diff --git a/modules/by-name/so/sound/module.nix b/modules/by-name/so/sound/module.nix
index 622cc01d..06df63e5 100644
--- a/modules/by-name/so/sound/module.nix
+++ b/modules/by-name/so/sound/module.nix
@@ -9,13 +9,14 @@
 # If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {
   config,
+  libraries,
   lib,
   ...
 }: let
   cfg = config.soispha.sound;
 in {
   options.soispha.sound = {
-    enable = lib.mkEnableOption "sound based on pipewire";
+    enable = libraries.base.options.mkEnable "sound based on pipewire";
   };
 
   config = lib.mkIf cfg.enable {
@@ -30,6 +31,11 @@ in {
       jack.enable = true;
     };
 
+    users = {
+      users.rtkit.uid = config.soispha.constants.ids.uids.rtkit;
+      groups.rtkit.gid = config.soispha.constants.ids.gids.rtkit;
+    };
+
     # TODO: Find a better way to set the default volume <2024-03-10>
     #
     # environment.etc.pipewire-pulse-config = {
diff --git a/modules/by-name/ss/ssh/module.nix b/modules/by-name/ss/ssh/module.nix
index 91cc4aeb..f7218e36 100644
--- a/modules/by-name/ss/ssh/module.nix
+++ b/modules/by-name/ss/ssh/module.nix
@@ -14,6 +14,18 @@
   ...
 }: let
   cfg = config.soispha.programs.ssh;
+
+  mkDefaultMatchBlock = userKnownHostsFile: {
+    addKeysToAgent = "no";
+    compression = true;
+    controlMaster = "no";
+    controlPersist = "no";
+    forwardAgent = false;
+    hashKnownHosts = false;
+    serverAliveCountMax = 3;
+    serverAliveInterval = 240;
+    inherit userKnownHostsFile;
+  };
 in {
   options.soispha.programs.ssh = {
     enable = lib.mkEnableOption "ssh config";
@@ -34,21 +46,21 @@ in {
     home-manager.users = {
       root.programs.ssh = {
         enable = true;
-        compression = true;
-        hashKnownHosts = false;
-        serverAliveInterval = 240;
-        userKnownHostsFile = builtins.toString (pkgs.writeTextFile {
-          name = "root-known-hosts";
-          text = cfg.rootKnownHosts;
-        });
+        enableDefaultConfig = false;
+
+        matchBlocks."*" = mkDefaultMatchBlock (
+          builtins.toString (pkgs.writeTextFile {
+            name = "root-known-hosts";
+            text = cfg.rootKnownHosts;
+          })
+        );
       };
 
       soispha.programs.ssh = {
         enable = true;
-        compression = true;
-        hashKnownHosts = false;
-        serverAliveInterval = 240;
-        userKnownHostsFile = "${config.home-manager.users.soispha.xdg.dataHome}/ssh/known_hosts";
+        enableDefaultConfig = false;
+
+        matchBlocks."*" = mkDefaultMatchBlock "${config.home-manager.users.soispha.xdg.dataHome}/ssh/known_hosts";
       };
     };
   };
diff --git a/modules/by-name/st/steam/module.nix b/modules/by-name/st/steam/module.nix
index a02b2e4b..87cdc709 100644
--- a/modules/by-name/st/steam/module.nix
+++ b/modules/by-name/st/steam/module.nix
@@ -10,7 +10,6 @@
 {
   lib,
   config,
-  pkgs,
   ...
 }: let
   cfg = config.soispha.programs.steam;
@@ -22,8 +21,8 @@ in {
   config = lib.mkIf cfg.enable {
     nixpkgs.config.allowUnfreePredicate = pkg:
       builtins.elem (lib.getName pkg) [
-        # NOTE: These are not really applied. Look at
-        # <modules/by-name/ni/nixpkgs/config.nix> instead. <2025-04-25>
+        # NOTE: These are not really applied. Needs to be at
+        # <modules/by-name/ni/nixpkgs/config.nix> for some reason. <2025-04-25>
         "steam"
         "steam-unwrapped"
         "steam-original"
diff --git a/modules/by-name/ta/taskwarrior/module.nix b/modules/by-name/ta/taskwarrior/module.nix
index bb881768..d757be90 100644
--- a/modules/by-name/ta/taskwarrior/module.nix
+++ b/modules/by-name/ta/taskwarrior/module.nix
@@ -16,7 +16,7 @@
   cfg = config.soispha.programs.taskwarrior;
 
   hooksDir =
-    pkgs.runCommandNoCCLocal "mk-taskwarrior-hooks" {}
+    pkgs.runCommandLocal "mk-taskwarrior-hooks" {}
     (''
         mkdir "$out"
       ''
diff --git a/modules/by-name/up/upower/module.nix b/modules/by-name/up/upower/module.nix
new file mode 100644
index 00000000..f5a62ed7
--- /dev/null
+++ b/modules/by-name/up/upower/module.nix
@@ -0,0 +1,23 @@
+{
+  config,
+  lib,
+  ...
+}: let
+  cfg = config.soispha.services.upower;
+in {
+  options.soispha.services.upower = {
+    enable = lib.mkEnableOption "upower";
+  };
+
+  config = lib.mkIf cfg.enable {
+    services.upower = {
+      enable = true;
+      usePercentageForPolicy = true;
+
+      percentageLow = 15;
+      percentageAction = 10;
+
+      criticalPowerAction = "Hibernate";
+    };
+  };
+}
diff --git a/modules/by-name/us/users/module.nix b/modules/by-name/us/users/module.nix
index 555e61f9..65b75d2e 100644
--- a/modules/by-name/us/users/module.nix
+++ b/modules/by-name/us/users/module.nix
@@ -25,7 +25,7 @@ in {
     };
     groups = lib.mkOption {
       type = lib.types.listOf lib.types.str;
-      default = ["wheel"];
+      default = ["wheel" "audio"];
       description = "The groups the soispha user should be part of";
     };
 
diff --git a/modules/by-name/xd/xdg/module.nix b/modules/by-name/xd/xdg/module.nix
index 496ed129..9ff71ca0 100644
--- a/modules/by-name/xd/xdg/module.nix
+++ b/modules/by-name/xd/xdg/module.nix
@@ -100,20 +100,18 @@ in {
         };
         config = {
           common = {
-            # NOTE: The next entry is supposedly needed for gtk based apps <2023-08-31>
-            default = ["wlr" "gtk"];
+            default = ["wlr"];
             "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"];
           };
 
           # TODO: Also activate, when on another wlr-based compositor <2023-11-25>
           river = {
-            default = ["wlr" "gtk"];
+            default = ["wlr"];
             "org.freedesktop.impl.portal.FileChooser" = ["termfilechooser"];
           };
         };
 
         extraPortals = [
-          pkgs.xdg-desktop-portal-gtk
           pkgs.xdg-desktop-portal-wlr
           pkgs.xdg-desktop-portal-termfilechooser
         ];
diff --git a/modules/by-name/ya/yambar/config/config.yml b/modules/by-name/ya/yambar/config/config.yml
deleted file mode 100644
index 14da18fd..00000000
--- a/modules/by-name/ya/yambar/config/config.yml
+++ /dev/null
@@ -1,52 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-
----
-# Config file for yambar
-# Note that this may be version-dependent, this file is written for v1.8.0
-
-bar:
-  right:
-   # - network:
-   #    name: wlp5s0
-   #    poll-interval: 10
-   #    content:
-   #      map:
-   #        on-click: /bin/sh -c "nmtui"
-   #        conditions:
-   #          ~carrier: {empty: {}}
-   #          carrier:
-   #            string: {text: "  {ssid} ", deco: *combutil}
-   # - network:
-   #    name: enp4s0
-   #    content:
-   #      map:
-   #        on-click: /bin/sh -c "nmtui"
-   #        conditions:
-   #          ~carrier:
-   #            string: {text: "  Eth failed ", deco: *combutil}
-   #          carrier: {empty: {}}
-   # - script:   # Grade average
-   #     path: grade_average_script
-   #     content:
-   #       string:
-   #         text: "   {grade} "
-   #         deco: *combmem
-   # - script:   # tray
-   #    path: /home/dt/.config/yambar/scripts/yambar-tray
-   #    content:
-   #      empty: {}
-   # - script:
-   #    path: /home/dt/.config/yambar/scripts/yambar-tray-width
-   #    poll-interval: 10
-   #    content:
-   #      string:
-   #         text: "{padding}"
-   #         deco: *combmem
diff --git a/modules/by-name/ya/yambar/module.nix b/modules/by-name/ya/yambar/module.nix
deleted file mode 100644
index 40edf978..00000000
--- a/modules/by-name/ya/yambar/module.nix
+++ /dev/null
@@ -1,78 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-{
-  config,
-  pkgs,
-  lib,
-  ...
-}: let
-  cfg = config.soispha.programs.yambar;
-
-  makeScript = {
-    name,
-    dependencies,
-    ...
-  }:
-    lib.getExe (pkgs.writeShellApplication {
-      inherit name;
-      text = builtins.readFile ./scripts/${name}.sh;
-      runtimeInputs = dependencies ++ (builtins.attrValues {inherit (pkgs) dash;});
-    });
-
-  mkWrapper = bin: cmd:
-    pkgs.writeShellScript cmd ''
-      ${bin} ${cmd}
-    '';
-in {
-  options.soispha.programs.yambar = {
-    enable = lib.mkEnableOption "yambar";
-
-    laptop = lib.mkEnableOption "laptop specific settings";
-    backlight = lib.mkOption {
-      type = lib.types.str;
-      example = "intel_backlight";
-      description = "Which backlight to query for the screen brightness";
-    };
-  };
-
-  config = lib.mkIf cfg.enable {
-    home-manager.users.soispha = {
-      programs.yambar = {
-        enable = true;
-        settings = import ./settings {
-          inherit lib;
-          inherit (cfg) laptop;
-          laptopBacklightName = cfg.backlight;
-
-          scripts = {
-            mpd_song_name_script = makeScript {
-              dependencies = [pkgs.mpc];
-              name = "mpd_song_name";
-            };
-
-            volume_script = makeScript {
-              dependencies = with pkgs; [pulseaudio gawk coreutils];
-              name = "sound-volume";
-            };
-
-            cpu_script = mkWrapper (lib.getExe pkgs.yambar-modules) "cpu";
-
-            memory_script = mkWrapper (lib.getExe pkgs.yambar-modules) "memory";
-
-            disk_script = makeScript {
-              dependencies = with pkgs; [gawk btrfs-progs coreutils];
-              name = "disk";
-            };
-          };
-        };
-      };
-    };
-  };
-}
diff --git a/modules/by-name/ya/yambar/scripts/disk.sh b/modules/by-name/ya/yambar/scripts/disk.sh
deleted file mode 100755
index 4efe1384..00000000
--- a/modules/by-name/ya/yambar/scripts/disk.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#! /usr/bin/env dash
-
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-# Main loop
-while true; do
-    # vars
-    used_space=$(btrfs filesystem usage /srv 2>/dev/null | awk '{if ( /Used:/ ) { print $2 } } ' | head -n1)
-    all_space=$(btrfs filesystem usage /srv 2>/dev/null | awk '{if ( /Device size:/ ) { print $3 } } ' | head -n1 | tr -d "GiB")
-
-    # Check space available (4) and percentage used (5)
-    spaceperc=$(echo "$(echo "$used_space" | tr -d "GiB")" "$all_space" | awk '{div=$1/$2;div *= 100; printf"%2d%%\n",div }')
-
-    echo "diskspace|string|$used_space"
-    echo "diskperc|string|$spaceperc"
-    echo ""
-    sleep 1
-done
-
-# vim: ft=sh
diff --git a/modules/by-name/ya/yambar/scripts/mpd_song_name.sh b/modules/by-name/ya/yambar/scripts/mpd_song_name.sh
deleted file mode 100755
index 5c288d1a..00000000
--- a/modules/by-name/ya/yambar/scripts/mpd_song_name.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/usr/bin/env dash
-
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-while true; do
-    state="$(mpc status '%state%')"
-
-    if [ "$state" = "playing" ]; then
-        song="$(mpc --format '[[%artist% - ]%title%]|[%file%]' current)"
-        echo "playing|bool|true"
-        echo "song|string|$song :: $(mpc status "%currenttime%/%totaltime%")"
-    else
-        echo "playing|bool|false"
-    fi
-    echo "" # commit
-
-    sleep 2
-done
-
-# vim: ft=sh
diff --git a/modules/by-name/ya/yambar/scripts/network.sh b/modules/by-name/ya/yambar/scripts/network.sh
deleted file mode 100755
index d642e6c7..00000000
--- a/modules/by-name/ya/yambar/scripts/network.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#! /usr/bin/env dash
-
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-retest=120
-retest_if_con_fails=10
-backend=nmcli
-
-case "$backend" in
-"nmcli") # Test for connectivity with nmcli
-    while true; do
-        connection_status=$(nmcli networking connectivity)
-        if [ "$connection_status" = "full" ]; then
-            echo "internet|string|Connected"
-            echo ""
-            sleep $retest
-        else
-            echo "internet|string|Disconnected"
-            echo ""
-            sleep $retest_if_con_fails
-        fi
-    done
-    ;;
-"ping") # Test for connectivity with ping
-    ip_address='8.8.8.8'
-    ping_number=3
-
-    while true; do
-
-        ping_result=$(mktmp)
-        ping $ip_address -c $ping_number -q | awk 'BEGIN {FS="/"} END {print $5}' >"$ping_result"
-
-        if [ "$(wc -l <"$ping_result")" -eq 0 ]; then
-            echo "med|string|No connection"
-            echo ""
-            sleep $retest_if_con_fails
-        else
-            echo "med|string|$(cat "$ping_result") ms"
-            echo ""
-            sleep $retest
-        fi
-    done
-    ;;
-esac
-
-# vim: ft=sh
diff --git a/modules/by-name/ya/yambar/scripts/sound-volume.sh b/modules/by-name/ya/yambar/scripts/sound-volume.sh
deleted file mode 100755
index 9d9f7be8..00000000
--- a/modules/by-name/ya/yambar/scripts/sound-volume.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#! /usr/bin/env dash
-
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-
-# shellcheck source=/dev/null
-SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
-while true; do
-    volume="$(pactl get-sink-volume 0 | awk 'BEGIN { FS="/" } {gsub("%","",$2); gsub(" ","",$2)} {printf $2}')"
-
-    if [ "$volume" -eq 0 ]; then
-        echo "muted|bool|true"
-    else
-        echo "volume|string|$volume"
-        echo "muted|bool|false"
-    fi
-    echo ""
-
-    sleep 3
-done
-
-# vim: ft=sh
diff --git a/modules/by-name/ya/yambar/settings/default.nix b/modules/by-name/ya/yambar/settings/default.nix
deleted file mode 100644
index ebe17261..00000000
--- a/modules/by-name/ya/yambar/settings/default.nix
+++ /dev/null
@@ -1,383 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-# TODO: This should not do something depending on whether the host is a laptop or not. It
-# should instead match on monitor-width or scale factor. <2024-11-29>
-{
-  lib,
-  laptop ? false,
-  laptopBacklightName ? null,
-  scripts,
-}: let
-  mkUnderline = color: {
-    underline = {
-      inherit color;
-      size = 3;
-    };
-  };
-
-  shellExec = cmd: ''sh -c "${cmd}"'';
-
-  values = {
-    foreground = {
-      blue = "99d1dbff";
-      focus = "e78284ff";
-      green = "a6e3a1dd";
-      lavendar = "b4befedd";
-      mauve = "cba6f7dd";
-      none = "00000000";
-      normal = "c6ceefff";
-      peach = "fab387dd";
-      sapphire = "74c7ecdd";
-      teal = "94e2d5dd";
-    };
-    font = {
-      main = "Source Code Pro:pixelsize=${
-        builtins.toString (
-          if laptop
-          then 22
-          else 26
-        )
-      }";
-      aws = "Font Awesome 5 Free:style=solid:pixelsize=${
-        builtins.toString (
-          if laptop
-          then 20
-          else 23
-        )
-      }";
-    };
-    background = {
-      normal = "303446ff";
-      tag = "585b70ff";
-      tag2 = "45475aff";
-      urgent = "e78284ff";
-    };
-    backgroundBlock = {
-      normal = {background = {color = values.background.normal;};};
-      urgent = {background = {color = values.background.urgent;};};
-    };
-    underline = {
-      battery = mkUnderline values.foreground.sapphire;
-      clock = mkUnderline values.foreground.teal;
-      focused = mkUnderline values.foreground.focus;
-      resources = mkUnderline values.foreground.green;
-      title = mkUnderline values.background.tag;
-      urgent = mkUnderline values.foreground.blue;
-      utils = mkUnderline values.foreground.peach;
-      weather = mkUnderline values.foreground.lavendar;
-    };
-    combination = {
-      battery.stack = [
-        values.backgroundBlock.normal
-        values.underline.battery
-      ];
-      clock.stack = [
-        values.backgroundBlock.normal
-        values.underline.clock
-      ];
-      resources.stack = [
-        values.backgroundBlock.normal
-        values.underline.resources
-      ];
-      utils.stack = [
-        values.backgroundBlock.normal
-        values.underline.utils
-      ];
-      weather.stack = [
-        values.backgroundBlock.normal
-        values.underline.weather
-      ];
-    };
-  };
-in {
-  bar = {
-    background = values.foreground.none;
-    foreground = values.foreground.normal;
-
-    font = values.font.main;
-    height =
-      if laptop
-      then 25
-      else 45;
-    margin =
-      if laptop
-      then 5
-      else 10;
-    location = "top";
-    layer = "bottom";
-    spacing = 0;
-
-    border = {
-      margin = 0;
-      top-margin = 10;
-    };
-
-    left = [
-      {
-        river = let
-          tag_base_setting = {
-            map = let
-              normal = {
-                string = {
-                  margin = 10;
-                  text = "{id}";
-                };
-              };
-            in {
-              default = normal;
-              conditions = {
-                "state == focused" = {
-                  string = {
-                    deco = {
-                      stack = [
-                        {background = {color = values.background.tag;};}
-                        values.underline.focused
-                      ];
-                    };
-                    margin = 10;
-                    text = "{id}";
-                  };
-                };
-                "state == invisible" = {
-                  map = {
-                    conditions = {
-                      occupied = {
-                        string = {
-                          deco = {background = {color = values.background.tag2;};};
-                          margin = 10;
-                          text = "{id}";
-                        };
-                      };
-                      "~occupied" = normal;
-                    };
-                  };
-                };
-                "state == unfocused" = {
-                  string = {
-                    deco = {background = {color = values.background.tag2;};};
-                    margin = 10;
-                    text = "{id}";
-                  };
-                };
-                "state == urgent" = {
-                  string = {
-                    deco = {
-                      stack = [
-                        {background = {color = values.background.urgent;};}
-                        values.underline.urgent
-                      ];
-                    };
-                    margin = 10;
-                    text = "{id}";
-                  };
-                };
-              };
-            };
-          };
-        in {
-          content = {
-            map = {
-              conditions = {
-                "id == 1" = tag_base_setting;
-                "id == 2" = tag_base_setting;
-                "id == 3" = tag_base_setting;
-                "id == 4" = tag_base_setting;
-                "id == 5" = tag_base_setting;
-                "id == 6" = tag_base_setting;
-                "id == 7" = tag_base_setting;
-                "id == 8" = tag_base_setting;
-                "id == 9" = tag_base_setting;
-              };
-              on-click = {
-                left = shellExec "riverctl set-focused-tags $((1 << ({id} - 1)))";
-                middle = shellExec "riverctl toggle-view-tags $((1 << ({id} -1)))";
-                right = shellExec "riverctl toggle-focused-tags $((1 << ({id} -1)))";
-              };
-            };
-          };
-          title = {
-            map = {
-              conditions = {"title == \"\"" = {string = {text = "";};};};
-              default = {
-                string = {
-                  max = 35;
-                  deco = values.underline.title;
-                  left-margin = 12;
-                  right-margin = 12;
-                  text = "{title}";
-                };
-              };
-            };
-          };
-        };
-      }
-    ];
-
-    center = [
-      {
-        clock = {
-          date-format = "%d/%m/%y (%a)";
-          time-format = "%H:%M:%S %Z";
-          foreground = values.foreground.blue;
-          content = {
-            string = {
-              deco = values.combination.clock;
-              text = " {date} {time} ";
-            };
-          };
-        };
-      }
-    ];
-
-    right =
-      [
-        {
-          script = {
-            path = scripts.mpd_song_name_script;
-            content.map.conditions = {
-              playing = {
-                string = {
-                  deco = values.combination.weather;
-                  text = "{song} ";
-                };
-              };
-              "~playing" = {
-                string = {
-                  deco = values.combination.weather;
-                  text = "";
-                };
-              };
-            };
-          };
-        }
-        {
-          script = {
-            path = scripts.volume_script;
-            content.map = {
-              on-click = shellExec "pavucontrol";
-              conditions = {
-                muted = {
-                  string = {
-                    deco = values.backgroundBlock.urgent;
-                    text = " 󰝟 ";
-                  };
-                };
-                "~muted" = {
-                  string = {
-                    deco = values.combination.utils;
-                    text = "  {volume}% ";
-                  };
-                };
-              };
-            };
-          };
-        }
-        {
-          script = {
-            path = scripts.cpu_script;
-            content.string = {
-              deco = values.combination.resources;
-              text = "  {cpu}% ";
-            };
-          };
-        }
-        {
-          script = {
-            path = scripts.memory_script;
-            content.map.conditions = {
-              swapstate = {
-                string = {
-                  deco = values.combination.resources;
-                  text = "  {memperc}%({swapperc}%) ";
-                };
-              };
-              "~swapstate" = {
-                string = {
-                  deco = values.combination.resources;
-                  text = "  {memperc}% ";
-                };
-              };
-            };
-          };
-        }
-        {
-          script = {
-            path = scripts.disk_script;
-            content.string = {
-              deco = values.combination.resources;
-              text = " 󰋊 {diskspace}({diskperc})";
-            };
-          };
-        }
-      ]
-      ++ lib.optionals laptop [
-        {
-          backlight = {
-            name = laptopBacklightName;
-            content.string = {
-              text = "  {percent}% ";
-              deco = values.combination.utils;
-            };
-          };
-        }
-        {
-          battery = {
-            name = "BAT0";
-            poll-interval = 300;
-            content.list.items = [
-              {
-                ramp = {
-                  tag = "capacity";
-                  items = let
-                    stack = [
-                      values.backgroundBlock.normal
-                      values.underline.battery
-                    ];
-                  in [
-                    {
-                      string = {
-                        text = "  {capacity}%({estimate}) ";
-                        deco =
-                          values.backgroundBlock.urgent;
-                      };
-                    }
-                    {
-                      string = {
-                        text = "  {capacity}%({estimate}) ";
-                        deco.stack = stack;
-                      };
-                    }
-                    {
-                      string = {
-                        text = "  {capacity}%({estimate}) ";
-                        deco.stack = stack;
-                      };
-                    }
-                    {
-                      string = {
-                        text = "  {capacity}%({estimate}) ";
-                        deco.stack = stack;
-                      };
-                    }
-                    {
-                      string = {
-                        text = "  {capacity}%({estimate}) ";
-                        deco.stack = stack;
-                      };
-                    }
-                  ];
-                };
-              }
-            ];
-          };
-        }
-      ];
-  };
-}
diff --git a/modules/by-name/yt/yt/config.toml b/modules/by-name/yt/yt/config.toml
deleted file mode 100644
index aecb74ba..00000000
--- a/modules/by-name/yt/yt/config.toml
+++ /dev/null
@@ -1,12 +0,0 @@
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-
-[download]
-max_cache_size = "5 GiB"
diff --git a/modules/by-name/yt/yt/external_commands_script.sh b/modules/by-name/yt/yt/external_commands_script.sh
new file mode 100755
index 00000000..2e59e94a
--- /dev/null
+++ b/modules/by-name/yt/yt/external_commands_script.sh
@@ -0,0 +1,9 @@
+#! /usr/bin/env sh
+
+riverctl focus-output next
+
+alacritty --title "floating please" --command "$@"
+
+riverctl focus-output next
+
+# vim: ft=sh
diff --git a/modules/by-name/yt/yt/input.conf b/modules/by-name/yt/yt/input.conf
deleted file mode 100644
index 68dad824..00000000
--- a/modules/by-name/yt/yt/input.conf
+++ /dev/null
@@ -1,14 +0,0 @@
-c script-message yt-comments-external
-C script-message yt-comments-local
-
-d script-message yt-description-external
-D script-message yt-description-local
-
-WHEEL_LEFT playlist-prev
-WHEEL_RIGHT playlist-next
-
-q script-message yt-mark-watched
-Q script-message yt-mark-picked
-r script-message yt-check-new-videos
-
-P quit
diff --git a/modules/by-name/yt/yt/module.nix b/modules/by-name/yt/yt/module.nix
index 4e7e90fe..81bacf44 100644
--- a/modules/by-name/yt/yt/module.nix
+++ b/modules/by-name/yt/yt/module.nix
@@ -10,9 +10,102 @@
 {
   config,
   lib,
+  pkgs,
   ...
 }: let
   cfg = config.soispha.programs.yt;
+
+  mkConfig = (pkgs.formats.toml {}).generate;
+
+  mpvInputConfig = {
+    "c" = "script-message yt-comments-external";
+    "C" = "script-message yt-comments-local";
+
+    "d" = "script-message yt-description-external";
+    "D" = "script-message yt-description-local";
+
+    "t" = "script-message yt-thumbnail-external";
+    "I" = "script-message yt-info-external";
+
+    "WHEEL_LEFT" = "playlist-prev";
+    "WHEEL_RIGHT" = "playlist-next";
+
+    "q" = "script-message yt-mark-watched";
+    "Q" = "script-message yt-mark-picked";
+    "r" = "script-message yt-check-new-videos";
+
+    "P" = "quit";
+  };
+
+  mpvConf = {
+    "volume" = 75;
+  };
+
+  ytConfig = {
+    download = {
+      max_cache_size = "5 GiB";
+    };
+
+    commands = {
+      image_show = [
+        (lib.getExe
+          (pkgs.writeShellApplication {
+            name = "show_thumbnail";
+            text = ''
+              imv -w "floating please" "$1"
+            '';
+            runtimeInputs = [
+              pkgs.imv
+            ];
+
+            inheritPath = false;
+          }))
+      ];
+
+      external_spawn = [
+        (lib.getExe
+          (pkgs.writeShellApplication {
+            name = "start_external_command";
+            text = builtins.readFile ./external_commands_script.sh;
+            runtimeInputs = [
+              pkgs.river-classic
+              pkgs.alacritty
+              pkgs.less
+            ];
+
+            inheritPath = false;
+          }))
+      ];
+
+      url_opener = ["qutebrowser-timesinks.youtube"];
+    };
+  };
+
+  inherit (lib) generators;
+  inherit (builtins) typeOf stringLength;
+
+  renderOption = option:
+    rec {
+      int = toString option;
+      float = int;
+      bool = lib.hm.booleans.yesNo option;
+      string = option;
+    }
+    .${
+      typeOf option
+    };
+
+  renderOptionValue = value: let
+    rendered = renderOption value;
+    length = toString (stringLength rendered);
+  in "%${length}%${rendered}";
+
+  renderOptions = generators.toKeyValue {
+    mkKeyValue = generators.mkKeyValueDefault {mkValueString = renderOptionValue;} "=";
+    listsAsDuplicateKeys = true;
+  };
+
+  renderBindings = bindings: lib.concatStringsSep "\n" (lib.mapAttrsToList (name: value: "${name} ${value}") bindings);
 in {
   options.soispha.programs.yt = {
     enable = lib.mkEnableOption "the yt cli client";
@@ -21,9 +114,9 @@ in {
   config = {
     home-manager.users.soispha = lib.mkIf cfg.enable {
       xdg.configFile = {
-        "yt/mpv.conf".source = ./mpv.conf;
-        "yt/mpv.input.conf".source = ./input.conf;
-        "yt/config.toml".source = ./config.toml;
+        "yt/mpv.conf".text = renderOptions mpvConf;
+        "yt/mpv.input.conf".text = renderBindings mpvInputConfig;
+        "yt/config.toml".source = mkConfig "config.toml" ytConfig;
       };
     };
   };
diff --git a/modules/by-name/yt/yt/mpv.conf b/modules/by-name/yt/yt/mpv.conf
deleted file mode 100644
index 52a40823..00000000
--- a/modules/by-name/yt/yt/mpv.conf
+++ /dev/null
@@ -1 +0,0 @@
-volume=75
diff --git a/modules/by-name/yt/yt/mpv.conf.license b/modules/by-name/yt/yt/mpv.conf.license
deleted file mode 100644
index eae6a84c..00000000
--- a/modules/by-name/yt/yt/mpv.conf.license
+++ /dev/null
@@ -1,9 +0,0 @@
-nixos-config - My current NixOS configuration
-
-Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-SPDX-License-Identifier: GPL-3.0-or-later
-
-This file is part of my nixos-config.
-
-You should have received a copy of the License along with this program.
-If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
diff --git a/modules/by-name/zs/zsh/config/command_not_found/command_not_found_insult.sh b/modules/by-name/zs/zsh/config/command_not_found/command_not_found_insult.sh
deleted file mode 100644
index a5d71939..00000000
--- a/modules/by-name/zs/zsh/config/command_not_found/command_not_found_insult.sh
+++ /dev/null
@@ -1,309 +0,0 @@
-#! /usr/bin/env bash
-
-# nixos-config - My current NixOS configuration
-#
-# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
-# SPDX-License-Identifier: GPL-3.0-or-later
-#
-# This file is part of my nixos-config.
-#
-# You should have received a copy of the License along with this program.
-# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
-
-print_message() {
-
-    local messages
-    local message
-
-    ### STANDARD INSULTS ###
-    declare -a _array1=(
-        "(╯°□°)╯︵ ┻━┻"
-        "¯\_(ツ)_/¯"
-        "ACHTUNG! ALLES TURISTEN UND NONTEKNISCHEN LOOKENPEEPERS! DAS KOMPUTERMASCHINE IST NICHT FÜR DER GEFINGERPOKEN UND MITTENGRABEN! ODERWISE IST EASY TO SCHNAPPEN DER SPRINGENWERK, BLOWENFUSEN UND POPPENCORKEN MIT SPITZENSPARKEN. IST NICHT FÜR GEWERKEN BEI DUMMKOPFEN. DER RUBBERNECKEN SIGHTSEEREN KEEPEN DAS COTTONPICKEN HÄNDER IN DAS POCKETS MUSS. ZO RELAXEN UND WATSCHEN DER BLINKENLICHTEN."
-        "And the Darwin Award goes to.... ${USER}!"
-        "Allowing you to survive childbirth was medical malpractice."
-        "Are you always this stupid or are you making a special effort today?!"
-        "Are you even trying?!"
-        "Bad."
-        "Boooo!"
-        "Brains aren't everything. In your case they're nothing."
-        "Commands, random gibberish, who cares!"
-        "Come on! You can do it!"
-        "Don't you have anything better to do?!"
-        "Don't you know anything?"
-        "Dropped on your head as a baby, eh?"
-        "error code: 1D10T"
-        "Even your mom loves you only as a friend."
-        "ERROR_INCOMPETENT_USER"
-        "Fake it till you make it!"
-        "Go outside."
-        "Haha, n00b!"
-        "How many times do I have to flush before you go away?"
-        "I am _seriously_ considering 'rm -rf /'-ing myself..."
-        "I don't know what makes you so stupid, but it really works."
-        "I was going to give you a nasty look, but I see you already have one."
-        "If beauty fades then you have nothing to worry about."
-        "If brains were gasoline you wouldn’t have enough to propel a flea’s motorcycle around a doughnut."
-        "If ignorance is bliss, you must be the happiest person on earth."
-        "If shit was music, you'd be an orchestra."
-        "If what you don't know can't hurt you, you're invulnerable."
-        "Incompetence is also a form of competence"
-        "I’d slap you, but that’d be animal abuse."
-        "I’ve heard of being hit with the ugly stick, but you must have been beaten senseless with it."
-        "Keep trying, someday you'll do something intelligent!"
-        "Let’s play horse. I’ll be the front end. And you be yourself."
-        "Life is good, you should get one."
-        "lol"
-        "lol... plz"
-        "My keyboard is not a touch screen!"
-        "My uptime is longer than your relationships."
-        "Nice try."
-        "n00b alert!"
-        "Pathetic"
-        "Perhaps computers are not for you..."
-        "Perhaps you should leave the command line alone..."
-        "Please step away from the keyboard!"
-        "plz uninstall"
-        "Pro tip: type a valid command!"
-        "Rose are red. Violets are blue. I have five fingers. The middle one's for you."
-        "RTFM!"
-        "Sorry what? I don’t understand idiot language."
-        "The degree of your stupidity is enough to boil water."
-        "The worst one today!"
-        "This is not a search engine."
-        "This is not Windows"
-        "This is why nobody likes you."
-        "This is why you get to see your children only once a month."
-        "Try using your brain the next time!"
-        "Two wrongs don't make a right, take your parents as an example."
-        "Typing incorrect commands, eh?"
-        "u suk"
-        "What if... you type an actual command the next time!"
-        "What if I told you... it is possible to type valid commands."
-        "What is this...? Amateur hour!?"
-        "Why are you so stupid?!"
-        "Why are you doing this to me?!"
-        "Why did the chicken cross the road? To get the hell away from you."
-        "Wow! That was impressively wrong!"
-        "Y u no speak computer???"
-        "You are not as bad as people say, you are much, much worse."
-        "You are not useless since you can still be used as a bad example."
-        "You must have been born on a highway because that's where most accidents happen."
-        "Your application for reduced salary has been sent!"
-        "Your mom had a severe case of diarrhea when you were born."
-        "You're proof that god has a sense of humor."
-        "You’re so dumb your first words were DUH."
-        "You're so fat, people jog around you for exercise."
-        "You’re the reason Santa says ho, ho, ho, on Christmas!"
-    )
-    ### SHAKESPEARE INSULTS ###
-    declare -a array2=(
-        "A most notable coward, an infinite and endless liar, an hourly promise breaker, the owner of no one good quality."
-        "Away, you starvelling, you elf-skin, you dried neat's-tongue, bull's-pizzle, you stock-fish!"
-        "Away, you three-inch fool! "
-        "Come, come, you froward and unable worms!"
-        "Go, prick thy face, and over-red thy fear, Thou lily-liver’d boy."
-        "His wit's as thick as a Tewkesbury mustard."
-        "I am pigeon-liver'd and lack gall."
-        "I am sick when I do look on thee "
-        "I must tell you friendly in your ear, sell when you can, you are not for all markets."
-        "If thou wilt needs marry, marry a fool; for wise men know well enough what monsters you make of them."
-        "I'll beat thee, but I would infect my hands."
-        "I scorn you, scurvy companion. "
-        "Methink'st thou art a general offence and every man should beat thee."
-        "More of your conversation would infect my brain."
-        "My wife's a hobby horse!"
-        "Peace, ye fat guts!"
-        "Poisonous bunch-backed toad! "
-        "The rankest compound of villainous smell that ever offended nostril"
-        "The tartness of his face sours ripe grapes."
-        "There's no more faith in thee than in a stewed prune."
-        "Thine forward voice, now, is to speak well of thine friend; thine backward voice is to utter foul speeches and to detract."
-        "That trunk of humours, that bolting-hutch of beastliness, that swollen parcel of dropsies, that huge bombard of sack, that stuffed cloak-bag of guts, that roasted Manningtree ox with pudding in his belly, that reverend vice, that grey Iniquity, that father ruffian, that vanity in years?"
-        "Thine face is not worth sunburning."
-        "This woman's an easy glove, my lord, she goes off and on at pleasure."
-        "Thou art a boil, a plague sore."
-        "Was the Duke a flesh-monger, a fool and a coward?"
-        "Thou art as fat as butter."
-        "Here is the babe, as loathsome as a toad."
-        "Like the toad; ugly and venomous."
-        "Thou art unfit for any place but hell."
-        "Thou cream faced loon"
-        "Thou clay-brained guts, thou knotty-pated fool, thou whoreson obscene greasy tallow-catch!"
-        "Thou damned and luxurious mountain goat."
-        "Thou elvish-mark'd, abortive, rooting hog!"
-        "Thou leathern-jerkin, crystal-button, knot-pated, agatering, puke-stocking, caddis-garter, smooth-tongue, Spanish pouch!"
-        "Thou lump of foul deformity"
-        "That poisonous bunch-back'd toad!"
-        "Thou sodden-witted lord! Thou hast no more brain than I have in mine elbows "
-        "Thou subtle, perjur'd, false, disloyal man!"
-        "Thou whoreson zed , thou unnecessary letter!"
-        "Thy sin’s not accidental, but a trade."
-        "Thy tongue outvenoms all the worms of Nile."
-        "Would thou wert clean enough to spit upon"
-        "Would thou wouldst burst!"
-        "You poor, base, rascally, cheating lack-linen mate! "
-        "You are as a candle, the better burnt out."
-        "You scullion! You rampallian! You fustilarian! I’ll tickle your catastrophe!"
-        "You starvelling, you eel-skin, you dried neat's-tongue, you bull's-pizzle, you stock-fish-O for breath to utter what is like thee!-you tailor's-yard, you sheath, you bow-case, you vile standing tuck!"
-        "Your brain is as dry as the remainder biscuit after voyage."
-        "Virginity breeds mites, much like a cheese."
-        "Villain, I have done thy mother"
-    )
-    ### MARTIN LUTHER INSULTS ###
-    declare -a array3=(
-        "You live like simple cattle or irrational pigs and, despite the fact that the gospel has returned, have mastered the fine art of misusing all your freedom."
-        "You shameful gluttons and servants of your bellies are better suited to be swineherds and keepers of dogs."
-        "You deserve not only to be given no food to eat, but also to have the dogs set upon you and to be pelted with horse manure."
-        "Oh, what mad senseless fools you are!"
-        "For this you deserve to have God deprive you of his Word and blessing and once again allow preachers of lies to arise who lead you to the devil - and wring sweat and blood out of you besides."
-        "All your holiness is only stench and filth, and it merits nothing but wrath and damnation."
-        "May your grain spoil in the barn, your beer in the cellar, your cattle perish in the stall. Yes, your entire hoard ought to be consumed by rust so that you will never enjoy it."
-        "You relish and delight in the chance to stir up someone else's dirt like pigs that roll in manure and root around in it with their snouts."
-        "Your sin smells to high heaven."
-        "Your words are so foolishly and ignorantly composed that I cannot believe you understand them."
-        "You are the most insane heretics and ingrafters of heretical perversity."
-        "What you say is a blasphemy that has made you worthy of a thousand deaths."
-        "Behold, indeed, this little golden work of a golden teacher! It is a work most worthy of golden letters, and lest there be something about it which is not golden, it must be handed down by golden disciples, namely, by those about whom it is said, 'The idols of the nations are silver and gold. They have eyes, but they see not.'"
-        "You are worthy only to be mocked by the words of error."
-        "It is presumptuous for people who are as ignorant as you are not to take up the work of a herdsman."
-        "What bilgewater of heresies has ever been spoken so heretically as what you have said?"
-        "What do you mean when you say this? Are you dreaming in the throes of a fever or are you laboring under a madness?"
-        "Your astute minds have been completely turned into stinking mushrooms."
-        "You are the prostitute of heretics!"
-        "I am tired of the pestilent voice of your sirens."
-        "You are a bungling magpie, croaking loudly."
-        "You forgot to purge yourself with hellabore while you were preparing to fabricate this lie."
-        "You are more corrupt than any Babylon or Sodom ever was, and, as far as I can see, are characterized by a completely depraved, hopeless, and notorious godlessness."
-        "Your home, once the holiest of all, has become the most licentious den of thieves, the most shameless of all brothels, the kingdom of sin, death, and hell. It is so bad that even Antichrist himself, if he should come, could think of nothing to add to its wickedness."
-        "What devilish unchristian thing would you not undertake?"
-        "You are an extraordinary creature, being neither God nor man. Perhaps you are the devil himself."
-        "Even if the Antichrist appears, what greater evil can he do than what you have done and do daily?"
-        "It may be that you want to build yourself a heaven of your own, like those jugglers build themselves out of linen cloth at the Shrove Tuesday carnival. Is it not disgusting that we have to hear such foolish and childish things from you?"
-        "In our country, fruit grows on trees and from trees, and meditation upon sin grows from contrition. But in your land, trees may grow on fruits, contrition from sins, people walk on their ears, and everything is upside down."
-        "O you wolf in Christendom!"
-        "You know less than does a log on the ground."
-        "I think that all the devils have at once entered into you."
-        "You are worse than all the devils. What you have done, no devil has ever done. Your end is near, you son of perdition and Antichrist! Stop now, you are going to far!"
-        "You are the true, chief, and final Antichrist."
-        "How far will you go, O devilish pride?"
-        "All Christians should be on guard against your antichristian poison."
-        "I think you received these ideas in your pipe dreams."
-        "You are in all you do the very opposite of Christ as befits a true Antichrist."
-        "You are a person of sin and the child of perdition, leading all the world with you to the devil, using your lying and deceitful ways."
-        "You are not a pious fraud, but an infernal, diabolical, antichristian fraud."
-        "You are the Roman Nimrod and a teacher of sin."
-        "It is the old dragon from the abyss of hell who is standing before me!"
-        "You hold fast to human dreams and the doctrines of devils."
-        "If you who are assembled in a council are so frivolous and irresponsible as to waste time and money on unnecessary questions, when it is the business of a council to deal only with the important and necessary matters, we should not only refuse to obey you, but consider you insane or criminals."
-        "Even Lucifer was not guilty of so great a sacrilege in heaven, for he only presumed to be God's equal. God help us!"
-        "You condemned the holy gospel and replaced it with the teaching of the dragon from hell."
-        "Your words are un-Christian, antichristian, and spoken by the inspiration of the evil spirit."
-        "What happened to the house built on sand in Matthew 7 will also happen to you."
-        "Must we believe your nightmares?"
-        "Look how this great heretic speaks brazenly and sacrilegiously."
-        "You run against God with the horns of your pride up in the air and thus plunge into the abyss of hell. Woe unto you, Antichrist!"
-        "You are the devil's most dangerous tool!"
-        "It seems I must have liars and villains for opponents. I am not worthy in the sight of God that a godly and honorable person should discuss these matters with me in a Christian way. This is my greatest lament."
-        "May the Lord Jesus protect me and all devout souls from your contagion and your company!"
-        "This venom - the mere smell of which kills a man!"
-        "You are a Baal-zebub - that is, a man of flies."
-        "You are full of poisonous refuse and insane foolishness."
-        "You are ignorant, stupid, godless blasphemers."
-        "You moderate enforcer and eulogizer of moderation. You are one of those bloody and deceitful people who affect modesty in words and appearance, but who meanwhile breathe out threats and blood."
-        "We leave you to your own devices, for nothing properly suits you except hypocrisy, flattery, and lies."
-        "In lying fashion you ignore what even children know."
-        "The reward of such flattery is what your crass stupidity deserves. Therefore, we shall turn from you, a sevenfold stupid and blasphemous wise person."
-        "People of your sort are hirelings, dumb dogs unable to bark, who see the wolf coming and flee or, rather, join up with the wolf."
-        "You are a wolf and apostle of Satan."
-        "You are the ultimate scourges of the world, the Antichrist together with your sophists and bishops."
-        "You cowardly slave, you corrupt sycophant, with your sickening advice!"
-        "You are idiots and swine."
-        "Every letter of yours breathes Moabitish pride. So much can a single bull inflate a single bubble that you practically make distinguished asses into gods."
-        "You sophistic worms, grasshoppers, locusts, frogs and lice!"
-        'You completely close your mind and do nothing but shout, "Anathema, anathema, anathema!" so that by your own voice you are judged mad.'
-        "Let this generation of vipers prepare itself for unquenchable fire!"
-        "You rush forward as an ass under the pelt of a lion."
-        "In appearance and words you simulate modesty, but you are so swollen with haughtiness, arrogance, pride, malice, villainy, rashness, superciliousness, ignorance, and stupidity that there is nothing to surpass you."
-        "Blind moles!"
-        "We despise your whorish impudence."
-    )
-    ### EDIT THIS LINE IF YOU ONLY WANT TO USE CERTAIN INSULT LISTS ###
-    messages=(
-        # "${array1[@]}" ## normal ones
-        "${array2[@]}" ## Shakespeare
-        "${array3[@]}" ## Luther
-    )
-
-    # If CMD_NOT_FOUND_MSGS array is populated use those messages instead of the defaults
-    [[ -n ${CMD_NOT_FOUND_MSGS} ]] && messages=("${CMD_NOT_FOUND_MSGS[@]}")
-
-    # If CMD_NOT_FOUND_MSGS_APPEND array is populated append those to the existing messages
-    [[ -n ${CMD_NOT_FOUND_MSGS_APPEND} ]] && messages+=("${CMD_NOT_FOUND_MSGS_APPEND[@]}")
-
-    # Seed RANDOM with an integer of some length
-    RANDOM=$(od -vAn -N4 -tu </dev/urandom)
-
-    # Print a randomly selected message, but only about half the time to annoy the user a
-    # little bit less.
-    if [[ $((RANDOM % 2)) -lt 1 ]]; then
-        message=${messages[RANDOM % ${#messages[@]}]}
-        printf "\n  %s%s%s\n\n" "$(tput bold)$(tput setaf 1)" "$message" "$(tput sgr0)" >&2
-    fi
-}
-
-function_exists() {
-    # Zsh returns 0 even on non existing functions with -F so use -f
-    declare -f "$1" >/dev/null
-    return $?
-}
-
-#
-# The idea below is to copy any existing handlers to another function
-# name and insert the message in front of the old handler in the
-# new handler. By default, neither bash or zsh has has a handler function
-# defined, so the default behaviour is replicated.
-#
-# Also, ensure the handler is only copied once. If we do not ensure this
-# the handler would add itself recursively if this file happens to be
-# sourced multiple times in the same shell, resulting in a neverending
-# stream of messages.
-#
-
-#
-# Zsh
-#
-if function_exists command_not_found_handler; then
-    if ! function_exists orig_command_not_found_handler; then
-        eval "orig_$(declare -f command_not_found_handler)"
-    fi
-else
-    orig_command_not_found_handler() {
-        printf "zsh: command not found: %s\n" "$1" >&2
-        return 127
-    }
-fi
-
-command_not_found_handler() {
-    print_message
-    orig_command_not_found_handler "$@"
-}
-
-#
-# Bash
-#
-if function_exists command_not_found_handle; then
-    if ! function_exists orig_command_not_found_handle; then
-        eval "orig_$(declare -f command_not_found_handle)"
-    fi
-else
-    orig_command_not_found_handle() {
-        printf "%s: %s: command not found\n" "$0" "$1" >&2
-        return 127
-    }
-fi
-
-command_not_found_handle() {
-    print_message
-    orig_command_not_found_handle "$@"
-}
diff --git a/modules/by-name/zs/zsh/module.nix b/modules/by-name/zs/zsh/module.nix
index bf7e2a71..fee2eae3 100644
--- a/modules/by-name/zs/zsh/module.nix
+++ b/modules/by-name/zs/zsh/module.nix
@@ -10,13 +10,11 @@
 {
   config,
   lib,
-  system,
-  pkgs,
   ...
 }: let
   cfg = config.soispha.programs.zsh;
 
-  zDotDir = ".config/zsh";
+  zDotDir = "${config.home-manager.users.soispha.xdg.configHome}/zsh";
 
   sourceFile = path: "source ${path}\n";
 
@@ -45,7 +43,7 @@ in {
 
   config = lib.mkIf cfg.enable {
     environment.variables = {
-      ZDOTDIR = "${config.home-manager.users.soispha.home.homeDirectory}/${zDotDir}";
+      ZDOTDIR = zDotDir;
     };
 
     home-manager.users.soispha = {
@@ -66,8 +64,6 @@ in {
 
         autocd = true;
 
-        # Must be relative to the users home directory (for whatever reason)
-        # Thus no `${homeConfig.xdg.configHome}`
         dotDir = zDotDir;
 
         # TODO: Remove the whole history and replace it completely with `atuin` <2024-10-21>
@@ -111,10 +107,7 @@ in {
             + sourceFile ./plugins/zsh-history-substring-search.zsh
           );
           end = lib.modules.mkAfter (
-            # NOTE(@bpeetz): Put this here, so that command handler in `extraFiles`
-            # are not overriding this. <2025-05-16>
-            sourceFile ./config/command_not_found/command_not_found_insult.sh
-            + sourceFile ./config/keymaps_start.zsh
+            sourceFile ./config/keymaps_start.zsh
             + sourceFile ./config/keymaps/command.zsh
             + sourceFile ./config/keymaps/emacs.zsh
             + sourceFile ./config/keymaps/isearch.zsh