about summary refs log tree commit diff stats
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-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.toml (renamed from modules/home.legacy/conf/alacritty/toml/colorscheme.toml)28
-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/module.nix14
-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/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.rasi (renamed from modules/home.legacy/conf/rofi/nord-twoLines.rasi)0
-rw-r--r--modules/by-name/ro/rofi/nord-twoLines.rasi.license (renamed from modules/home.legacy/conf/rofi/nord-twoLines.rasi.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/input.conf.license9
-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
-rw-r--r--modules/common/default.nix11
-rw-r--r--modules/common/projects.json1
-rw-r--r--modules/default.nix1
-rw-r--r--modules/home.legacy/conf/alacritty/default.nix39
-rw-r--r--modules/home.legacy/conf/alacritty/toml/bell.toml17
-rw-r--r--modules/home.legacy/conf/alacritty/toml/cursor.toml21
-rw-r--r--modules/home.legacy/conf/alacritty/toml/env.toml13
-rw-r--r--modules/home.legacy/conf/alacritty/toml/font.toml25
-rw-r--r--modules/home.legacy/conf/alacritty/toml/general.toml24
-rw-r--r--modules/home.legacy/conf/alacritty/toml/hints.toml35
-rw-r--r--modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml307
-rw-r--r--modules/home.legacy/conf/alacritty/toml/mouse.toml12
-rw-r--r--modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml13
-rw-r--r--modules/home.legacy/conf/alacritty/toml/scrolling.toml13
-rw-r--r--modules/home.legacy/conf/alacritty/toml/selection.toml13
-rw-r--r--modules/home.legacy/conf/alacritty/toml/window.toml28
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/base.yml27
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/bell.yml52
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/colors.yml157
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/colorscheme.yml41
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/cursor.yml53
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/debug.yml39
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/env.yml21
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/font.yml83
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/hints.yml87
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/key_bindings.yml392
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/mouse.yml21
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml42
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/scrolling.yml17
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/selection.yml17
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/shell.yml23
-rw-r--r--modules/home.legacy/conf/alacritty/yaml/window.yml99
-rw-r--r--modules/home.legacy/conf/beets/default.nix18
-rw-r--r--modules/home.legacy/conf/beets/plugins.nix2
-rw-r--r--modules/home.legacy/conf/beets/plugins/default.nix1
-rw-r--r--modules/home.legacy/conf/beets/plugins/inline/default.nix (renamed from modules/home.legacy/conf/iamb/default.nix)8
-rw-r--r--modules/home.legacy/conf/default.nix7
-rw-r--r--modules/home.legacy/conf/hyfetch/default.nix29
-rw-r--r--modules/home.legacy/conf/iamb/config.json9
-rw-r--r--modules/home.legacy/conf/iamb/config.json.license9
-rw-r--r--modules/home.legacy/conf/latexindent/default.nix13
-rw-r--r--modules/home.legacy/conf/latexindent/indentconfig.yaml12
-rw-r--r--modules/home.legacy/conf/latexindent/mysettings.yaml682
-rw-r--r--modules/home.legacy/conf/mail/default.nix2
-rw-r--r--modules/home.legacy/conf/rclone/default.nix12
-rw-r--r--modules/home.legacy/conf/rclone/rclone.conf10
-rw-r--r--modules/home.legacy/conf/rclone/rclone.conf.license9
-rw-r--r--modules/home.legacy/conf/rofi/default.nix19
-rw-r--r--modules/home.legacy/conf/tridactyl/config.vim57
-rw-r--r--modules/home.legacy/conf/tridactyl/default.nix12
-rw-r--r--modules/home.legacy/default.nix2
127 files changed, 1415 insertions, 3864 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/home.legacy/conf/alacritty/toml/colorscheme.toml b/modules/by-name/al/alacritty/theme.toml
index 13c796c9..2b326e43 100644
--- a/modules/home.legacy/conf/alacritty/toml/colorscheme.toml
+++ b/modules/by-name/al/alacritty/theme.toml
@@ -12,45 +12,45 @@
 ## name: carbonfox
 ## upstream: https://github.com/edeneast/nightfox.nvim/raw/main/extra/carbonfox/alacritty.toml
 
-[colors.primary]
+[primary]
 background = "#161616"
 foreground = "#f2f4f8"
 dim_foreground = "#b6b8bb"
 bright_foreground = "#f9fbff"
 
-[colors.cursor]
+[cursor]
 text = "#f2f4f8"
 cursor = "#b6b8bb"
 
-[colors.vi_mode_cursor]
+[vi_mode_cursor]
 text = "#f2f4f8"
 cursor = "#33b1ff"
 
-[colors.search.matches]
+[search.matches]
 foreground = "#f2f4f8"
 background = "#525253"
 
-[colors.search.focused_match]
+[search.focused_match]
 foreground = "#f2f4f8"
 background = "#3ddbd9"
 
-[colors.footer_bar]
+[footer_bar]
 foreground = "#f2f4f8"
 background = "#353535"
 
-[colors.hints.start]
+[hints.start]
 foreground = "#f2f4f8"
 background = "#3ddbd9"
 
-[colors.hints.end]
+[hints.end]
 foreground = "#f2f4f8"
 background = "#353535"
 
-[colors.selection]
+[selection]
 text = "#f2f4f8"
 background = "#2a2a2a"
 
-[colors.normal]
+[normal]
 black = "#282828"
 red = "#ee5396"
 green = "#25be6a"
@@ -60,7 +60,7 @@ magenta = "#be95ff"
 cyan = "#33b1ff"
 white = "#dfdfe0"
 
-[colors.bright]
+[bright]
 black = "#484848"
 red = "#f16da6"
 green = "#46c880"
@@ -70,7 +70,7 @@ magenta = "#c8a5ff"
 cyan = "#52bdff"
 white = "#e4e4e5"
 
-[colors.dim]
+[dim]
 black = "#222222"
 red = "#ca4780"
 green = "#1fa25a"
@@ -80,10 +80,10 @@ magenta = "#a27fd9"
 cyan = "#2b96d9"
 white = "#bebebe"
 
-[[colors.indexed_colors]]
+[[indexed_colors]]
 index = 16
 color = "#3ddbd9"
 
-[[colors.indexed_colors]]
+[[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/module.nix b/modules/by-name/nv/nvim/module.nix
index 9b44906a..81d7febf 100644
--- a/modules/by-name/nv/nvim/module.nix
+++ b/modules/by-name/nv/nvim/module.nix
@@ -44,7 +44,7 @@ in {
   config = lib.mkIf cfg.enable {
     home-manager.users.soispha = {
       imports = [
-        modules.nixvim.homeManagerModules.nixvim
+        modules.nixvim.homeModules.nixvim
       ];
 
       home.sessionVariables = {
@@ -73,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/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/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/home.legacy/conf/rofi/nord-twoLines.rasi b/modules/by-name/ro/rofi/nord-twoLines.rasi
index 612b907f..612b907f 100644
--- a/modules/home.legacy/conf/rofi/nord-twoLines.rasi
+++ b/modules/by-name/ro/rofi/nord-twoLines.rasi
diff --git a/modules/home.legacy/conf/rofi/nord-twoLines.rasi.license b/modules/by-name/ro/rofi/nord-twoLines.rasi.license
index eae6a84c..eae6a84c 100644
--- a/modules/home.legacy/conf/rofi/nord-twoLines.rasi.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/input.conf.license b/modules/by-name/yt/yt/input.conf.license
deleted file mode 100644
index eae6a84c..00000000
--- a/modules/by-name/yt/yt/input.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/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
diff --git a/modules/common/default.nix b/modules/common/default.nix
index a272bd52..f9831351 100644
--- a/modules/common/default.nix
+++ b/modules/common/default.nix
@@ -159,7 +159,8 @@
             "~/.local/share/unison"
 
             # These are just to big to be synchronized (# TODO: Work around that <2024-08-31> )
-            "~/media/music"
+            "~/media/music/beets.old"
+            "~/media/music/deerix"
             "~/.local/share/Steam"
           ]
           ++ homeManagerSymlinks;
@@ -171,7 +172,7 @@
           "~/.local/.Trash-1000"
 
           "~/media"
-          "~/school"
+          "~/documents"
           "~/repos"
         ];
       };
@@ -264,9 +265,7 @@
           };
           backgroundStart = [
             # TODO(@bpeetz): Move these to systemd units/their own modules <2025-05-18>
-            pkgs.gammastep
 
-            pkgs.mako
             ["${lib.getExe pkgs.swaybg}" "--image" "${./abstract-nord.png}"]
             pkgs.swayidle
             pkgs.alacritty
@@ -274,7 +273,7 @@
         };
       };
       mpv.enable = true;
-      steam.enable = true;
+      steam.enable = false;
       ssh.enable = true;
       swaylock.enable = true;
       timewarrior.enable = true;
@@ -289,13 +288,11 @@
         projects = builtins.fromJSON (builtins.readFile ./projects.json);
       };
       nix-index.enable = true;
-      yambar.enable = false;
       yt.enable = true;
       zathura.enable = true;
       zsh.enable = true;
     };
 
-    sound.enable = true;
     version.enable = true;
   };
 }
diff --git a/modules/common/projects.json b/modules/common/projects.json
index df3b0c60..ff08ce5a 100644
--- a/modules/common/projects.json
+++ b/modules/common/projects.json
@@ -12,6 +12,7 @@
       "pc": {}
     }
   },
+  "esc": {},
   "latex": {
     "prefix": "programming/latex"
   },
diff --git a/modules/default.nix b/modules/default.nix
index ef885a21..f83cf683 100644
--- a/modules/default.nix
+++ b/modules/default.nix
@@ -15,7 +15,6 @@
     (libraries.extra.mkByName {
       baseDirectory = ./by-name;
       fileName = "module.nix";
-      finalizeFunction = name: value: value;
     });
 in {
   imports = files;
diff --git a/modules/home.legacy/conf/alacritty/default.nix b/modules/home.legacy/conf/alacritty/default.nix
deleted file mode 100644
index 493c4114..00000000
--- a/modules/home.legacy/conf/alacritty/default.nix
+++ /dev/null
@@ -1,39 +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, ...}: let
-  config_file = ''
-    ${lib.strings.fileContents ./toml/general.toml}
-    ${lib.strings.fileContents ./toml/bell.toml}
-    ${lib.strings.fileContents ./toml/colorscheme.toml}
-    ${lib.strings.fileContents ./toml/cursor.toml}
-    ${lib.strings.fileContents ./toml/env.toml}
-    ${lib.strings.fileContents ./toml/font.toml}
-    ${lib.strings.fileContents ./toml/hints.toml}
-    ${lib.strings.fileContents ./toml/keyboard_bindings.toml}
-    ${lib.strings.fileContents ./toml/mouse.toml}
-    ${lib.strings.fileContents ./toml/mouse_bindings.toml}
-    ${lib.strings.fileContents ./toml/scrolling.toml}
-    ${lib.strings.fileContents ./toml/selection.toml}
-    ${lib.strings.fileContents ./toml/window.toml}
-  '';
-in {
-  home.sessionVariables = {
-    # This is **not** the TERM variable but a special one to signify my favorite terminal.
-    TERMINAL = "alacritty";
-
-    # These two here should be set by alacritty at start-up
-    # TERM = "alacritty";
-    # COLORTERM = "truecolor";
-  };
-  programs.alacritty = {
-    enable = true;
-  };
-  xdg.configFile."alacritty/alacritty.toml".text = config_file;
-}
diff --git a/modules/home.legacy/conf/alacritty/toml/bell.toml b/modules/home.legacy/conf/alacritty/toml/bell.toml
deleted file mode 100644
index 821306cc..00000000
--- a/modules/home.legacy/conf/alacritty/toml/bell.toml
+++ /dev/null
@@ -1,17 +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>.
-
-# Bell
-#
-# The bell is rung every time the BEL control character is received.
-[bell]
-# Duration of the visual bell flash in milliseconds. A `duration` of `0` will
-# disable the visual bell animation.
-duration = 0
diff --git a/modules/home.legacy/conf/alacritty/toml/cursor.toml b/modules/home.legacy/conf/alacritty/toml/cursor.toml
deleted file mode 100644
index 6e633b5a..00000000
--- a/modules/home.legacy/conf/alacritty/toml/cursor.toml
+++ /dev/null
@@ -1,21 +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>.
-
-[cursor]
-blink_interval = 750
-blink_timeout = 5
-thickness = 0.15
-unfocused_hollow = true
-vi_mode_style = "None"
-
-# Cursor style
-[cursor.style]
-blinking = "On"
-shape = "Beam"
diff --git a/modules/home.legacy/conf/alacritty/toml/env.toml b/modules/home.legacy/conf/alacritty/toml/env.toml
deleted file mode 100644
index 307f1f1d..00000000
--- a/modules/home.legacy/conf/alacritty/toml/env.toml
+++ /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>.
-
-[env]
-TERM = "alacritty"
-COLORTERM = "truecolor"
diff --git a/modules/home.legacy/conf/alacritty/toml/font.toml b/modules/home.legacy/conf/alacritty/toml/font.toml
deleted file mode 100644
index fd8b0b94..00000000
--- a/modules/home.legacy/conf/alacritty/toml/font.toml
+++ /dev/null
@@ -1,25 +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>.
-
-[font]
-builtin_box_drawing = true
-size = 12.0
-
-[font.glyph_offset]
-x = -1
-y = -1
-
-[font.normal]
-family = "SauceCodePro Nerd Font Mono"
-style = "Regular"
-
-[font.offset]
-x = -1
-y = -1
diff --git a/modules/home.legacy/conf/alacritty/toml/general.toml b/modules/home.legacy/conf/alacritty/toml/general.toml
deleted file mode 100644
index 588d8ea0..00000000
--- a/modules/home.legacy/conf/alacritty/toml/general.toml
+++ /dev/null
@@ -1,24 +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>.
-
-# Configuration for Alacritty, the GPU enhanced terminal emulator.
-
-[general]
-# Live config reload (changes require restart)
-live_config_reload = true
-
-# Startup directory
-#
-# Directory the shell is started in. If this is unset, or `None`, the working
-# directory of the parent process will be used.
-#working_directory: None
-
-# Offer IPC using `alacritty msg` (unix only)
-ipc_socket = true
diff --git a/modules/home.legacy/conf/alacritty/toml/hints.toml b/modules/home.legacy/conf/alacritty/toml/hints.toml
deleted file mode 100644
index da18dc59..00000000
--- a/modules/home.legacy/conf/alacritty/toml/hints.toml
+++ /dev/null
@@ -1,35 +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>.
-
-[hints]
-alphabet = "jfkdls;ahgurieowpq"
-
-[[hints.enabled]]
-command = "xdg-open"                                                                                                                                      # On Linux/BSD
-hyperlinks = true
-post_processing = true
-persist = false
-mouse.enabled = true
-binding = { key = "U", mods = "Control|Shift" }
-regex = "(ipfs:|ipns:|magnet:|mailto:|gemini://|gopher://|https://|http://|news:|file:|git://|ssh:|ftp://)[^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+"
-
-
-[[hints.enabled]]
-action = "Paste"
-post_processing = false
-binding = { key = "T", mods = "Control|Shift" }
-regex = '''([^ '"`=:\[\(]*/)([^/: '"`\)\]]*)'''
-
-
-[[hints.enabled]]
-action = "Paste"
-post_processing = false
-binding = { key = "H", mods = "Control|Shift" }
-regex = '([a-z0-9]{7,40})\s'
diff --git a/modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml b/modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml
deleted file mode 100644
index f2a6eb55..00000000
--- a/modules/home.legacy/conf/alacritty/toml/keyboard_bindings.toml
+++ /dev/null
@@ -1,307 +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>.
-
-[[keyboard.bindings]]
-action = "Paste"
-key = "P"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "Paste"
-key = "Insert"
-mods = "Shift"
-
-[[keyboard.bindings]]
-chars = "gc"
-key = "Slash"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "Copy"
-key = "Y"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ResetFontSize"
-key = "Key0"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "IncreaseFontSize"
-key = "Equals"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "IncreaseFontSize"
-key = "Plus"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "DecreaseFontSize"
-key = "Minus"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ToggleViMode"
-key = "Space"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ScrollToBottom"
-key = "Space"
-mode = "Vi"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ScrollToBottom"
-key = "I"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "ToggleViMode"
-key = "I"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "ScrollToBottom"
-key = "C"
-mode = "Vi"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ToggleViMode"
-key = "C"
-mode = "Vi"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ClearSelection"
-key = "Escape"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "ScrollLineUp"
-key = "Y"
-mode = "Vi"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ScrollLineDown"
-key = "E"
-mode = "Vi"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ScrollToTop"
-key = "G"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "ScrollToBottom"
-key = "G"
-mode = "Vi"
-mods = "Shift"
-
-[[keyboard.bindings]]
-action = "ScrollPageUp"
-key = "B"
-mode = "Vi"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ScrollPageDown"
-key = "F"
-mode = "Vi"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ScrollHalfPageUp"
-key = "U"
-mode = "Vi"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ScrollHalfPageDown"
-key = "D"
-mode = "Vi"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "Copy"
-key = "Y"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "ClearSelection"
-key = "Y"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "ToggleNormalSelection"
-key = "V"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "ToggleLineSelection"
-key = "V"
-mode = "Vi"
-mods = "Shift"
-
-[[keyboard.bindings]]
-action = "ToggleBlockSelection"
-key = "V"
-mode = "Vi"
-mods = "Control"
-
-[[keyboard.bindings]]
-action = "ToggleSemanticSelection"
-key = "V"
-mode = "Vi"
-mods = "Alt"
-
-[[keyboard.bindings]]
-action = "Open"
-key = "Return"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "Up"
-key = "K"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "Down"
-key = "J"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "Left"
-key = "H"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "Right"
-key = "L"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "Up"
-key = "Up"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "Down"
-key = "Down"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "Left"
-key = "Left"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "Right"
-key = "Right"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "First"
-key = "Key0"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "Last"
-key = "Key4"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "FirstOccupied"
-key = "Key6"
-mode = "Vi"
-mods = "Shift"
-
-[[keyboard.bindings]]
-action = "High"
-key = "H"
-mode = "Vi"
-mods = "Shift"
-
-[[keyboard.bindings]]
-action = "Middle"
-key = "M"
-mode = "Vi"
-mods = "Shift"
-
-[[keyboard.bindings]]
-action = "Low"
-key = "L"
-mode = "Vi"
-mods = "Shift"
-
-[[keyboard.bindings]]
-action = "SemanticLeft"
-key = "B"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "SemanticRight"
-key = "W"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "SemanticRightEnd"
-key = "E"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "WordLeft"
-key = "B"
-mode = "Vi"
-mods = "Shift"
-
-[[keyboard.bindings]]
-action = "WordRight"
-key = "W"
-mode = "Vi"
-mods = "Shift"
-
-[[keyboard.bindings]]
-action = "WordRightEnd"
-key = "E"
-mode = "Vi"
-mods = "Shift"
-
-[[keyboard.bindings]]
-action = "Bracket"
-key = "Key5"
-mode = "Vi"
-mods = "Shift"
-
-[[keyboard.bindings]]
-action = "SearchForward"
-key = "Slash"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "SearchBackward"
-key = "Slash"
-mode = "Vi"
-mods = "Shift"
-
-[[keyboard.bindings]]
-action = "SearchNext"
-key = "N"
-mode = "Vi"
-
-[[keyboard.bindings]]
-action = "SearchPrevious"
-key = "N"
-mode = "Vi"
-mods = "Shift"
diff --git a/modules/home.legacy/conf/alacritty/toml/mouse.toml b/modules/home.legacy/conf/alacritty/toml/mouse.toml
deleted file mode 100644
index cbc9cd32..00000000
--- a/modules/home.legacy/conf/alacritty/toml/mouse.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>.
-
-[mouse]
-hide_when_typing = false
diff --git a/modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml b/modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml
deleted file mode 100644
index e566a452..00000000
--- a/modules/home.legacy/conf/alacritty/toml/mouse_bindings.toml
+++ /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>.
-
-[[mouse.bindings]]
-action = "Copy"
-mouse = "Middle"
diff --git a/modules/home.legacy/conf/alacritty/toml/scrolling.toml b/modules/home.legacy/conf/alacritty/toml/scrolling.toml
deleted file mode 100644
index 09240872..00000000
--- a/modules/home.legacy/conf/alacritty/toml/scrolling.toml
+++ /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>.
-
-[scrolling]
-history = 10000
-multiplier = 3
diff --git a/modules/home.legacy/conf/alacritty/toml/selection.toml b/modules/home.legacy/conf/alacritty/toml/selection.toml
deleted file mode 100644
index ebc8c849..00000000
--- a/modules/home.legacy/conf/alacritty/toml/selection.toml
+++ /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>.
-
-[selection]
-save_to_clipboard = false
-semantic_escape_chars = ",│`|:\"' ()[]{}<>\t"
diff --git a/modules/home.legacy/conf/alacritty/toml/window.toml b/modules/home.legacy/conf/alacritty/toml/window.toml
deleted file mode 100644
index edc9cf6e..00000000
--- a/modules/home.legacy/conf/alacritty/toml/window.toml
+++ /dev/null
@@ -1,28 +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>.
-
-[window]
-decorations = "none"
-decorations_theme_variant = "None"
-dynamic_title = true
-opacity = 0.9
-startup_mode = "Windowed"
-title = "Alacritty"
-[window.class]
-general = "Alacritty"
-instance = "Alacritty"
-
-[window.dimensions]
-columns = 0
-lines = 0
-
-[window.padding]
-x = 5
-y = 5
diff --git a/modules/home.legacy/conf/alacritty/yaml/base.yml b/modules/home.legacy/conf/alacritty/yaml/base.yml
deleted file mode 100644
index 637d0d2e..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/base.yml
+++ /dev/null
@@ -1,27 +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>.
-
----
-# Configuration for Alacritty, the GPU enhanced terminal emulator.
-
-# If `true`, bold text is drawn using the bright color variants.
-#draw_bold_text_with_bright_colors: true # TODO:
-
-# Live config reload (changes require restart)
-live_config_reload: true
-
-# Startup directory
-#
-# Directory the shell is started in. If this is unset, or `None`, the working
-# directory of the parent process will be used.
-#working_directory: None
-
-# Offer IPC using `alacritty msg` (unix only)
-ipc_socket: true
diff --git a/modules/home.legacy/conf/alacritty/yaml/bell.yml b/modules/home.legacy/conf/alacritty/yaml/bell.yml
deleted file mode 100644
index 4331a121..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/bell.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>.
-
-# Bell
-#
-# The bell is rung every time the BEL control character is received.
-bell:
-  # Visual Bell Animation
-  #
-  # Animation effect for flashing the screen when the visual bell is rung.
-  #
-  # Values for `animation`:
-  #   - Ease
-  #   - EaseOut
-  #   - EaseOutSine
-  #   - EaseOutQuad
-  #   - EaseOutCubic
-  #   - EaseOutQuart
-  #   - EaseOutQuint
-  #   - EaseOutExpo
-  #   - EaseOutCirc
-  #   - Linear
-  #animation: EaseOutExpo
-
-  # Duration of the visual bell flash in milliseconds. A `duration` of `0` will
-  # disable the visual bell animation.
-  duration: 0
-
-  # Visual bell animation color.
-  #color: '#ffffff'
-
-  # Bell Command
-  #
-  # This program is executed whenever the bell is rung.
-  #
-  # When set to `command: None`, no command will be executed.
-  #
-  # Example:
-  #   command:
-  #     program: notify-send
-  #     args: ["Hello, World!"]
-  #
-  # command:
-  #   program: notify-send
-  #   args: ["The bell in alacritty was rung!"]
diff --git a/modules/home.legacy/conf/alacritty/yaml/colors.yml b/modules/home.legacy/conf/alacritty/yaml/colors.yml
deleted file mode 100644
index 05d2e0e6..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/colors.yml
+++ /dev/null
@@ -1,157 +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>.
-
-# Colors (Tomorrow Night)
-colors:
-  # Default colors
-  primary:
-    background: '#191919'
-    foreground: '#d8dee9'
-
-    # Bright and dim foreground colors
-    #
-    # The dimmed foreground color is calculated automatically if it is not
-    # present. If the bright foreground color is not set, or
-    # `draw_bold_text_with_bright_colors` is `false`, the normal foreground
-    # color will be used.
-    #dim_foreground: '#828482'
-    #bright_foreground: '#eaeaea'
-
-  # Cursor colors
-  #
-  # Colors which should be used to draw the terminal cursor.
-  #
-  # Allowed values are CellForeground/CellBackground, which reference the
-  # affected cell, or hexadecimal colors like #ff00ff.
-  cursor:
-    text: '#191919'
-    cursor: '#d8dee9'
-
-  # Vi mode cursor colors
-  #
-  # Colors for the cursor when the vi mode is active.
-  #
-  # Allowed values are CellForeground/CellBackground, which reference the
-  # affected cell, or hexadecimal colors like #ff00ff.
-  vi_mode_cursor:
-    text: CellBackground
-    cursor: CellForeground
-
-  # Search colors
-  #
-  # Colors used for the search bar and match highlighting.
-  search:
-    # Allowed values are CellForeground/CellBackground, which reference the
-    # affected cell, or hexadecimal colors like #ff00ff.
-    matches:
-      foreground: '#000000'
-      background: '#ffffff'
-    focused_match:
-      foreground: '#ffffff'
-      background: '#000000'
-
-  # Keyboard hints
-  hints:
-    # First character in the hint label
-    #
-    # Allowed values are CellForeground/CellBackground, which reference the
-    # affected cell, or hexadecimal colors like #ff00ff.
-    start:
-      foreground: '#1d1f21'
-      background: '#e9ff5e'
-
-    # All characters after the first one in the hint label
-    #
-    # Allowed values are CellForeground/CellBackground, which reference the
-    # affected cell, or hexadecimal colors like #ff00ff.
-    end:
-      foreground: '#e9ff5e'
-      background: '#1d1f21'
-
-  # Line indicator
-  #
-  # Color used for the indicator displaying the position in history during
-  # search and vi mode.
-  #
-  # By default, these will use the opposing primary color.
-  #line_indicator:
-  #  foreground: None
-  #  background: None
-
-  # Footer bar
-  #
-  # Color used for the footer bar on the bottom, used by search regex input,
-  # hyperlink URI preview, etc.
-  #
-  footer_bar:
-    background: '#c5c8c6'
-    foreground: '#1d1f21'
-
-  # Selection colors
-  #
-  # Colors which should be used to draw the selection area.
-  #
-  # Allowed values are CellForeground/CellBackground, which reference the
-  # affected cell, or hexadecimal colors like #ff00ff.
-  selection:
-    text: '#191919'
-    background: '#d8dee9'
-
-  # Normal colors
-  normal:
-    black: '#191919'
-    red: '#b02626'
-    green: '#40a62f'
-    yellow: '#f2e635'
-    blue: '#314ad0'
-    magenta: '#b30ad0'
-    cyan: '#32d0fc'
-    white: '#acadb1'
-
-  # Bright colors
-  bright:
-    black: '#36393d'
-    red: '#ce2727'
-    green: '#47c930'
-    yellow: '#fff138'
-    blue: '#2e4bea'
-    magenta: '#cc15ed'
-    cyan: '#54d9ff'
-    white: '#dbdbdb'
-
-  # Dim colors
-  #
-  # If the dim colors are not set, they will be calculated automatically based
-  # on the `normal` colors.
-  dim:
-    black: '#676f78'
-    red: '#b55454'
-    green: '#78a670'
-    yellow: '#faf380'
-    blue: '#707fd0'
-    magenta: '#c583d0'
-    cyan: '#8adaf1'
-    white: '#e0e3e7'
-  # Indexed Colors
-  #
-  # The indexed colors include all colors from 16 to 256.
-  # When these are not set, they're filled with sensible defaults.
-  #
-  # Example:
-  #   `- { index: 16, color: '#ff00ff' }`
-  #
-  #indexed_colors: []
-
-  # Transparent cell backgrounds
-  #
-  # Whether or not `window.opacity` applies to all cell backgrounds or only to
-  # the default background. When set to `true` all cells will be transparent
-  # regardless of their background color.
-  #transparent_background_colors: false # TODO:
diff --git a/modules/home.legacy/conf/alacritty/yaml/colorscheme.yml b/modules/home.legacy/conf/alacritty/yaml/colorscheme.yml
deleted file mode 100644
index 0b07fe80..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/colorscheme.yml
+++ /dev/null
@@ -1,41 +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>.
-
-# Nightfox Alacritty Colors
-# Style: carbonfox
-# Upstream: https://github.com/edeneast/nightfox.nvim/raw/main/extra/carbonfox/nightfox_alacritty.yml
-colors:
-  # Default colors
-  primary:
-    background: '0x161616'
-    foreground: '0xf2f4f8'
-  # Normal colors
-  normal:
-    black:   '0x282828'
-    red:     '0xee5396'
-    green:   '0x25be6a'
-    yellow:  '0x08bdba'
-    blue:    '0x78a9ff'
-    magenta: '0xbe95ff'
-    cyan:    '0x33b1ff'
-    white:   '0xdfdfe0'
-  # Bright colors
-  bright:
-    black:   '0x484848'
-    red:     '0xf16da6'
-    green:   '0x46c880'
-    yellow:  '0x2dc7c4'
-    blue:    '0x8cb6ff'
-    magenta: '0xc8a5ff'
-    cyan:    '0x52bdff'
-    white:   '0xe4e4e5'
-  indexed_colors:
-    - { index: 16, color: '0x3ddbd9' }
-    - { index: 17, color: '0xff7eb6' }
diff --git a/modules/home.legacy/conf/alacritty/yaml/cursor.yml b/modules/home.legacy/conf/alacritty/yaml/cursor.yml
deleted file mode 100644
index 5a3946f2..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/cursor.yml
+++ /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>.
-
-cursor:
-  # Cursor style
-  style:
-    # Cursor shape
-    #
-    # Values for `shape`:
-    #   - ▇ Block
-    #   - _ Underline
-    #   - | Beam
-    shape: Beam
-
-    # Cursor blinking state
-    #
-    # Values for `blinking`:
-    #   - Never: Prevent the cursor from ever blinking
-    #   - Off: Disable blinking by default
-    #   - On: Enable blinking by default
-    #   - Always: Force the cursor to always blink
-    blinking: On
-
-  # Vi mode cursor style
-  #
-  # If the vi mode cursor style is `None` or not specified, it will fall back to
-  # the style of the active value of the normal cursor.
-  #
-  # See `cursor.style` for available options.
-  vi_mode_style: None
-
-  # Cursor blinking interval in milliseconds.
-  blink_interval: 750
-
-  # Time after which cursor stops blinking, in seconds.
-  #
-  # Specifying '0' will disable timeout for blinking.
-  blink_timeout: 5
-
-  # If this is `true`, the cursor will be rendered as a hollow box when the
-  # window is not focused.
-  unfocused_hollow: true
-
-  # Thickness of the cursor relative to the cell width as floating point number
-  # from `0.0` to `1.0`.
-  thickness: 0.15
diff --git a/modules/home.legacy/conf/alacritty/yaml/debug.yml b/modules/home.legacy/conf/alacritty/yaml/debug.yml
deleted file mode 100644
index e876d801..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/debug.yml
+++ /dev/null
@@ -1,39 +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>.
-
-#debug:
-  # Display the time it takes to redraw each frame.
-  #render_timer: false
-
-  # Keep the log file after quitting Alacritty.
-  #persistent_logging: false
-
-  # Log level
-  #
-  # Values for `log_level`:
-  #   - Off
-  #   - Error
-  #   - Warn
-  #   - Info
-  #   - Debug
-  #   - Trace
-  #log_level: Warn
-
-  # Renderer override.
-  #   - glsl3
-  #   - gles2
-  #   - gles2_pure
-  #renderer: None
-
-  # Print all received window events.
-  #print_events: false
-
-  # Highlight window damage information.
-  #highlight_damage: false
diff --git a/modules/home.legacy/conf/alacritty/yaml/env.yml b/modules/home.legacy/conf/alacritty/yaml/env.yml
deleted file mode 100644
index 585416a1..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/env.yml
+++ /dev/null
@@ -1,21 +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>.
-
-# Any items in the `env` entry below will be added as
-# environment variables. Some entries may override variables
-# set by alacritty itself.
-env:
-  # TERM variable
-  #
-  # This value is used to set the `$TERM` environment variable for
-  # each instance of Alacritty. If it is not present, alacritty will
-  # check the local terminfo database and use `alacritty` if it is
-  # available, otherwise `xterm-256color` is used.
-  TERM: alacritty
diff --git a/modules/home.legacy/conf/alacritty/yaml/font.yml b/modules/home.legacy/conf/alacritty/yaml/font.yml
deleted file mode 100644
index a711f231..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/font.yml
+++ /dev/null
@@ -1,83 +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>.
-
-# Font configuration
-font:
-  # Normal (roman) font face
-  normal:
-    # Font family
-    #
-    # Default:
-    #   - (macOS) Menlo
-    #   - (Linux/BSD) monospace
-    #   - (Windows) Consolas
-    # family: Source Code Pro
-    # family: SauceCodePro Nerd Font
-    family: SauceCodePro Nerd Font Mono
-
-    # The `style` can be specified to pick a specific face.
-    style: Regular
-
-  # Bold font face
-  #bold:
-    # Font family
-    #
-    # If the bold family is not specified, it will fall back to the
-    # value specified for the normal font.
-    # family: Source Code Pro
-
-    # The `style` can be specified to pick a specific face.
-    #style: Bold
-
-  # Italic font face
-  #italic:
-    # Font family
-    #
-    # If the italic family is not specified, it will fall back to the
-    # value specified for the normal font.
-    # family: Source Code Pro
-
-    # The `style` can be specified to pick a specific face.
-    #style: Italic
-
-  # Bold italic font face
-  #bold_italic:
-    # Font family
-    #
-    # If the bold italic family is not specified, it will fall back to the
-    # value specified for the normal font.
-    # family: Source Code Pro
-
-    # The `style` can be specified to pick a specific face.
-    #style: Bold Italic
-
-  # Point size
-  size: 12.0
-
-  # Offset is the extra space around each character. `offset.y` can be thought
-  # of as modifying the line spacing, and `offset.x` as modifying the letter
-  # spacing.
-  offset:
-    x: -1
-    y: -1
-
-  # Glyph offset determines the locations of the glyphs within their cells with
-  # the default being at the bottom. Increasing `x` moves the glyph to the
-  # right, increasing `y` moves the glyph upward.
-  glyph_offset:
-    x: -1
-    y: -1
-
-  # Use built-in font for box drawing characters.
-  #
-  # If `true`, Alacritty will use a custom built-in font for box drawing
-  # characters (Unicode points 2500 - 259f).
-  #
-  builtin_box_drawing: true # TODO:
diff --git a/modules/home.legacy/conf/alacritty/yaml/hints.yml b/modules/home.legacy/conf/alacritty/yaml/hints.yml
deleted file mode 100644
index b9d75378..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/hints.yml
+++ /dev/null
@@ -1,87 +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>.
-
-# Hints
-#
-# Terminal hints can be used to find text or hyperlink in the visible part of
-# the terminal and pipe it to other applications.
-hints:
-  # Keys used for the hint labels.
-  alphabet: "jfkdls;ahgurieowpq"
-
-  # List with all available hints
-  #
-  # Each hint must have any of `regex` or `hyperlinks` field and either an
-  # `action` or a `command` field. The fields `mouse`, `binding` and
-  # `post_processing` are optional.
-  #
-  # The `hyperlinks` option will cause OSC 8 escape sequence hyperlinks to be
-  # highlighted.
-  #
-  # The fields `command`, `binding.key`, `binding.mods`, `binding.mode` and
-  # `mouse.mods` accept the same values as they do in the `key_bindings` section.
-  #
-  # The `mouse.enabled` field controls if the hint should be underlined while
-  # the mouse with all `mouse.mods` keys held or the vi mode cursor is above it.
-  #
-  # If the `post_processing` field is set to `true`, heuristics will be used to
-  # shorten the match if there are characters likely not to be part of the hint
-  # (e.g. a trailing `.`). This is most useful for URIs and applies only to
-  # `regex` matches.
-  #
-  # Values for `action`:
-  #   - Copy
-  #       Copy the hint's text to the clipboard.
-  #   - Paste
-  #       Paste the hint's text to the terminal or search.
-  #   - Select
-  #       Select the hint's text.
-  #   - MoveViModeCursor
-  #       Move the vi mode cursor to the beginning of the hint.
-  enabled:
-    - regex: "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)\
-             [^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+"
-      hyperlinks: true
-      command: xdg-open
-      post_processing: true
-      mouse:
-        enabled: true
-        mods: None
-      binding:
-        key: U
-        mods: Control|Shift
-
-    - regex: "([^ '\"`=:\\[\\(]*/)([^/: '\"`\\)\\]]*)"
-      action: Paste
-      post_procesing: false
-      binding:
-        key: T
-        mods: Control|Shift
-
-    - regex: "([a-z0-9]{7})\\s"
-      action: Paste
-      post_procesing: false
-      binding:
-        key: H
-        mods: Control|Shift
-
-    # multi regex for different purposes:
-    # 2. UUIDs
-    # 3. hex (for example signatures)
-    # 4. IP addresses
-#    - regex: "([[:alnum:]_$%&+=/@-]+)\
-#|([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\
-#|([0-9a-f]{12,128})\
-#|([[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3})"
-#      action: Copy
-#      post_processing: false
-#      binding:
-#        key: U
-#        mods: Control|Shift
diff --git a/modules/home.legacy/conf/alacritty/yaml/key_bindings.yml b/modules/home.legacy/conf/alacritty/yaml/key_bindings.yml
deleted file mode 100644
index 6bf31719..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/key_bindings.yml
+++ /dev/null
@@ -1,392 +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>.
-
-# Key bindings
-#
-# Key bindings are specified as a list of objects. For example, this is the
-# default paste binding:
-#
-# `- { key: V, mods: Control|Shift, action: Paste }`
-#
-# Each key binding will specify a:
-#
-# - `key`: Identifier of the key pressed
-#
-#    - A-Z
-#    - F1-F24
-#    - Key0-Key9
-#
-#    A full list with available key codes can be found here:
-#    https://docs.rs/winit/*/winit/event/enum.VirtualKeyCode.html#variants
-#
-#    Instead of using the name of the keys, the `key` field also supports using
-#    the scancode of the desired key. Scancodes have to be specified as a
-#    decimal number. This command will allow you to display the hex scancodes
-#    for certain keys:
-#
-#       `showkey --scancodes`.
-#
-# Then exactly one of:
-#
-# - `chars`: Send a byte sequence to the running application
-#
-#    The `chars` field writes the specified string to the terminal. This makes
-#    it possible to pass escape sequences. To find escape codes for bindings
-#    like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside
-#    of tmux. Note that applications use terminfo to map escape sequences back
-#    to keys. It is therefore required to update the terminfo when changing an
-#    escape sequence.
-#
-# - `action`: Execute a predefined action
-#
-#   - ToggleViMode
-#   - SearchForward
-#       Start searching toward the right of the search origin.
-#   - SearchBackward
-#       Start searching toward the left of the search origin.
-#   - Copy
-#   - Paste
-#   - IncreaseFontSize
-#   - DecreaseFontSize
-#   - ResetFontSize
-#   - ScrollPageUp
-#   - ScrollPageDown
-#   - ScrollHalfPageUp
-#   - ScrollHalfPageDown
-#   - ScrollLineUp
-#   - ScrollLineDown
-#   - ScrollToTop
-#   - ScrollToBottom
-#   - ClearHistory
-#       Remove the terminal's scrollback history.
-#   - Hide
-#       Hide the Alacritty window.
-#   - Minimize
-#       Minimize the Alacritty window.
-#   - Quit
-#       Quit Alacritty.
-#   - ToggleFullscreen
-#   - ToggleMaximized
-#   - SpawnNewInstance
-#       Spawn a new instance of Alacritty.
-#   - CreateNewWindow
-#       Create a new Alacritty window from the current process.
-#   - ClearLogNotice
-#       Clear Alacritty's UI warning and error notice.
-#   - ClearSelection
-#       Remove the active selection.
-#   - ReceiveChar
-#   - None
-#
-# - Vi mode exclusive actions:
-#
-#   - Open
-#       Perform the action of the first matching hint under the vi mode cursor
-#       with `mouse.enabled` set to `true`.
-#   - ToggleNormalSelection
-#   - ToggleLineSelection
-#   - ToggleBlockSelection
-#   - ToggleSemanticSelection
-#       Toggle semantic selection based on `selection.semantic_escape_chars`.
-#   - CenterAroundViCursor
-#       Center view around vi mode cursor
-#
-# - Vi mode exclusive cursor motion actions:
-#
-#   - Up
-#       One line up.
-#   - Down
-#       One line down.
-#   - Left
-#       One character left.
-#   - Right
-#       One character right.
-#   - First
-#       First column, or beginning of the line when already at the first column.
-#   - Last
-#       Last column, or beginning of the line when already at the last column.
-#   - FirstOccupied
-#       First non-empty cell in this terminal row, or first non-empty cell of
-#       the line when already at the first cell of the row.
-#   - High
-#       Top of the screen.
-#   - Middle
-#       Center of the screen.
-#   - Low
-#       Bottom of the screen.
-#   - SemanticLeft
-#       Start of the previous semantically separated word.
-#   - SemanticRight
-#       Start of the next semantically separated word.
-#   - SemanticLeftEnd
-#       End of the previous semantically separated word.
-#   - SemanticRightEnd
-#       End of the next semantically separated word.
-#   - WordLeft
-#       Start of the previous whitespace separated word.
-#   - WordRight
-#       Start of the next whitespace separated word.
-#   - WordLeftEnd
-#       End of the previous whitespace separated word.
-#   - WordRightEnd
-#       End of the next whitespace separated word.
-#   - Bracket
-#       Character matching the bracket at the cursor's location.
-#   - SearchNext
-#       Beginning of the next match.
-#   - SearchPrevious
-#       Beginning of the previous match.
-#   - SearchStart
-#       Start of the match to the left of the vi mode cursor.
-#   - SearchEnd
-#       End of the match to the right of the vi mode cursor.
-#
-# - Search mode exclusive actions:
-#   - SearchFocusNext
-#       Move the focus to the next search match.
-#   - SearchFocusPrevious
-#       Move the focus to the previous search match.
-#   - SearchConfirm
-#   - SearchCancel
-#   - SearchClear
-#       Reset the search regex.
-#   - SearchDeleteWord
-#       Delete the last word in the search regex.
-#   - SearchHistoryPrevious
-#       Go to the previous regex in the search history.
-#   - SearchHistoryNext
-#       Go to the next regex in the search history.
-#
-# - macOS exclusive actions:
-#   - ToggleSimpleFullscreen
-#       Enter fullscreen without occupying another space.
-#
-# - Linux/BSD exclusive actions:
-#
-#   - CopySelection
-#       Copy from the selection buffer.
-#   - PasteSelection
-#       Paste from the selection buffer.
-#
-# - `command`: Fork and execute a specified command plus arguments
-#
-#    The `command` field must be a map containing a `program` string and an
-#    `args` array of command line parameter strings. For example:
-#       `{ program: "alacritty", args: ["-e", "vttest"] }`
-#
-# And optionally:
-#
-# - `mods`: Key modifiers to filter binding actions
-#
-#    - Command
-#    - Control
-#    - Option
-#    - Super
-#    - Shift
-#    - Alt
-#
-#    Multiple `mods` can be combined using `|` like this:
-#       `mods: Control|Shift`.
-#    Whitespace and capitalization are relevant and must match the example.
-#
-# - `mode`: Indicate a binding for only specific terminal reported modes
-#
-#    This is mainly used to send applications the correct escape sequences
-#    when in different modes.
-#
-#    - AppCursor
-#    - AppKeypad
-#    - Search
-#    - Alt
-#    - Vi
-#
-#    A `~` operator can be used before a mode to apply the binding whenever
-#    the mode is *not* active, e.g. `~Alt`.
-#
-# Bindings are always filled by default, but will be replaced when a new
-# binding with the same triggers is defined. To unset a default binding, it can
-# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for
-# a no-op if you do not wish to receive input characters for that binding.
-#
-# If the same trigger is assigned to multiple actions, all of them are executed
-# in the order they were defined in.
-key_bindings:
-#
-#
-  - { key: P, mods: Control, action: Paste }
-  - { key: Insert, mods: Shift, action: Paste }
-  - { key: Slash, mods: Control, chars: "gc" }
-  - { key: Y, mods: Control, action: Copy }
-  - { key: Key0, mods: Control, action: ResetFontSize }
-  - { key: Equals, mods: Control, action: IncreaseFontSize }
-  - { key: Plus, mods: Control, action: IncreaseFontSize }
-  - { key: Minus, mods: Control, action: DecreaseFontSize }
-
-  # Vi Mode
-  - { key: Space, mods: Control, action: ToggleViMode }
-  - { key: Space, mods: Control, mode: Vi, action: ScrollToBottom }
-  - { key: I, mode: Vi, action: ScrollToBottom }
-  - { key: I, mode: Vi, action: ToggleViMode }
-  - { key: C, mods: Control, mode: Vi, action: ScrollToBottom }
-  - { key: C, mods: Control, mode: Vi, action: ToggleViMode }
-  - { key: Escape, mode: Vi, action: ClearSelection }
-  - { key: Y, mods: Control, mode: Vi, action: ScrollLineUp }
-  - { key: E, mods: Control, mode: Vi, action: ScrollLineDown }
-  - { key: G, mode: Vi, action: ScrollToTop }
-  - { key: G, mods: Shift, mode: Vi, action: ScrollToBottom }
-  - { key: B, mods: Control, mode: Vi, action: ScrollPageUp }
-  - { key: F, mods: Control, mode: Vi, action: ScrollPageDown }
-  - { key: U, mods: Control, mode: Vi, action: ScrollHalfPageUp }
-  - { key: D, mods: Control, mode: Vi, action: ScrollHalfPageDown }
-  - { key: Y, mode: Vi, action: Copy }
-  - { key: Y, mode: Vi, action: ClearSelection }
-  - { key: V, mode: Vi, action: ToggleNormalSelection }
-  - { key: V, mods: Shift, mode: Vi, action: ToggleLineSelection }
-  - { key: V, mods: Control, mode: Vi, action: ToggleBlockSelection }
-  - { key: V, mods: Alt, mode: Vi, action: ToggleSemanticSelection }
-  - { key: Return, mode: Vi, action: Open }
-  - { key: K, mode: Vi, action: Up }
-  - { key: J, mode: Vi, action: Down }
-  - { key: H, mode: Vi, action: Left }
-  - { key: L, mode: Vi, action: Right }
-  - { key: Up, mode: Vi, action: Up }
-  - { key: Down, mode: Vi, action: Down }
-  - { key: Left, mode: Vi, action: Left }
-  - { key: Right, mode: Vi, action: Right }
-  - { key: Key0, mode: Vi, action: First }
-  - { key: Key4, mode: Vi, action: Last }
-  - { key: Key6, mods: Shift, mode: Vi, action: FirstOccupied }
-  - { key: H, mods: Shift, mode: Vi, action: High }
-  - { key: M, mods: Shift, mode: Vi, action: Middle }
-  - { key: L, mods: Shift, mode: Vi, action: Low }
-  - { key: B, mode: Vi, action: SemanticLeft }
-  - { key: W, mode: Vi, action: SemanticRight }
-  - { key: E, mode: Vi, action: SemanticRightEnd }
-  - { key: B, mods: Shift, mode: Vi, action: WordLeft }
-  - { key: W, mods: Shift, mode: Vi, action: WordRight }
-  - { key: E, mods: Shift, mode: Vi, action: WordRightEnd }
-  - { key: Key5, mods: Shift, mode: Vi, action: Bracket }
-  - { key: Slash, mode: Vi, action: SearchForward }
-  - { key: Slash, mods: Shift, mode: Vi, action: SearchBackward }
-  - { key: N, mode: Vi, action: SearchNext }
-  - { key: N, mods: Shift, mode: Vi, action: SearchPrevious }
-#
-#
-#
-  #- { key: Paste,                                       action: Paste          }
-  #- { key: Copy,                                        action: Copy           }
-  #- { key: L,         mods: Control,                    action: ClearLogNotice }
-  #- { key: L,         mods: Control, mode: ~Vi|~Search, chars: "\x0c"          }
-  #- { key: PageUp,    mods: Shift,   mode: ~Alt,        action: ScrollPageUp   }
-  #- { key: PageDown,  mods: Shift,   mode: ~Alt,        action: ScrollPageDown }
-  #- { key: Home,      mods: Shift,   mode: ~Alt,        action: ScrollToTop    }
-  #- { key: End,       mods: Shift,   mode: ~Alt,        action: ScrollToBottom }
-
-  # Vi Mode
-  #- { key: Space,  mods: Shift|Control, mode: ~Search,    action: ToggleViMode            }
-  #- { key: Space,  mods: Shift|Control, mode: Vi|~Search, action: ScrollToBottom          }
-  #- { key: Escape,                      mode: Vi|~Search, action: ClearSelection          }
-  #- { key: I,                           mode: Vi|~Search, action: ToggleViMode            }
-  #- { key: I,                           mode: Vi|~Search, action: ScrollToBottom          }
-  #- { key: C,      mods: Control,       mode: Vi|~Search, action: ToggleViMode            }
-  #- { key: Y,      mods: Control,       mode: Vi|~Search, action: ScrollLineUp            }
-  #- { key: E,      mods: Control,       mode: Vi|~Search, action: ScrollLineDown          }
-  #- { key: G,                           mode: Vi|~Search, action: ScrollToTop             }
-  #- { key: G,      mods: Shift,         mode: Vi|~Search, action: ScrollToBottom          }
-  #- { key: B,      mods: Control,       mode: Vi|~Search, action: ScrollPageUp            }
-  #- { key: F,      mods: Control,       mode: Vi|~Search, action: ScrollPageDown          }
-  #- { key: U,      mods: Control,       mode: Vi|~Search, action: ScrollHalfPageUp        }
-  #- { key: D,      mods: Control,       mode: Vi|~Search, action: ScrollHalfPageDown      }
-  #- { key: Y,                           mode: Vi|~Search, action: Copy                    }
-  #- { key: Y,                           mode: Vi|~Search, action: ClearSelection          }
-  #- { key: Copy,                        mode: Vi|~Search, action: ClearSelection          }
-  #- { key: V,                           mode: Vi|~Search, action: ToggleNormalSelection   }
-  #- { key: V,      mods: Shift,         mode: Vi|~Search, action: ToggleLineSelection     }
-  #- { key: V,      mods: Control,       mode: Vi|~Search, action: ToggleBlockSelection    }
-  #- { key: V,      mods: Alt,           mode: Vi|~Search, action: ToggleSemanticSelection }
-  #- { key: Return,                      mode: Vi|~Search, action: Open                    }
-  #- { key: Z,                           mode: Vi|~Search, action: CenterAroundViCursor    }
-  #- { key: K,                           mode: Vi|~Search, action: Up                      }
-  #- { key: J,                           mode: Vi|~Search, action: Down                    }
-  #- { key: H,                           mode: Vi|~Search, action: Left                    }
-  #- { key: L,                           mode: Vi|~Search, action: Right                   }
-  #- { key: Up,                          mode: Vi|~Search, action: Up                      }
-  #- { key: Down,                        mode: Vi|~Search, action: Down                    }
-  #- { key: Left,                        mode: Vi|~Search, action: Left                    }
-  #- { key: Right,                       mode: Vi|~Search, action: Right                   }
-  #- { key: Key0,                        mode: Vi|~Search, action: First                   }
-  #- { key: Key4,   mods: Shift,         mode: Vi|~Search, action: Last                    }
-  #- { key: Key6,   mods: Shift,         mode: Vi|~Search, action: FirstOccupied           }
-  #- { key: H,      mods: Shift,         mode: Vi|~Search, action: High                    }
-  #- { key: M,      mods: Shift,         mode: Vi|~Search, action: Middle                  }
-  #- { key: L,      mods: Shift,         mode: Vi|~Search, action: Low                     }
-  #- { key: B,                           mode: Vi|~Search, action: SemanticLeft            }
-  #- { key: W,                           mode: Vi|~Search, action: SemanticRight           }
-  #- { key: E,                           mode: Vi|~Search, action: SemanticRightEnd        }
-  #- { key: B,      mods: Shift,         mode: Vi|~Search, action: WordLeft                }
-  #- { key: W,      mods: Shift,         mode: Vi|~Search, action: WordRight               }
-  #- { key: E,      mods: Shift,         mode: Vi|~Search, action: WordRightEnd            }
-  #- { key: Key5,   mods: Shift,         mode: Vi|~Search, action: Bracket                 }
-  #- { key: Slash,                       mode: Vi|~Search, action: SearchForward           }
-  #- { key: Slash,  mods: Shift,         mode: Vi|~Search, action: SearchBackward          }
-  #- { key: N,                           mode: Vi|~Search, action: SearchNext              }
-  #- { key: N,      mods: Shift,         mode: Vi|~Search, action: SearchPrevious          }
-
-  # Search Mode
-  #- { key: Return,                mode: Search|Vi,  action: SearchConfirm         }
-  #- { key: Escape,                mode: Search,     action: SearchCancel          }
-  #- { key: C,      mods: Control, mode: Search,     action: SearchCancel          }
-  #- { key: U,      mods: Control, mode: Search,     action: SearchClear           }
-  #- { key: W,      mods: Control, mode: Search,     action: SearchDeleteWord      }
-  #- { key: P,      mods: Control, mode: Search,     action: SearchHistoryPrevious }
-  #- { key: N,      mods: Control, mode: Search,     action: SearchHistoryNext     }
-  #- { key: Up,                    mode: Search,     action: SearchHistoryPrevious }
-  #- { key: Down,                  mode: Search,     action: SearchHistoryNext     }
-  #- { key: Return,                mode: Search|~Vi, action: SearchFocusNext       }
-  #- { key: Return, mods: Shift,   mode: Search|~Vi, action: SearchFocusPrevious   }
-
-  # (Windows, Linux, and BSD only)
-  #- { key: V,              mods: Control|Shift, mode: ~Vi,        action: Paste            }
-  #- { key: C,              mods: Control|Shift,                   action: Copy             }
-  #- { key: F,              mods: Control|Shift, mode: ~Search,    action: SearchForward    }
-  #- { key: B,              mods: Control|Shift, mode: ~Search,    action: SearchBackward   }
-  #- { key: C,              mods: Control|Shift, mode: Vi|~Search, action: ClearSelection   }
-  #- { key: Insert,         mods: Shift,                           action: PasteSelection   }
-  #- { key: Key0,           mods: Control,                         action: ResetFontSize    }
-  #- { key: Equals,         mods: Control,                         action: IncreaseFontSize }
-  #- { key: Plus,           mods: Control,                         action: IncreaseFontSize }
-  #- { key: NumpadAdd,      mods: Control,                         action: IncreaseFontSize }
-  #- { key: Minus,          mods: Control,                         action: DecreaseFontSize }
-  #- { key: NumpadSubtract, mods: Control,                         action: DecreaseFontSize }
-
-  # (Windows only)
-  #- { key: Return,   mods: Alt,           action: ToggleFullscreen }
-
-  # (macOS only)
-  #- { key: K,              mods: Command, mode: ~Vi|~Search, chars: "\x0c"                 }
-  #- { key: K,              mods: Command, mode: ~Vi|~Search, action: ClearHistory          }
-  #- { key: Key0,           mods: Command,                    action: ResetFontSize         }
-  #- { key: Equals,         mods: Command,                    action: IncreaseFontSize      }
-  #- { key: Plus,           mods: Command,                    action: IncreaseFontSize      }
-  #- { key: NumpadAdd,      mods: Command,                    action: IncreaseFontSize      }
-  #- { key: Minus,          mods: Command,                    action: DecreaseFontSize      }
-  #- { key: NumpadSubtract, mods: Command,                    action: DecreaseFontSize      }
-  #- { key: V,              mods: Command,                    action: Paste                 }
-  #- { key: C,              mods: Command,                    action: Copy                  }
-  #- { key: C,              mods: Command, mode: Vi|~Search,  action: ClearSelection        }
-  #- { key: H,              mods: Command,                    action: Hide                  }
-  #- { key: H,              mods: Command|Alt,                action: HideOtherApplications }
-  #- { key: M,              mods: Command,                    action: Minimize              }
-  #- { key: Q,              mods: Command,                    action: Quit                  }
-  #- { key: W,              mods: Command,                    action: Quit                  }
-  #- { key: N,              mods: Command,                    action: CreateNewWindow       }
-  #- { key: F,              mods: Command|Control,            action: ToggleFullscreen      }
-  #- { key: F,              mods: Command, mode: ~Search,     action: SearchForward         }
-  #- { key: B,              mods: Command, mode: ~Search,     action: SearchBackward        }
diff --git a/modules/home.legacy/conf/alacritty/yaml/mouse.yml b/modules/home.legacy/conf/alacritty/yaml/mouse.yml
deleted file mode 100644
index c5d2acbb..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/mouse.yml
+++ /dev/null
@@ -1,21 +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>.
-
-mouse:
-  # Click settings
-  #
-  # The `double_click` and `triple_click` settings control the time
-  # alacritty should wait for accepting multiple clicks as one double
-  # or triple click.
-  double_click: { threshold: 300 }
-  triple_click: { threshold: 300 }
-
-  # If this is `true`, the cursor is temporarily hidden when typing.
-  hide_when_typing: false
diff --git a/modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml b/modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml
deleted file mode 100644
index 82e2b92b..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/mouse_bindings.yml
+++ /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>.
-
-# Mouse bindings
-#
-# Mouse bindings are specified as a list of objects, much like the key
-# bindings further below.
-#
-# To trigger mouse bindings when an application running within Alacritty
-# captures the mouse, the `Shift` modifier is automatically added as a
-# requirement.
-#
-# Each mouse binding will specify a:
-#
-# - `mouse`:
-#
-#   - Middle
-#   - Left
-#   - Right
-#   - Numeric identifier such as `5`
-#
-# - `action` (see key bindings for actions not exclusive to mouse mode)
-#
-# - Mouse exclusive actions:
-#
-#   - ExpandSelection
-#       Expand the selection to the current mouse cursor location.
-#
-# And optionally:
-#
-# - `mods` (see key bindings)
-mouse_bindings:
-#  - { mouse: Right,                 action: ExpandSelection }
-#  - { mouse: Right,  mods: Control, action: ExpandSelection }
-   - { mouse: Middle,  action: Copy  }
diff --git a/modules/home.legacy/conf/alacritty/yaml/scrolling.yml b/modules/home.legacy/conf/alacritty/yaml/scrolling.yml
deleted file mode 100644
index 0d108f76..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/scrolling.yml
+++ /dev/null
@@ -1,17 +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>.
-
-scrolling:
-  # Maximum number of lines in the scrollback buffer.
-  # Specifying '0' will disable scrolling.
-  history: 10000
-
-  # Scrolling distance multiplier.
-  multiplier: 3
diff --git a/modules/home.legacy/conf/alacritty/yaml/selection.yml b/modules/home.legacy/conf/alacritty/yaml/selection.yml
deleted file mode 100644
index 100118fc..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/selection.yml
+++ /dev/null
@@ -1,17 +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>.
-
-selection:
-  # This string contains all characters that are used as separators for
-  # "semantic words" in Alacritty.
-  semantic_escape_chars: ",│`|:\"' ()[]{}<>\t"
-
-  # When set to `true`, selected text will be copied to the primary clipboard.
-  save_to_clipboard: false
diff --git a/modules/home.legacy/conf/alacritty/yaml/shell.yml b/modules/home.legacy/conf/alacritty/yaml/shell.yml
deleted file mode 100644
index 4da99581..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/shell.yml
+++ /dev/null
@@ -1,23 +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>.
-
-# Shell
-#
-# You can set `shell.program` to the path of your favorite shell, e.g.
-# `/bin/fish`. Entries in `shell.args` are passed unmodified as arguments to the
-# shell.
-#
-# Default:
-#   - (Linux/BSD/macOS) `$SHELL` or the user's login shell, if `$SHELL` is unset
-#   - (Windows) powershell
-#shell:
-#  program: /bin/bash
-#  args:
-#    - --login
diff --git a/modules/home.legacy/conf/alacritty/yaml/window.yml b/modules/home.legacy/conf/alacritty/yaml/window.yml
deleted file mode 100644
index 2d4006ba..00000000
--- a/modules/home.legacy/conf/alacritty/yaml/window.yml
+++ /dev/null
@@ -1,99 +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>.
-
-window:
-  # Window dimensions (changes require restart)
-  #
-  # Number of lines/columns (not pixels) in the terminal. Both lines and columns
-  # must be non-zero for this to take effect. The number of columns must be at
-  # least `2`, while using a value of `0` for columns and lines will fall back
-  # to the window manager's recommended size
-  dimensions:
-    columns: 0
-    lines: 0
-
-  # Window position (changes require restart)
-  #
-  # Specified in number of pixels.
-  # If the position is not set, the window manager will handle the placement.
-  #position:
-  #  x: 0
-  #  y: 0
-
-  # Window padding (changes require restart)
-  #
-  # Blank space added around the window in pixels. This padding is scaled
-  # by DPI and the specified value is always added at both opposing sides.
-  padding:
-    x: 5
-    y: 5
-
-  # Spread additional padding evenly around the terminal content.
-  #dynamic_padding: false
-
-  # Window decorations
-  #
-  # Values for `decorations`:
-  #     - full: Borders and title bar
-  #     - none: Neither borders nor title bar
-  #
-  # Values for `decorations` (macOS only):
-  #     - transparent: Title bar, transparent background and title bar buttons
-  #     - buttonless: Title bar, transparent background and no title bar buttons
-  decorations: none
-
-  # Background opacity
-  #
-  # Window opacity as a floating point number from `0.0` to `1.0`.
-  # The value `0.0` is completely transparent and `1.0` is opaque.
-  opacity: 0.9
-
-  # Startup Mode (changes require restart)
-  #
-  # Values for `startup_mode`:
-  #   - Windowed
-  #   - Maximized
-  #   - Fullscreen
-  #
-  # Values for `startup_mode` (macOS only):
-  #   - SimpleFullscreen
-  startup_mode: Windowed
-
-  # Window title
-  title: Alacritty
-
-  # Allow terminal applications to change Alacritty's window title.
-  dynamic_title: true
-
-  # Window class (Linux/BSD only):
-  class:
-    # Application instance name
-    instance: Alacritty
-    # General application class
-    general: Alacritty
-
-  # Decorations theme variant
-  #
-  # Override the variant of the System theme/GTK theme/Wayland client side
-  # decorations. Commonly supported values are `Dark`, `Light`, and `None` for
-  # auto pick-up. Set this to `None` to use the default theme variant.
-  decorations_theme_variant: None
-
-  # Resize increments
-  #
-  # Prefer resizing window by discrete steps equal to cell dimensions.
-  #resize_increments: false
-
-  # Make `Option` key behave as `Alt` (macOS only):
-  #   - OnlyLeft
-  #   - OnlyRight
-  #   - Both
-  #   - None (default)
-  #option_as_alt: None
diff --git a/modules/home.legacy/conf/beets/default.nix b/modules/home.legacy/conf/beets/default.nix
index 612a5f03..2fec6881 100644
--- a/modules/home.legacy/conf/beets/default.nix
+++ b/modules/home.legacy/conf/beets/default.nix
@@ -42,7 +42,7 @@ in {
       };
 
       replace = {
-        "[/]" = "\\";
+        "[/]" = "\\\\";
         "[\\x00-\\x1f]" = "";
         "\\s+$" = "";
         "^\\s+" = "";
@@ -67,9 +67,19 @@ in {
       paths = let
         join = lib.strings.concatStringsSep "/";
       in {
-        "albumtype:live" = join ["[Live, please delete]" "$genre" "$first_artist" "$album ($albumtype)" "$track $title"];
-
-        default = "$albumartist/$album%aunique{}/$track $title";
+        "albumtype:live" = join [
+          "[Live, please delete]"
+          "$genre"
+          "$primary_artist" # (= $albumartists[0]). From inline plugin
+          "$album ($albumtype)"
+          "$track $title"
+        ];
+
+        default = join [
+          "$primary_artist" # (= $albumartists[0]). From inline plugin
+          "$album%aunique{}"
+          "$track $title"
+        ];
       };
 
       inherit plugins;
diff --git a/modules/home.legacy/conf/beets/plugins.nix b/modules/home.legacy/conf/beets/plugins.nix
index a3abb580..ed78b49e 100644
--- a/modules/home.legacy/conf/beets/plugins.nix
+++ b/modules/home.legacy/conf/beets/plugins.nix
@@ -35,6 +35,8 @@
   # `mpdupgate` can propagate changed playlist to `mpd`.
   "smartplaylist"
 
+  "inline"
+
   # Warn, when importing a matching item
   "ihate"
 
diff --git a/modules/home.legacy/conf/beets/plugins/default.nix b/modules/home.legacy/conf/beets/plugins/default.nix
index ddba95e0..d22369be 100644
--- a/modules/home.legacy/conf/beets/plugins/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/default.nix
@@ -12,6 +12,7 @@
     ./badfiles
     ./duplicates
     ./ihate
+    ./inline
     ./lyrics
     ./replaygain
     ./smartplaylist
diff --git a/modules/home.legacy/conf/iamb/default.nix b/modules/home.legacy/conf/beets/plugins/inline/default.nix
index 764e2efc..564d5b4c 100644
--- a/modules/home.legacy/conf/iamb/default.nix
+++ b/modules/home.legacy/conf/beets/plugins/inline/default.nix
@@ -8,5 +8,11 @@
 # 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>.
 {...}: {
-  xdg.configFile."iamb/config.json".source = ./config.json;
+  programs.beets.settings.item_fields = {
+    primary_artist =
+      # python
+      ''
+        albumartists[0]
+      '';
+  };
 }
diff --git a/modules/home.legacy/conf/default.nix b/modules/home.legacy/conf/default.nix
index 622f32d5..89502a64 100644
--- a/modules/home.legacy/conf/default.nix
+++ b/modules/home.legacy/conf/default.nix
@@ -9,17 +9,13 @@
 # If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
 {...}: {
   imports = [
-    ./alacritty
     ./beets
     ./btop
     ./dconf
     ./gammastep
     ./gtk
     ./himalaya
-    ./hyfetch
-    ./iamb
     ./keepassxc
-    ./latexindent
     ./mail
     ./mbsync
     ./mumble
@@ -27,10 +23,7 @@
     ./npm
     ./prusa_slicer
     ./python
-    ./rclone
-    ./rofi
     ./starship
     ./swayidle
-    ./tridactyl
   ];
 }
diff --git a/modules/home.legacy/conf/hyfetch/default.nix b/modules/home.legacy/conf/hyfetch/default.nix
deleted file mode 100644
index bac0731e..00000000
--- a/modules/home.legacy/conf/hyfetch/default.nix
+++ /dev/null
@@ -1,29 +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>.
-{...}: {
-  programs.hyfetch = {
-    enable = true;
-    settings = {
-      preset = "rainbow";
-      mode = "rgb";
-      light_dark = "dark";
-      lightness = 0.65;
-      color_align = {
-        mode = "horizontal";
-        custom_colors = [];
-        fore_back = null;
-      };
-      backend = "neofetch";
-      distro = null;
-      pride_month_shown = [];
-      pride_month_disable = false;
-    };
-  };
-}
diff --git a/modules/home.legacy/conf/iamb/config.json b/modules/home.legacy/conf/iamb/config.json
deleted file mode 100644
index ca06d543..00000000
--- a/modules/home.legacy/conf/iamb/config.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "profiles": {
-        "soispha": {
-            "user_id": "@soispha:vhack.eu",
-            "url": "https://matrix.vhack.eu"
-        }
-    },
-    "default_profile": "soispha"
-}
diff --git a/modules/home.legacy/conf/iamb/config.json.license b/modules/home.legacy/conf/iamb/config.json.license
deleted file mode 100644
index eae6a84c..00000000
--- a/modules/home.legacy/conf/iamb/config.json.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/home.legacy/conf/latexindent/default.nix b/modules/home.legacy/conf/latexindent/default.nix
deleted file mode 100644
index aeedd411..00000000
--- a/modules/home.legacy/conf/latexindent/default.nix
+++ /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>.
-{...}: {
-  xdg.configFile."latexindent/indentconfig.yaml".source = ./indentconfig.yaml;
-  xdg.configFile."latexindent/mysettings.yaml".source = ./mysettings.yaml;
-}
diff --git a/modules/home.legacy/conf/latexindent/indentconfig.yaml b/modules/home.legacy/conf/latexindent/indentconfig.yaml
deleted file mode 100644
index 6465a17a..00000000
--- a/modules/home.legacy/conf/latexindent/indentconfig.yaml
+++ /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>.
-
-paths:
-- /home/dt/.config/latexindent/mysettings.yaml
diff --git a/modules/home.legacy/conf/latexindent/mysettings.yaml b/modules/home.legacy/conf/latexindent/mysettings.yaml
deleted file mode 100644
index 122821da..00000000
--- a/modules/home.legacy/conf/latexindent/mysettings.yaml
+++ /dev/null
@@ -1,682 +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>.
-
-# defaultSettings.yaml for latexindent.pl, version 3.19.1, 2022-12-04
-#                      a script that aims to
-#                      beautify .tex, .sty, .cls files
-#
-# (or latexindent.exe if you're on Windows)
-#
-#---------------------------------------------------------------------------------------
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# See http://www.gnu.org/licenses/.
-#
-# Chris Hughes, 2017
-#
-# For all communication, please visit: https://github.com/cmhughes/latexindent.pl
-#
-#---------------------------------------------------------------------------------------
-# You should feel encouraged to change anything you like in these settings, but
-# it would probably be better to have your own user settings
-# files somewhere else - remember that this file may be overwritten
-# when you update your tex distribution. Please see the manual linked from:
-#
-#       https://github.com/cmhughes/latexindent.pl
-#
-# for details of how to create and configure your own settings files.
-#
-# Please read the manual (linked from above) first to understand what each switch does.
-#
-#---------------------------------------------------------------------------------------
-
-# latexindent can be called to act on a file without using the file's extension,
-# e.g, simply
-#       latexindent myfile
-# in which case the choice of file extension is chosen
-# according to the choices made in fileExtensionPreference
-# Other file extensions can be added.
-fileExtensionPreference:
-    .tex: 1
-    .sty: 2
-    .cls: 3
-    .bib: 4
-
-# default file extension of backup file (if -w switch is active)
-# for example, if your .tex file is called
-#       myfile.tex
-# and you specify the backupExtension as BACKUP.bak then your
-# backup file will be
-#       myfileBACKUP.bak
-backupExtension: .bak
-
-# only one backup per file:
-#   - if onlyOneBackUp is 0 then, as a safety measure,
-#     the number on the extension increments by 1 each time:
-#
-#           myfile.bak0, myfile.bak1, myfile.bak2
-#   - if you set onlyOnebackUp to 1, then the backup file will
-#     be overwritten each time (not recommended until you trust the script)
-onlyOneBackUp: 0
-
-# some users may want a finite number of backup files,
-# say at most 3; in which case, they can change this maxNumberOfBackUps.
-#
-# If maxNumberOfBackUps is set to 0 (or less) then infinitely
-# many backups are possible, unless onlyOneBackUp is switched on
-maxNumberOfBackUps: 0
-
-# some users may wish to cycle through back up files.
-#
-# for example, with maxNumberOfBackUps: 4, they may
-# wish to delete the oldest back up file, and keep only the most recent.
-#
-#    copy myfile.bak1 to myfile.bak0
-#    copy myfile.bak2 to myfile.bak1
-#    copy myfile.bak3 to myfile.bak2
-#    copy myfile.bak4 to myfile.bak3
-#
-# the back up will be written to myfile.bak4
-cycleThroughBackUps: 0
-
-# preferences for information displayed in the log file
-logFilePreferences:
-    showEveryYamlRead: 1
-    showAmalgamatedSettings: 0
-    showDecorationStartCodeBlockTrace: 0
-    showDecorationFinishCodeBlockTrace: 0
-    endLogFileWith: '--------------'
-    showGitHubInfoFooter: 1
-    Dumper:
-      Terse: 1
-      Indent: 1
-      Useqq: 1
-      Deparse: 1
-      Quotekeys: 0
-      Sortkeys: 1
-      Pair: " => "
-
-#  verbatim environments specified
-#  in this field will not be changed at all!
-verbatimEnvironments:
-    verbatim: 1
-    lstlisting: 1
-    minted: 1
-
-#  verbatim commands such as \verb! body !, \lstinline$something else$
-verbatimCommands:
-    verb: 1
-    lstinline: 1
-
-#  no indent blocks (not necessarily verbatim
-#  environments) which are marked as %\begin{noindent}
-#  or anything else that you detail in the following
-noIndentBlock:
-    noindent: 1
-    cmhtest: 1
-
-# \begin{document} and \end{document} are treated differently
-# by latexindent within filecontents environments
-fileContentsEnvironments:
-    filecontents: 1
-    filecontents*: 1
-
-# indent preamble
-indentPreamble: 1
-
-# assume no preamble in cls, sty, by default
-lookForPreamble:
-    .tex: 1
-    .sty: 0
-    .cls: 0
-    .bib: 0
-
-# some preambles can contain \begin and \end statements
-# that are not in their 'standard environment block', for example,
-# consider the following key = values:
-#    preheadhook={\begin{mdframed}[style=myframedstyle]},
-#    postfoothook=\end{mdframed},
-preambleCommandsBeforeEnvironments: 0
-
-# default value of indentation
-defaultIndent: "    "
-
-# remove trailing whitespace from all lines
-removeTrailingWhitespace:
-    beforeProcessing: 0
-    afterProcessing: 1
-
-# name of code blocks that should have their body aligned at ampersand delimiters
-lookForAlignDelims:
-   tabular:
-      delims: 1
-      alignDoubleBackSlash: 1
-      spacesBeforeDoubleBackSlash: 1
-      multiColumnGrouping: 0
-      alignRowsWithoutMaxDelims: 1
-      spacesBeforeAmpersand: 1
-      spacesAfterAmpersand: 1
-      justification: left
-      alignFinalDoubleBackSlash: 0
-      dontMeasure: 0
-      delimiterRegEx: '(?<!\\)(&)'
-      delimiterJustification: left
-      lookForChildCodeBlocks: 1
-   tabularx:
-      delims: 1
-   longtable: 1
-   tabu: 1
-   array: 1
-   matrix: 1
-   listabla: 1
-   # amsmath
-   align: 1
-   align*: 1
-   alignat: 1
-   alignat*: 1
-   aligned: 1
-   bmatrix: 1
-   Bmatrix: 1
-   cases: 1
-   flalign: 1
-   flalign*: 1
-   pmatrix: 1
-   vmatrix: 1
-   Vmatrix: 1
-   # mathtools
-   cases*: 1
-   dcases: 1
-   dcases*: 1
-   rcases: 1
-   rcases*: 1
-   drcases: 1
-   drcases*: 1
-   # nicematrix
-   NiceTabular: 1
-   NiceMatrix: 1
-   pNiceMatrix: 1
-   bNiceMatrix: 1
-   BNiceMatrix: 1
-   vNiceMatrix: 1
-   VNiceMatrix: 1
-   NiceArray: 1
-   pNiceArrayC: 1
-   bNiceArrayC: 1
-   BNiceArrayC: 1
-   vNiceArrayC: 1
-   VNiceArrayC: 1
-   NiceArrayCwithDelims: 1
-   pNiceArrayRC: 1
-   bNiceArrayRC: 1
-   BNiceArrayRC: 1
-   vNiceArrayRC: 1
-   VNiceArrayRC: 1
-   NiceArrayRCwithDelims: 1
-   # tabularray
-   tblr: 1
-   longtblr: 1
-   talltblr: 1
-
-# if you want the script to look for \item commands
-# and format it, as follows (for example),
-#       \begin{itemize}
-#           \item content here
-#                 next line is indented
-#                 next line is indented
-#           \item another item
-#       \end{itemize}
-# then populate indentAfterItems. See also itemNames
-indentAfterItems:
-    itemize: 1
-    itemize*: 1
-    enumerate: 1
-    enumerate*: 1
-    description: 1
-    description*: 1
-    list: 1
-
-# if you want to use other names for your items (for example, \part)
-# then populate them here; note that you can trick latexindent.pl
-# into indenting all kinds of commands (within environments specified in
-# indentAfterItems) using this technique.
-itemNames:
-    item: 1
-    myitem: 1
-
-# specialBeginEnd is, by default, mathmode focus, although
-# there's no restrictions
-specialBeginEnd:
-    displayMath:
-        begin: '\\\['
-        end: '\\\]'
-        lookForThis: 1
-    inlineMath:
-        begin: '(?<!\$)(?<!\\)\$(?!\$)'
-        end: '(?<!\\)\$(?!\$)'
-        lookForThis: 1
-    displayMathTeX:
-        begin: '\$\$'
-        end: '\$\$'
-        lookForThis: 1
-    specialBeforeCommand: 0
-
-# if you want to add indentation after
-# a heading, such as \part, \chapter, etc
-# then populate it in here - you can add
-# an indent rule to indentRules if you would
-# like something other than defaultIndent
-#
-# you can also change the level if you like,
-# or add your own title command
-indentAfterHeadings:
-    part:
-       indentAfterThisHeading: 0
-       level: 1
-    chapter:
-       indentAfterThisHeading: 0
-       level: 2
-    section:
-       indentAfterThisHeading: 0
-       level: 3
-    subsection:
-       indentAfterThisHeading: 0
-       level: 4
-    subsection*:
-       indentAfterThisHeading: 0
-       level: 4
-    subsubsection:
-       indentAfterThisHeading: 0
-       level: 5
-    paragraph:
-       indentAfterThisHeading: 0
-       level: 6
-    subparagraph:
-       indentAfterThisHeading: 0
-       level: 7
-
-# maximum indentation, off by default
-maximumIndentation: -1
-
-# if you don't want to have additional indentation
-# in a code block, then add it to noAdditionalIndent; note that
-# code blocks in this field will inherit
-# the *current* level of indentation they just won't
-# get any *additional* indentation
-noAdditionalIndent:
-    myexample: 0
-    mydefinition: 0
-    problem: 0
-    exercises: 0
-    mysolution: 0
-    foreach: 0
-    widepage: 0
-    comment: 0
-    document: 0
-    frame: 0
-
-# if you have indent rules for particular code blocks
-# then you can populate them in indentRules; for example, you might just want
-# to use a space " " or maybe a double tab "        "
-indentRules:
-   myenvironment: "        "
-   anotherenvironment: "                "
-   chapter: " "
-   section: " "
-   item: "      "
-   myitem: "        "
-
-# set noAdditionalIndent globally for codeblocks
-noAdditionalIndentGlobal:
-    environments: 0
-    commands: 0
-    optionalArguments: 0
-    mandatoryArguments: 0
-    ifElseFi: 0
-    items: 0
-    keyEqualsValuesBracesBrackets: 0
-    namedGroupingBracesBrackets: 0
-    UnNamedGroupingBracesBrackets: 0
-    specialBeginEnd: 0
-    afterHeading: 0
-    filecontents: 0
-
-# set indentRules globally for codeblocks; these need
-# to be horizontal spaces, if they are to be used
-indentRulesGlobal:
-    environments: 0
-    commands: 0
-    optionalArguments: 0
-    mandatoryArguments: 0
-    ifElseFi: 0
-    items: 0
-    keyEqualsValuesBracesBrackets: 0
-    namedGroupingBracesBrackets: 0
-    UnNamedGroupingBracesBrackets: 0
-    specialBeginEnd: 0
-    afterHeading: 0
-    filecontents: 0
-
-# command code block details
-commandCodeBlocks:
-    roundParenthesesAllowed: 1
-    stringsAllowedBetweenArguments:
-      -
-        amalgamate: 1
-      - 'node'
-      - 'at'
-      - 'to'
-      - 'decoration'
-      - '\+\+'
-      - '\-\-'
-      - '\#\#\d'
-    commandNameSpecial:
-      -
-        amalgamate: 1
-      - '@ifnextchar\['
-
-# change dos line breaks into unix
-dos2unixlinebreaks: 1
-
-# modifyLineBreaks will only be searched if the -m
-# switch is active
-#
-# poly-switch examples:
-#
-#    BeginStartsOnOwnLine:
-#       modify line breaks before a begin statement
-#
-#       when set to -1, e.g
-#               some text some text
-#               \begin{myenvironment}
-#           will be changed to
-#               some text some text \begin{myenvironment}
-#       when set to 0, the switch is ignored
-#       when set to 1, e.g
-#               some text some text \begin{myenvironment}
-#           will be changed to
-#               some text some text
-#               \begin{myenvironment}
-#       when set to 2, e.g
-#               some text some text \begin{myenvironment}
-#           will be changed to
-#               some text some text%
-#               \begin{myenvironment}
-#       when set to 3, e.g
-#               some text some text \begin{myenvironment}
-#           will be changed to
-#               some text some text
-#
-#               \begin{myenvironment}
-#
-#    BodyStartsOnOwnLine:
-#       modify line breaks before the beginning of the body
-#
-#       when set to -1, e.g
-#               \begin{myenv}
-#                   body text body text
-#           will be changed to
-#               \begin{myenv}body text body text
-#       when set to 0, the switch is ignored
-#       when set to 1, e.g
-#               \begin{myenv}body text body text
-#           will be changed to
-#               \begin{myenv}
-#                   body text body text
-#       when set to 2, e.g
-#               \begin{myenv}body text body text
-#           will be changed to
-#               \begin{myenv}%
-#                   body text body text
-#       when set to 3, e.g
-#               \begin{myenv}body text body text
-#           will be changed to
-#               \begin{myenv}
-#
-#                   body text body text
-#
-#    EndStartsOnOwnLine:
-#       modify line breaks before the end statement
-#
-#       when set to -1, e.g
-#               some text some text
-#               \end{myenvironment}
-#           will be changed to
-#               some text some text \end{myenvironment}
-#       when set to 0, the switch is ignored
-#       when set to 1, e.g
-#               some text some text \end{myenvironment}
-#           will be changed to
-#               some text some text
-#               \end{myenvironment}
-#       when set to 2, e.g
-#               some text some text \end{myenvironment}
-#           will be changed to
-#               some text some text%
-#               \end{myenvironment}
-#       when set to 3, e.g
-#               some text some text \end{myenvironment}
-#           will be changed to
-#               some text some text
-#
-#               \end{myenvironment}
-#
-#    EndFinishesWithLineBreak:
-#       modify line breaks after the end statement
-#
-#       when set to -1, e.g
-#               \end{myenvironment}
-#               some text some text
-#           will be changed to
-#                   \end{myenvironment}some text some text
-#       when set to 0, the switch is ignored
-#       when set to 1, e.g
-#               \end{myenvironment}some text some text
-#           will be changed to
-#                   \end{myenvironment}
-#                   some text some text
-#       when set to 2, e.g
-#               \end{myenvironment}some text some text
-#           will be changed to
-#                   \end{myenvironment}%
-#                   some text some text
-#       when set to 3, e.g
-#               \end{myenvironment}some text some text
-#           will be changed to
-#                   \end{myenvironment}
-#
-#                   some text some text
-#
-# you can specify settings on a per-name basis
-modifyLineBreaks:
-    preserveBlankLines: 1
-    condenseMultipleBlankLinesInto: 1
-    oneSentencePerLine:
-        manipulateSentences: 0
-        removeSentenceLineBreaks: 1
-        multipleSpacesToSingle: 1
-        textWrapSentences: 0   # setting to 1 disables main textWrap routine
-        sentenceIndent: ""
-        sentencesFollow:
-            par: 1
-            blankLine: 1
-            fullStop: 1
-            exclamationMark: 1
-            questionMark: 1
-            rightBrace: 1
-            commentOnPreviousLine: 1
-            other: 0
-        sentencesBeginWith:
-            A-Z: 1
-            a-z: 0
-            other: 0
-        sentencesEndWith:
-            basicFullStop: 0
-            betterFullStop: 1
-            exclamationMark: 1
-            questionMark: 1
-            other: 0
-    textWrapOptions:
-        columns: 0
-        multipleSpacesToSingle: 1
-        removeBlockLineBreaks: 1
-        blocksFollow:
-           headings: 1
-           commentOnPreviousLine: 1
-           par: 1
-           blankLine: 1
-           verbatim: 1
-           filecontents: 1
-           other: '\\\]|\\item(?:\h|\[)'      # regex
-        blocksBeginWith:
-           A-Z: 1
-           a-z: 1
-           0-9: 0
-           other: 0                           # regex
-        blocksEndBefore:
-           commentOnOwnLine: 1
-           verbatim: 1
-           filecontents: 1
-           other: '\\begin\{|\\\[|\\end\{'    # regex
-        huge: overflow                        # forbid mid-word line breaks
-        separator: ""
-    # poly-switches below here
-    environments:
-        BeginStartsOnOwnLine: 0
-        BodyStartsOnOwnLine: 0
-        EndStartsOnOwnLine: 0
-        EndFinishesWithLineBreak: 0
-        equation*:
-            BeginStartsOnOwnLine: 0
-            BodyStartsOnOwnLine: 0
-            EndStartsOnOwnLine: 0
-            EndFinishesWithLineBreak: 0
-    ifElseFi:
-        IfStartsOnOwnLine: 0
-        BodyStartsOnOwnLine: 0
-        OrStartsOnOwnLine: 0
-        OrFinishesWithLineBreak: 0
-        ElseStartsOnOwnLine: 0
-        ElseFinishesWithLineBreak: 0
-        FiStartsOnOwnLine: 0
-        FiFinishesWithLineBreak: 0
-        ifnum:
-            IfStartsOnOwnLine: 0
-            BodyStartsOnOwnLine: 0
-            OrStartsOnOwnLine: 0
-            OrFinishesWithLineBreak: 0
-            ElseStartsOnOwnLine: 0
-            ElseFinishesWithLineBreak: 0
-            FiStartsOnOwnLine: 0
-            FiFinishesWithLineBreak: 0
-    commands:
-        CommandStartsOnOwnLine: 0
-        CommandNameFinishesWithLineBreak: 0
-    optionalArguments:
-        LSqBStartsOnOwnLine: 0
-        OptArgBodyStartsOnOwnLine: 0
-        RSqBStartsOnOwnLine: 0
-        RSqBFinishesWithLineBreak: 0
-    mandatoryArguments:
-        LCuBStartsOnOwnLine: 0
-        MandArgBodyStartsOnOwnLine: 0
-        RCuBStartsOnOwnLine: 0
-        RCuBFinishesWithLineBreak: 0
-    keyEqualsValuesBracesBrackets:
-        KeyStartsOnOwnLine: 0
-        EqualsStartsOnOwnLine: 0
-        EqualsFinishesWithLineBreak: 0
-    items:
-        ItemStartsOnOwnLine: 0
-        ItemFinishesWithLineBreak: 0
-    namedGroupingBracesBrackets:
-        NameStartsOnOwnLine: 0
-        NameFinishesWithLineBreak: 0
-    specialBeginEnd:
-        SpecialBeginStartsOnOwnLine: 0
-        SpecialBodyStartsOnOwnLine: 0
-        SpecialEndStartsOnOwnLine: 0
-        SpecialEndFinishesWithLineBreak: 0
-    verbatim:
-        VerbatimBeginStartsOnOwnLine: 0
-        VerbatimEndFinishesWithLineBreak: 0
-
-# replacements, only active when either -r or -rr switches are active
-replacements:
-  -
-    amalgamate: 1
-  -
-    this: 'latexindent.pl'
-    that: 'pl.latexindent'
-    lookForThis: 0
-    when: before
-
-# fineTuning allows you to tweak the internal pattern matching that
-# is central to latexindent.pl
-fineTuning:
-    environments:
-      name: '[a-zA-Z@\*0-9_\\]+'
-    ifElseFi:
-      name: '(?!@?if[a-zA-Z@]*?\{)@?if[a-zA-Z@]*?'
-    commands:
-      name: '[+a-zA-Z@\*0-9_\:]+?'
-    items:
-      canBeFollowedBy: '(?:\[[^]]*?\])|(?:<[^>]*?>)'
-    keyEqualsValuesBracesBrackets:
-      name: '[a-zA-Z@\*0-9_\/.:\#-]+[a-zA-Z@\*0-9_\/.\h\{\}:\#-]*?'
-      follow: '(?:(?<!\\)\{)|,|(?:(?<!\\)\[)'
-    namedGroupingBracesBrackets:
-      name: '[0-9\.a-zA-Z@\*><]+?'
-      follow: '\h|\R|\{|\[|\$|\)|\('
-    UnNamedGroupingBracesBrackets:
-      follow: '\{|\[|,|&|\)|\(|\$'
-    arguments:
-      before: '(?:#\d\h*;?,?\/?)+|\<.*?\>'
-      between: '_|\^|\*'
-    trailingComments:
-      notPreceededBy: '(?<!\\)'
-    modifyLineBreaks:
-      doubleBackSlash: '\\\\(?:\h*\[\h*\d+\h*[a-zA-Z]+\h*\])?'
-      comma: ','
-      betterFullStop: |-
-        (?x)                                # ignore spaces in the below
-        (?:                                 #
-          \.\)                              # .)
-          (?!\h*[a-z])                      # not *followed by* a-z
-        )                                   #
-        |                                   # OR
-        (?:                                 #
-          (?<!                              # not *preceeded by*
-            (?:                             #
-              (?:[eE]\.[gG])                # e.g OR E.g OR e.G OR E.G
-              |                             #
-              (?:[iI]\.[eE])                # i.e OR I.e OR i.E OR I.E
-              |                             #
-              (?:etc)                       # etc
-            )                               #
-          )                                 #
-        )                                   #
-        \.                                  # .
-        (?!                                 # not *followed by*
-          (?:                               #
-            [a-zA-Z0-9-~,]                  #
-            |                               #
-            \),                             # ),
-            |                               #
-            \)\.                            # ).
-          )                                 #
-        )                                   #
diff --git a/modules/home.legacy/conf/mail/default.nix b/modules/home.legacy/conf/mail/default.nix
index 17957c82..1805606c 100644
--- a/modules/home.legacy/conf/mail/default.nix
+++ b/modules/home.legacy/conf/mail/default.nix
@@ -58,5 +58,5 @@ in {
     inherit accounts;
   };
 
-  programs.git.extraConfig = accountCredentials;
+  programs.git.settings = accountCredentials;
 }
diff --git a/modules/home.legacy/conf/rclone/default.nix b/modules/home.legacy/conf/rclone/default.nix
deleted file mode 100644
index 87de601b..00000000
--- a/modules/home.legacy/conf/rclone/default.nix
+++ /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>.
-{...}: {
-  xdg.configFile."rclone/rclone.conf".source = ./rclone.conf;
-}
diff --git a/modules/home.legacy/conf/rclone/rclone.conf b/modules/home.legacy/conf/rclone/rclone.conf
deleted file mode 100644
index 9e1c4f08..00000000
--- a/modules/home.legacy/conf/rclone/rclone.conf
+++ /dev/null
@@ -1,10 +0,0 @@
-[vhack1]
-type = sftp
-host = server1.vhack.eu
-user = soispha
-key_use_agent = true
-known_hosts_file = ~/.local/share/ssh/known_hosts
-shell_type = unix
-md5sum_command = md5sum
-sha1sum_command = sha1sum
-
diff --git a/modules/home.legacy/conf/rclone/rclone.conf.license b/modules/home.legacy/conf/rclone/rclone.conf.license
deleted file mode 100644
index eae6a84c..00000000
--- a/modules/home.legacy/conf/rclone/rclone.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/home.legacy/conf/rofi/default.nix b/modules/home.legacy/conf/rofi/default.nix
deleted file mode 100644
index 3de22ea0..00000000
--- a/modules/home.legacy/conf/rofi/default.nix
+++ /dev/null
@@ -1,19 +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, ...}: {
-  programs.rofi = {
-    enable = true;
-    package = pkgs.rofi-wayland;
-    terminal = "${pkgs.alacritty}/bin/alacritty";
-    # show-icons = true;
-    # location = "center";
-    theme = ./nord-twoLines.rasi;
-  };
-}
diff --git a/modules/home.legacy/conf/tridactyl/config.vim b/modules/home.legacy/conf/tridactyl/config.vim
deleted file mode 100644
index aa843bc8..00000000
--- a/modules/home.legacy/conf/tridactyl/config.vim
+++ /dev/null
@@ -1,57 +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>.
-
-" vim: filetype=vim
-
-" This wipes all existing settings. This means that if a setting in this file
-" is removed, then it will return to default. In other words, this file serves
-" as an enforced single point of truth for Tridactyl's configuration.
-sanitize tridactyllocal tridactylsync
-
-" Just use a blank page for new tab. It would be nicer to use the standard
-" Firefox homepage, but Tridactyl doesn't support this yet.
-"TODO: use custome file
-"set newtab file:///home/soispha/new.html
-
-" Set a nice colorscheme
-colorscheme midnight
-
-" Delete temp files after use
-alias editor_rm composite editor | jsb -p tri.native.run(`rm -f '${JS_ARG[0]}'`)
-bind --mode=insert <C-i> editor_rm
-bind --mode=input <C-i> editor_rm
-
-" Use vim in tmux for editor.
-set editorcmd alacritty -e nvim
-
-" Ctrl-F should use the browser's native 'find' functionality.
-unbind <C-f>
-
-" But also support Tridactyl search too.
-bind / fillcmdline find
-bind ? fillcmdline find -?
-bind l findnext 1
-bind L findnext -1
-" Remove search highlighting.
-bind ,<Space> nohlsearch
-" Use sensitive case. Smart case would be nice here, but it doesn't work.
-set findcase smartcase
-
-" Smooth scrolling, yes please. This is still a bit janky in Tridactyl.
-set smoothscroll true
-
-" The default jump of 10 is a bit much.
-bind t scrollline 5
-bind n scrollline -5
-
-" K and J should move between tabs. x should close them.
-bind T tabprev
-bind N tabnext
-bind x tabclose
diff --git a/modules/home.legacy/conf/tridactyl/default.nix b/modules/home.legacy/conf/tridactyl/default.nix
deleted file mode 100644
index de92c665..00000000
--- a/modules/home.legacy/conf/tridactyl/default.nix
+++ /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>.
-{...}: {
-  xdg.configFile."tridactyl/tridactylrc".source = ./config.vim;
-}
diff --git a/modules/home.legacy/default.nix b/modules/home.legacy/default.nix
index fd543661..8fb209f3 100644
--- a/modules/home.legacy/default.nix
+++ b/modules/home.legacy/default.nix
@@ -40,7 +40,7 @@ in {
       enable = true;
       createDirectories = true;
       desktop = null;
-      documents = "${homeDirectory}/school/general";
+      documents = "${homeDirectory}/documents/general";
       download = "/tmp/download";
       music = "${homeDirectory}/media/music";
       pictures = "${homeDirectory}/media/pictures";