zaphyra's git: nixfiles

zaphyra's nixfiles

commit 0f6e6e1e711a34a96cc2205f58202632865daa6b
parent 27391121d592f8c38477bb31676ba390f5e196d2
Author: Katja Ramona Sophie Kwast (zaphyra) <git@zaphyra.eu>
Date: Sun, 21 Dec 2025 16:21:03 +0100

chaotic-evil commit
103 files changed, 3844 insertions(+), 2213 deletions(-)
M
config/home/zaphyra/configure/fonts.nix
|
2
+-
M
config/home/zaphyra/configure/niri.nix
|
56
+++++++++++++++++++++++++++-----------------------------
M
config/home/zaphyra/configure/xdg.nix
|
5
+++++
M
config/home/zaphyra/home.nix
|
21
+++++----------------
A
config/home/zaphyra/languages/default.nix
|
8
++++++++
A
config/home/zaphyra/languages/golang.nix
|
26
++++++++++++++++++++++++++
A
config/home/zaphyra/languages/javascript.nix
|
30
++++++++++++++++++++++++++++++
A
config/home/zaphyra/languages/nimlang.nix
|
31
+++++++++++++++++++++++++++++++
A
config/home/zaphyra/languages/nix.nix
|
41
+++++++++++++++++++++++++++++++++++++++++
M
config/home/zaphyra/programs/airpodsctl.nix
|
20
++++++++++----------
M
config/home/zaphyra/programs/alacritty.nix
|
18
+++++++++++-------
M
config/home/zaphyra/programs/anyrun-launcher.nix
|
277
+++++++++++++++++++++++++++++++++++++++++--------------------------------------
M
config/home/zaphyra/programs/apostrophe.nix
|
12
+++++++++++-
M
config/home/zaphyra/programs/bat.nix
|
25
++++++++++++++++++-------
M
config/home/zaphyra/programs/bitwarden-cli.nix
|
37
+++++++++++++++++++++++--------------
M
config/home/zaphyra/programs/celluloid.nix
|
22
++++++++++++++++------
M
config/home/zaphyra/programs/chaosctl.nix
|
22
+++++++++++++++-------
M
config/home/zaphyra/programs/chawan.nix
|
31
+++++++++++++++++++++----------
M
config/home/zaphyra/programs/cozy.nix
|
8
+++++++-
A
config/home/zaphyra/programs/default.nix
|
5
+++++
M
config/home/zaphyra/programs/deploymentUtilities.nix
|
24
+++++++++++++++++-------
M
config/home/zaphyra/programs/dino.nix
|
17
+++++++++++++----
M
config/home/zaphyra/programs/errands.nix
|
17
+++++++++++++----
M
config/home/zaphyra/programs/eza.nix
|
33
++++++++++++++++++++++-----------
M
config/home/zaphyra/programs/firefox.nix
|
574
+++++++++++++++++++++++++++++++++++++++++--------------------------------------
M
config/home/zaphyra/programs/fish.nix
|
22
++++++++++++++--------
M
config/home/zaphyra/programs/fractal.nix
|
20
+++++++++++++++-----
M
config/home/zaphyra/programs/fuzzel.nix
|
116
++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
M
config/home/zaphyra/programs/gajim.nix
|
19
++++++++++++++-----
M
config/home/zaphyra/programs/ghostty.nix
|
38
+++++++++++++++++++++++++++-----------
M
config/home/zaphyra/programs/git.nix
|
74
+++++++++++++++++++++++++++++++++++++++++++++-----------------------------
M
config/home/zaphyra/programs/gnome-calendar.nix
|
47
+++++++++++------------------------------------
M
config/home/zaphyra/programs/gnome-obfuscate.nix
|
12
+++++++++++-
A
config/home/zaphyra/programs/gnome-online-accounts.nix
|
53
+++++++++++++++++++++++++++++++++++++++++++++++++++++
M
config/home/zaphyra/programs/gnome-text-editor.nix
|
30
++++++++++++++++++++----------
M
config/home/zaphyra/programs/gpg.nix
|
72
++++++++++++++++++++++++++++++++++++++++--------------------------------
M
config/home/zaphyra/programs/gtklock.nix
|
28
+++++++++++++++++++---------
M
config/home/zaphyra/programs/helix.nix
|
69
+++++++++++++++++++++++++++++++++++++++++----------------------------
M
config/home/zaphyra/programs/htop.nix
|
31
+++++++++++++++++++------------
M
config/home/zaphyra/programs/imv.nix
|
8
+++++++-
D
config/home/zaphyra/programs/languages/golang.nix
|
17
-----------------
D
config/home/zaphyra/programs/languages/javascript.nix
|
19
-------------------
D
config/home/zaphyra/programs/languages/nimlang.nix
|
20
--------------------
D
config/home/zaphyra/programs/languages/nix.nix
|
25
-------------------------
M
config/home/zaphyra/programs/libreoffice.nix
|
12
++++++++++--
M
config/home/zaphyra/programs/loupe.nix
|
63
++++++++++++++++++++++++++++++++++++---------------------------
M
config/home/zaphyra/programs/mcfly.nix
|
24
++++++++++++++++--------
M
config/home/zaphyra/programs/micro.nix
|
36
+++++++++++++++++++++---------------
M
config/home/zaphyra/programs/mpv.nix
|
13
++++++++++---
M
config/home/zaphyra/programs/nautilus.nix
|
113
+++++++++++++++++++++++++++++++++++++++++++------------------------------------
M
config/home/zaphyra/programs/networkManagerDmenu.nix
|
73
++++++++++++++++++++++++++++++++++++++-----------------------------------
D
config/home/zaphyra/programs/niri.nix
|
242
-------------------------------------------------------------------------------
A
config/home/zaphyra/programs/niri/binds.nix
|
184
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
config/home/zaphyra/programs/niri/default.nix
|
74
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
config/home/zaphyra/programs/niri/io.nix
|
36
++++++++++++++++++++++++++++++++++++
A
config/home/zaphyra/programs/niri/rules.nix
|
96
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
M
config/home/zaphyra/programs/nmgui.nix
|
478
++++++++++++++++++++++++++++++++++++++++---------------------------------------
M
config/home/zaphyra/programs/ocrmypdf.nix
|
12
+++++++++++-
M
config/home/zaphyra/programs/overskride.nix
|
9
++++++++-
M
config/home/zaphyra/programs/papers.nix
|
26
++++++++++++++++++--------
M
config/home/zaphyra/programs/password-store.nix
|
32
+++++++++++++++++++-------------
M
config/home/zaphyra/programs/pdfarranger.nix
|
20
+++++++++++++++-----
M
config/home/zaphyra/programs/pipewire.nix
|
104
+++++++++++++++++++++++++++++++++++++++++++-------------------------------------
M
config/home/zaphyra/programs/plattenalbum.nix
|
11
++++++++++-
M
config/home/zaphyra/programs/profanity.nix
|
19
++++++++++++++-----
M
config/home/zaphyra/programs/shellUtilities.nix
|
94
++++++++++++++++++++++++++++++++++---------------------------------------------
D
config/home/zaphyra/programs/sherlock-launcher.nix
|
89
-------------------------------------------------------------------------------
M
config/home/zaphyra/programs/ssh.nix
|
41
++++++++++++++++++++++++++---------------
M
config/home/zaphyra/programs/swaylock.nix
|
58
+++++++++++++++++++++++++++++++++-------------------------
A
config/home/zaphyra/programs/systemUtilities.nix
|
32
++++++++++++++++++++++++++++++++
M
config/home/zaphyra/programs/thunderbird.nix
|
85
+++++++++++++++++++++++++++++++++++++++++++------------------------------------
M
config/home/zaphyra/programs/tmux.nix
|
24
++++++++++++++++--------
M
config/home/zaphyra/programs/tuba.nix
|
31
++++++++++++++++++++-----------
M
config/home/zaphyra/programs/typst.nix
|
39
++++++++++++++++++++++++---------------
M
config/home/zaphyra/programs/wleave.nix
|
163
+++++++++++++++++++++++++++++++++++++++++--------------------------------------
M
config/home/zaphyra/programs/yazi.nix
|
62
++++++++++++++++++++++++++++++++++----------------------------
M
config/home/zaphyra/programs/yt-dlp.nix
|
24
+++++++++++++++++-------
M
config/home/zaphyra/programs/zathura.nix
|
8
+++++++-
M
config/home/zaphyra/programs/zoxide.nix
|
30
+++++++++++++++++++-----------
M
config/home/zaphyra/programs/zsh.nix
|
66
+++++++++++++++++++++++++++++++++++-------------------------------
M
config/home/zaphyra/services/swaync.nix
|
5
+----
M
config/home/zaphyra/services/waybar.nix
|
9
++++-----
M
config/home/zaphyra/services/wpaperd.nix
|
40
++++++++++++++++++++++++----------------
M
config/nixos/modules/gnomeMinimal.nix
|
4
++--
M
config/nixos/modules/hardware/video/intel.nix
|
24
++++++++++++++----------
M
config/nixos/modules/presets/graphical/typeNiri.nix
|
4
+++-
M
config/nixos/modules/presets/zaphyra/dnsServer.nix
|
14
++++++++++++++
M
config/nixos/modules/presets/zaphyra/enable.nix
|
2
+-
M
config/nixos/modules/presets/zaphyra/mailServer.nix
|
5
+++--
M
config/nixos/modules/programs/AusweisApp.nix
|
2
+-
M
config/nixos/modules/services/greetd.nix
|
2
+-
M
config/nixos/modules/services/keyd.nix
|
11
++++++++---
M
config/nixos/modules/users/zaphyra.nix
|
124
+++++++++++++++++++++++++++----------------------------------------------------
M
config/nixos/modules/websites/continuwuity.zaphyra.eu.nix
|
9
+++++++++
M
config/nixos/modules/websites/ente.zaphyra.eu.nix
|
5
++---
M
config/nixos/modules/websites/music.zaphyra.dn42.nix
|
1
-
A
config/nixos/modules/websites/photos.zaphyra.eu.nix
|
143
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
M
flake.lock
|
965
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
M
flake.nix
|
29
+++++++++++++----------------
M
hosts/haueri/default.nix
|
13
++++++++-----
M
hosts/huntii/default.nix
|
32
+++++++++++++++++++++++++++++++-
M
hosts/pratorum/default.nix
|
1
+
M
secrets/morio.yaml
|
8
++++----
diff --git a/config/home/zaphyra/configure/fonts.nix b/config/home/zaphyra/configure/fonts.nix
@@ -85,7 +85,7 @@ in
     liberation_ttf
     ttf_bitstream_vera
     noto-fonts
-    noto-fonts-emoji
+    noto-fonts-color-emoji
     nerd-fonts.symbols-only
     fira-code
     fira-mono
diff --git a/config/home/zaphyra/configure/niri.nix b/config/home/zaphyra/configure/niri.nix
@@ -13,40 +13,38 @@ let
 in
 {
 
-  imports =
-    with homeManagerModules.zaphyra;
-    [
-      configure.fonts
-
-      services.dssd
-      services.batsignal
-      services.wpaperd
-      services.shaderbg
-      services.waybar
-      services.wob
-      services.swaync
-      services.swayidle
-      services.wlsunset
-      services.playerctl
-      services.gomuks-web
-      services.wvkbd
-
-      programs.niri
-      programs.swaylock
-      programs.ghostty
-      homeManagerModules.common.programs.app2unit
-      programs.anyrun-launcher
-      programs.fuzzel
-    ]
-    ++ (lib.optionals systemConfig.modules.hardware.bluetooth.enable [
-      programs.overskride
-      programs.airpodsctl
-    ]);
+  imports = with homeManagerModules.zaphyra; [
+    configure.fonts
+
+    services.dssd
+    services.batsignal
+    services.wpaperd
+    services.shaderbg
+    services.waybar
+    services.wob
+    services.swaync
+    services.swayidle
+    services.wlsunset
+    services.playerctl
+    services.gomuks-web
+    services.wvkbd
+
+    homeManagerModules.common.programs.app2unit
+  ];
 
   home.persistence."/nix/persist/home/${config.home.username}".directories = [
     "dconf/.config/dconf"
   ];
 
+  zaphyra.programs = {
+    niri.enable = true;
+    ghostty.enable = true;
+    anyrun-launcher.enable = true;
+    fuzzel.enable = true;
+    overskride.enable = systemConfig.modules.hardware.bluetooth.enable;
+    airpodsctl.enable = systemConfig.modules.hardware.bluetooth.enable;
+  };
+
   tgc.programs.nirius.enable = true;
 
   xdg.portal = {
diff --git a/config/home/zaphyra/configure/xdg.nix b/config/home/zaphyra/configure/xdg.nix
@@ -13,6 +13,11 @@
     enable = true;
     mime.enable = true;
 
+    # terminal-exec = {
+    #   enable = true;
+    #   package = pkgs.xdg-terminal-exec-mkhl;
+    # };
+
     userDirs = {
       enable = true;
 
diff --git a/config/home/zaphyra/home.nix b/config/home/zaphyra/home.nix
@@ -1,4 +1,6 @@
 {
+  hostConfig,
+  lib,
   homeManagerModules,
   pkgs,
   ...

@@ -29,23 +31,10 @@
     time = "en_GB.UTF-8";
   };
 
-  imports = with homeManagerModules.zaphyra; [
+  imports = [
     homeManagerModules.common.programs.starship
-    programs.fish
-    programs.mcfly
-    programs.zoxide
-    programs.eza
-    programs.bat
-
-    programs.chawan
-    programs.yazi
-    programs.micro
-    programs.helix
-    programs.tmux
-    programs.htop
-
-    programs.deploymentUtilities
-    programs.shellUtilities
+    ./programs
+    ./languages
   ];
 
 }
diff --git a/config/home/zaphyra/languages/default.nix b/config/home/zaphyra/languages/default.nix
@@ -0,0 +1,8 @@
+_: {
+  imports = [
+    ./golang.nix
+    ./javascript.nix
+    ./nimlang.nix
+    ./nix.nix
+  ];
+}
diff --git a/config/home/zaphyra/languages/golang.nix b/config/home/zaphyra/languages/golang.nix
@@ -0,0 +1,26 @@
+{
+  config,
+  systemConfig,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+
+  options.zaphyra.languages.go.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.languages.go.enable {
+    home = {
+      packages = [ pkgs.go ];
+      sessionVariables.GOPATH = "${config.xdg.dataHome}/go";
+
+    };
+
+    programs.micro.lsp-servers.go.command = lib.getExe pkgs.gopls;
+  };
+
+}
diff --git a/config/home/zaphyra/languages/javascript.nix b/config/home/zaphyra/languages/javascript.nix
@@ -0,0 +1,30 @@
+{
+  config,
+  systemConfig,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+
+  options.zaphyra.languages.javascript.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.languages.javascript.enable {
+    home.packages = with pkgs; [
+      nodejs
+      pnpm
+    ];
+
+    programs = {
+      micro.lsp-servers.js.command = lib.getExe pkgs.typescript-language-server;
+      helix.extraPackages = [
+        pkgs.typescript-language-server
+      ];
+    };
+  };
+
+}
diff --git a/config/home/zaphyra/languages/nimlang.nix b/config/home/zaphyra/languages/nimlang.nix
@@ -0,0 +1,31 @@
+{
+  config,
+  systemConfig,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+
+  options.zaphyra.languages.nim.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.languages.nim.enable {
+    home.packages = with pkgs; [
+      nim
+      nimble
+    ];
+
+    programs = {
+      micro.lsp-servers.nim.command = lib.getExe pkgs.nimlangserver;
+
+      helix.extraPackages = [
+        pkgs.nimlangserver
+      ];
+    };
+  };
+
+}
diff --git a/config/home/zaphyra/languages/nix.nix b/config/home/zaphyra/languages/nix.nix
@@ -0,0 +1,41 @@
+{
+  config,
+  systemConfig,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+
+  options.zaphyra.languages.nix.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.languages.nix.enable {
+    home.packages = with pkgs; [
+      deadnix
+      nixfmt-rfc-style
+      nixfmt-tree
+      statix
+    ];
+
+    programs = {
+      helix.extraPackages = [
+        pkgs.nixd
+        pkgs.nil
+      ];
+
+      micro.lsp-servers.nix = {
+        command = lib.getExe pkgs.nixd;
+        options = {
+          config = builtins.toJSON {
+            formatting.command = [ (lib.getExe pkgs.nixfmt-rfc-style) ];
+          };
+        };
+      };
+    };
+
+  };
+}
diff --git a/config/home/zaphyra/programs/airpodsctl.nix b/config/home/zaphyra/programs/airpodsctl.nix
@@ -1,22 +1,22 @@
 {
   config,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  imports = [
-    inputs.airpodsctl.homeManagerModules.kairpodsd
-  ];
+  options.zaphyra.programs.airpodsctl.enable = lib.mkEnableOption "airpodsctl";
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "kairpodsd/.config/kairpodsd/"
-    "kairpodsd/.local/share/kairpodsd/"
-  ];
+  config = lib.mkIf config.zaphyra.programs.airpodsctl.enable {
+    services.kairpodsd.enable = true;
+    home.packages = [ pkgs.airpodsctl ];
 
-  services.kairpodsd.enable = true;
-
-  home.packages = [ pkgs.airpodsctl ];
+    home.persistence."/nix/persist/home/${config.home.username}".directories = [
+      "kairpodsd/.config/kairpodsd/"
+      "kairpodsd/.local/share/kairpodsd/"
+    ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/alacritty.nix b/config/home/zaphyra/programs/alacritty.nix
@@ -1,16 +1,20 @@
 {
+  config,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.sessionVariables = {
-    TERMINAL = "alacritty";
-  };
+  options.zaphyra.programs.alacritty.enable = lib.mkEnableOption "alacritty terminal emulator";
+
+  config = lib.mkIf config.zaphyra.programs.alacritty.enable {
+    home.sessionVariables = {
+      TERMINAL = "alacritty";
+    };
 
-  programs = {
-    alacritty = {
+    programs.alacritty = {
       enable = true;
       settings = {
         window.opacity = 0.9;

@@ -50,8 +54,8 @@
         };
       };
     };
-  };
 
-  wayland.windowManager.sway.config.terminal = "${pkgs.alacritty}/bin/alacritty";
+    wayland.windowManager.sway.config.terminal = "${pkgs.alacritty}/bin/alacritty";
+  };
 
 }
diff --git a/config/home/zaphyra/programs/anyrun-launcher.nix b/config/home/zaphyra/programs/anyrun-launcher.nix
@@ -7,141 +7,152 @@
 
 {
 
-  programs.niri.settings.binds = with config.lib.niri.actions; {
-    "Mod+Space".action = spawn (lib.getExe pkgs.unstable.app2unit) "-C" "--" (
-      lib.getExe pkgs.tgc.anyrun
-    );
+  options.zaphyra.programs.anyrun-launcher.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = config.zaphyra.programs.niri.enable;
   };
 
-  home.packages = [ pkgs.tgc.anyrun ];
-  xdg.configFile = lib.mapAttrs' (name: value: lib.nameValuePair "anyrun/${name}" { text = value; }) {
-    "config.ron" = ''
-      Config(
-        ignore_exclusive_zones: false,
-        layer: Overlay,
-        hide_plugin_info: false,
-        close_on_click: true,
-        max_entries: None,
-        plugins: [
-          "${pkgs.tgc.anyrun}/lib/libniri_focus.so",
-          "${pkgs.tgc.anyrun}/lib/libapplications.so",
-        ],
-        keybinds: [
-          Keybind(
-            key: "Return",
-            action: Select,
-          ),
-          Keybind(
-            key: "Up",
-            action: Up,
-          ),
-          Keybind(
-            key: "Down",
-            action: Down,
-          ),
-          Keybind(
-            key: "Escape",
-            action: Close,
-          ),
-        ],
-      )
-    '';
-    "applications.ron" = ''
-      Config(
-        desktop_actions: true,
-        max_entries: 30,
-        preprocess_exec_script: Some("${pkgs.writers.writeDash "anyrun-run.sh" ''
-          if [ "$1" = "term" ]
-          then
-            shift
-            echo "app2unit -T -- $*"
-            echo "app2unit -T -- $*" >> ~/foo
-          else
-            shift
-            echo "app2unit -- $*"
-          fi
-        ''}"),
-        terminal: Some(Terminal(
-          command: "",
-          args: "",
-        )),
-      )
-    '';
-    "style.css" = ''
-      window {
-        background: transparent;
-      }
-
-      * {
-        font-family: "Adwaita Sans", "Symbols Nerd Font";
-        outline-color: @accent-color;
-        color: white;
-      }
-
-      .main {
-        padding: 0;
-        margin: 6px;
-        background: @background-color;
-        border-radius: 10px;
-        border: 2px solid @accent-border-color;
-        box-shadow: 0 0 5px black;
-      }
-
-      text {
-        margin: 8px 10px;
-        font-size: 15pt;
-      }
-
-      box.info {
-        min-width: 160px;
-      }
-
-      box.info image {
-        margin: 6px;
-      }
-
-      list.plugin {
-        background: transparent;
-      }
-
-      box.matches {
-        border-top: 1px solid @border-color;
-      }
-
-      box.matches > box {
-        padding: 10px 12px;
-        border-bottom: 1px solid @border-color;
-      }
-
-      row.match {
-        border: 1px solid transparent;
-        border-radius: 5px;
-        margin: 4px 0;
-        padding: 4px;
-      }
-
-      row.match:selected {
-        background: @button-hover-color;
-        border: 1px solid @border-color;
-      }
-
-      row.match box.match:first-child {
-        border-left: 4px solid transparent;
-        margin: -4px;
-        padding: 4px 6px;
-      }
-
-      row.match:selected box.match:first-child {
-        border-left: 4px solid @accent-color;
-        border-radius: 4px;
-        margin: -4px;
-        padding: 4px 6px;
-      }
-
-      label.match.description {
-        font-size: 10pt;
-      }
-    '';
+  config = lib.mkIf config.zaphyra.programs.anyrun-launcher.enable {
+    home.packages = [ pkgs.tgc.anyrun ];
+
+    programs.niri.settings.binds = {
+      "Mod+Space".action.spawn = [
+        (lib.getExe pkgs.unstable.app2unit)
+        "-C"
+        "--"
+        (lib.getExe pkgs.tgc.anyrun)
+      ];
+    };
+
+    xdg.configFile = lib.mapAttrs' (name: value: lib.nameValuePair "anyrun/${name}" { text = value; }) {
+      "config.ron" = ''
+        Config(
+          ignore_exclusive_zones: false,
+          layer: Overlay,
+          hide_plugin_info: false,
+          close_on_click: true,
+          max_entries: None,
+          plugins: [
+            "${pkgs.tgc.anyrun}/lib/libniri_focus.so",
+            "${pkgs.tgc.anyrun}/lib/libapplications.so",
+          ],
+          keybinds: [
+            Keybind(
+              key: "Return",
+              action: Select,
+            ),
+            Keybind(
+              key: "Up",
+              action: Up,
+            ),
+            Keybind(
+              key: "Down",
+              action: Down,
+            ),
+            Keybind(
+              key: "Escape",
+              action: Close,
+            ),
+          ],
+        )
+      '';
+      "applications.ron" = ''
+        Config(
+          desktop_actions: true,
+          max_entries: 30,
+          preprocess_exec_script: Some("${pkgs.writers.writeDash "anyrun-run.sh" ''
+            if [ "$1" = "term" ]
+            then
+              shift
+              echo "app2unit -T -- $*"
+              echo "app2unit -T -- $*" >> ~/foo
+            else
+              shift
+              echo "app2unit -- $*"
+            fi
+          ''}"),
+          terminal: Some(Terminal(
+            command: "",
+            args: "",
+          )),
+        )
+      '';
+      "style.css" = ''
+        window {
+          background: transparent;
+        }
+
+        * {
+          font-family: "Adwaita Sans", "Symbols Nerd Font";
+          outline-color: @accent-color;
+          color: white;
+        }
+
+        .main {
+          padding: 0;
+          margin: 6px;
+          background: @background-color;
+          border-radius: 10px;
+          border: 2px solid @accent-border-color;
+          box-shadow: 0 0 5px black;
+        }
+
+        text {
+          margin: 8px 10px;
+          font-size: 15pt;
+        }
+
+        box.info {
+          min-width: 160px;
+        }
+
+        box.info image {
+          margin: 6px;
+        }
+
+        list.plugin {
+          background: transparent;
+        }
+
+        box.matches {
+          border-top: 1px solid @border-color;
+        }
+
+        box.matches > box {
+          padding: 10px 12px;
+          border-bottom: 1px solid @border-color;
+        }
+
+        row.match {
+          border: 1px solid transparent;
+          border-radius: 5px;
+          margin: 4px 0;
+          padding: 4px;
+        }
+
+        row.match:selected {
+          background: @button-hover-color;
+          border: 1px solid @border-color;
+        }
+
+        row.match box.match:first-child {
+          border-left: 4px solid transparent;
+          margin: -4px;
+          padding: 4px 6px;
+        }
+
+        row.match:selected box.match:first-child {
+          border-left: 4px solid @accent-color;
+          border-radius: 4px;
+          margin: -4px;
+          padding: 4px 6px;
+        }
+
+        label.match.description {
+          font-size: 10pt;
+        }
+      '';
+    };
   };
 
 }
diff --git a/config/home/zaphyra/programs/apostrophe.nix b/config/home/zaphyra/programs/apostrophe.nix
@@ -1,10 +1,20 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.apostrophe ];
+  options.zaphyra.programs.apostrophe.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.apostrophe.enable {
+    home.packages = [ pkgs.apostrophe ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/bat.nix b/config/home/zaphyra/programs/bat.nix
@@ -1,15 +1,26 @@
-_:
+{
+  config,
+  lib,
+  ...
+}:
 
 {
 
-  programs.bat = {
-    enable = true;
-    config.theme = "ansi";
+  options.zaphyra.programs.bat.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = true;
   };
 
-  home.shellAliases = {
-    cat = "bat -pp";
-    less = "bat";
+  config = lib.mkIf config.zaphyra.programs.bat.enable {
+    programs.bat = {
+      enable = true;
+      config.theme = "ansi";
+    };
+
+    home.shellAliases = {
+      cat = "bat -pp";
+      less = "bat";
+    };
   };
 
 }
diff --git a/config/home/zaphyra/programs/bitwarden-cli.nix b/config/home/zaphyra/programs/bitwarden-cli.nix
@@ -1,25 +1,34 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
+  options.zaphyra.programs.bitwarden-cli.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  home.packages = [ pkgs.bitwarden-cli ];
+  config = lib.mkIf config.zaphyra.programs.bitwarden-cli.enable {
+    home.packages = [ pkgs.bitwarden-cli ];
 
-  programs = {
-    zsh.initExtra = ''
-      bw-unlock () {
-        if [[ -z $BW_SESSION ]] ; then
-          export BW_SESSION="$(bw unlock --raw)"
-        fi
-      }
-    '';
-    fish.functions.bw-unlock = ''
-      if set -g BW_SESSION
-        set -gx BW_SESSION "$(bw unlock --raw)"
-      end
-    '';
+    programs = {
+      zsh.initExtra = ''
+        bw-unlock () {
+          if [[ -z $BW_SESSION ]] ; then
+            export BW_SESSION="$(bw unlock --raw)"
+          fi
+        }
+      '';
+      fish.functions.bw-unlock = ''
+        if set -g BW_SESSION
+          set -gx BW_SESSION "$(bw unlock --raw)"
+        end
+      '';
+    };
   };
 
 }
diff --git a/config/home/zaphyra/programs/celluloid.nix b/config/home/zaphyra/programs/celluloid.nix
@@ -1,17 +1,27 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.celluloid ];
+  options.zaphyra.programs.celluloid.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.celluloid.enable {
+    home.packages = [ pkgs.celluloid ];
 
-  dconf.settings = {
-    "io/github/celluloid-player/celluloid" = {
-      always-append-to-playlist = true;
-      draggable-video-area-enable = true;
-      always-autohide-cursor = true;
+    dconf.settings = {
+      "io/github/celluloid-player/celluloid" = {
+        always-append-to-playlist = true;
+        draggable-video-area-enable = true;
+        always-autohide-cursor = true;
+      };
     };
   };
 
diff --git a/config/home/zaphyra/programs/chaosctl.nix b/config/home/zaphyra/programs/chaosctl.nix
@@ -1,5 +1,6 @@
 {
   config,
+  systemConfig,
   pkgs,
   lib,
   ...

@@ -7,14 +8,21 @@
 
 {
 
-  home.packages = [ pkgs.tgc.chaosctl ];
+  options.zaphyra.programs.chaosctl.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.chaosctl.enable {
+    home.packages = [ pkgs.tgc.chaosctl ];
 
-  programs.niri.settings.binds = with config.lib.niri.actions; {
-    "Mod+Shift+D".action = spawn "${pkgs.writeShellScript "cccda-buzzer" ''
-      export GNUPGHOME=${config.programs.gpg.homedir}
-      export SSH_AUTH_SOCK=$(${lib.getExe' pkgs.gnupg "gpgconf"} --list-dirs agent-ssh-socket)
-      ${lib.getExe' pkgs.libnotify "notify-send"} -e "CCCDA-Door" "$(${lib.getExe pkgs.tgc.chaosctl} door buzzer)"
-    ''}";
+    programs.niri.settings.binds = with config.lib.niri.actions; {
+      "Mod+Shift+D".action = spawn "${pkgs.writeShellScript "cccda-buzzer" ''
+        export GNUPGHOME=${config.programs.gpg.homedir}
+        export SSH_AUTH_SOCK=$(${lib.getExe' pkgs.gnupg "gpgconf"} --list-dirs agent-ssh-socket)
+        ${lib.getExe' pkgs.libnotify "notify-send"} -e "CCCDA-Door" "$(${lib.getExe pkgs.tgc.chaosctl} door buzzer)"
+      ''}";
+    };
   };
 
 }
diff --git a/config/home/zaphyra/programs/chawan.nix b/config/home/zaphyra/programs/chawan.nix
@@ -1,17 +1,28 @@
-_:
+{
+  config,
+  systemConfig,
+  lib,
+  ...
+}:
 
 {
 
-  programs.chawan = {
-    enable = true;
-    settings = {
-      buffer = {
-        images = true;
-        scripting = "app";
-        autofocus = true;
-        cookie = "save";
+  options.zaphyra.programs.chawan.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.chawan.enable {
+    programs.chawan = {
+      enable = true;
+      settings = {
+        buffer = {
+          images = true;
+          scripting = "app";
+          autofocus = true;
+          cookie = "save";
+        };
       };
     };
   };
-
 }
diff --git a/config/home/zaphyra/programs/cozy.nix b/config/home/zaphyra/programs/cozy.nix
@@ -1,10 +1,16 @@
 {
+  config,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.cozy ];
+  options.zaphyra.programs.cozy.enable = lib.mkEnableOption "Enable cozy audiobook player";
+
+  config = lib.mkIf config.zaphyra.programs.cozy.enable {
+    home.packages = [ pkgs.cozy ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/default.nix b/config/home/zaphyra/programs/default.nix
@@ -0,0 +1,5 @@
+_: {
+  imports = builtins.map (v: ./${v}) (
+    builtins.filter (v: v != "default.nix") (builtins.attrNames (builtins.readDir ./.))
+  );
+}
diff --git a/config/home/zaphyra/programs/deploymentUtilities.nix b/config/home/zaphyra/programs/deploymentUtilities.nix
@@ -1,18 +1,28 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = with pkgs; [
-    age
-    ssh-to-age
+  options.zaphyra.programs.deploymentUtilities.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-    sops
+  config = lib.mkIf config.zaphyra.programs.deploymentUtilities.enable {
+    home.packages = with pkgs; [
+      age
+      ssh-to-age
 
-    deploy-rs
-    nh
-  ];
+      sops
+
+      deploy-rs
+      nh
+    ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/dino.nix b/config/home/zaphyra/programs/dino.nix
@@ -1,15 +1,24 @@
 {
   config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "dino/.local/share/dino"
-  ];
+  options.zaphyra.programs.dino.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  home.packages = [ pkgs.dino ];
+  config = lib.mkIf config.zaphyra.programs.dino.enable {
+    home.packages = [ pkgs.dino ];
+
+    home.persistence."/nix/persist/home/${config.home.username}".directories = [
+      "dino/.local/share/dino"
+    ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/errands.nix b/config/home/zaphyra/programs/errands.nix
@@ -1,15 +1,24 @@
 {
   config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "errands/.local/share/errands"
-  ];
+  options.zaphyra.programs.errands.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  home.packages = [ pkgs.errands ];
+  config = lib.mkIf config.zaphyra.programs.errands.enable {
+    home.packages = [ pkgs.errands ];
+
+    home.persistence."/nix/persist/home/${config.home.username}".directories = [
+      "errands/.local/share/errands"
+    ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/eza.nix b/config/home/zaphyra/programs/eza.nix
@@ -1,19 +1,30 @@
-_:
+{
+  config,
+  lib,
+  ...
+}:
 
 {
 
-  programs.eza = {
-    enable = true;
-    git = true;
-    icons = "auto";
+  options.zaphyra.programs.eza.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = true;
   };
 
-  home.shellAliases = {
-    ls = "eza";
-    ll = "eza -l";
-    la = "eza -a";
-    lla = "eza -la";
-    tree = "eza --tree -a";
+  config = lib.mkIf config.zaphyra.programs.eza.enable {
+    programs.eza = {
+      enable = true;
+      git = true;
+      icons = "auto";
+    };
+
+    home.shellAliases = {
+      ls = "eza";
+      ll = "eza -l";
+      la = "eza -a";
+      lla = "eza -la";
+      tree = "eza --tree -a";
+    };
   };
 
 }
diff --git a/config/home/zaphyra/programs/firefox.nix b/config/home/zaphyra/programs/firefox.nix
@@ -1,6 +1,7 @@
 {
   inputs,
   config,
+  systemConfig,
   pkgs,
   lib,
   ...

@@ -8,314 +9,337 @@
 
 {
 
-  home = {
-    persistence."/nix/persist/home/${config.home.username}".directories = [
-      "firefox/.mozilla/firefox/"
-      "firefox/.cache/mozilla/firefox"
-    ];
+  options.zaphyra.programs.firefox.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-    sessionVariables = {
-      BROWSER = "firefox";
-    };
+  config = lib.mkIf config.zaphyra.programs.firefox.enable {
+    home = {
+      persistence."/nix/persist/home/${config.home.username}".directories = [
+        "firefox/.mozilla/firefox/"
+        "firefox/.cache/mozilla/firefox"
+      ];
 
-    file."firefox-gnome-theme" = {
-      source = inputs.firefoxGnomeTheme;
-      target = ".mozilla/firefox/${config.home.username}/chrome/firefox-gnome-theme";
-    };
-  };
+      sessionVariables = {
+        BROWSER = "firefox";
+      };
 
-  programs.firefox = {
-    enable = true;
-    package = pkgs.firefox;
-    nativeMessagingHosts = [ pkgs.ff2mpv-rust ];
-
-    profiles."${config.home.username}" = {
-      id = 0;
-      isDefault = true;
-
-      settings = {
-        # required for firefox-gnome-theme
-        "browser.toolbars.bookmarks.visibility" = "never";
-        "browser.tabs.drawInTitlebar" = true;
-        "browser.theme.dark-private-windows" = false;
-        "browser.uidensity" = 0;
-        "svg.context-properties.content.enabled" = true;
-        "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
+      file."firefox-gnome-theme" = {
+        source = inputs.firefoxGnomeTheme;
+        target = ".mozilla/firefox/${config.home.username}/chrome/firefox-gnome-theme";
       };
+    };
 
-      userChrome = ''
-        @import "firefox-gnome-theme/userChrome.css";
-      '';
+    programs.firefox = {
+      enable = true;
+      package = pkgs.firefox;
+      nativeMessagingHosts = with pkgs; [
+        ff2mpv-rust
+        fx-cast-bridge
+      ];
+
+      profiles."${config.home.username}" = {
+        id = 0;
+        isDefault = true;
+
+        settings = {
+          # required for firefox-gnome-theme
+          "browser.toolbars.bookmarks.visibility" = "never";
+          "browser.tabs.drawInTitlebar" = true;
+          "browser.theme.dark-private-windows" = false;
+          "browser.uidensity" = 0;
+          "svg.context-properties.content.enabled" = true;
+          "toolkit.legacyUserProfileCustomizations.stylesheets" = true;
+        };
 
-      userContent = ''
-        @import "firefox-gnome-theme/userContent.css";
-      '';
+        userChrome = ''
+          @import "firefox-gnome-theme/userChrome.css";
+        '';
 
-      search.force = true; # Required to prevent search engine symlink being overwritten. See https://github.com/nix-community/home-manager/issues/3698
-      search.engines = {
-        "Noogle" = {
-          icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
-          definedAliases = [ "@noogle" ];
-          urls = [ { template = "https://noogle.dev/q?term={searchTerms}"; } ];
-        };
+        userContent = ''
+          @import "firefox-gnome-theme/userContent.css";
+        '';
 
-        "NixOS Options" = {
-          icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
-          definedAliases = [ "@nixos" ];
-          urls = [ { template = "https://search.nixos.org/options?query={searchTerms}"; } ];
-        };
+        search.force = true; # Required to prevent search engine symlink being overwritten. See https://github.com/nix-community/home-manager/issues/3698
+        search.engines = {
+          "Noogle" = {
+            icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+            definedAliases = [ "@noogle" ];
+            urls = [ { template = "https://noogle.dev/q?term={searchTerms}"; } ];
+          };
 
-        "Nix Packages" = {
-          icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
-          definedAliases = [ "@nixpkgs" ];
-          urls = [ { template = "https://search.nixos.org/packages?query={searchTerms}"; } ];
+          "NixOS Options" = {
+            icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+            definedAliases = [ "@nixos" ];
+            urls = [ { template = "https://search.nixos.org/options?query={searchTerms}"; } ];
+          };
+
+          "Nix Packages" = {
+            icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+            definedAliases = [ "@nixpkgs" ];
+            urls = [ { template = "https://search.nixos.org/packages?query={searchTerms}"; } ];
+          };
         };
       };
-    };
 
-    policies = {
-      DisableSetDesktopBackground = true;
+      policies = {
+        DisableSetDesktopBackground = true;
 
-      # disable tracking bullshit
-      DisableTelemetry = true;
-      DisablePocket = true;
-      DisableFirefoxStudies = true;
-      DisableFeedbackCommands = true;
+        # disable tracking bullshit
+        DisableTelemetry = true;
+        DisablePocket = true;
+        DisableFirefoxStudies = true;
+        DisableFeedbackCommands = true;
 
-      # disable password manager
-      PasswordManagerEnabled = false;
-      OfferToSaveLogins = false;
-      PrimaryPassword = false;
-      AutofillCreditCardEnabled = false;
+        # disable password manager
+        PasswordManagerEnabled = false;
+        OfferToSaveLogins = false;
+        PrimaryPassword = false;
+        AutofillCreditCardEnabled = false;
 
-      # disable bookmark-toolbar
-      NoDefaultBookmarks = true;
-      DisplayBookmarksToolbar = "never";
-      DisplayMenuBar = "default-off";
+        # disable bookmark-toolbar
+        NoDefaultBookmarks = true;
+        DisplayBookmarksToolbar = "never";
+        DisplayMenuBar = "default-off";
 
-      Homepage.StartPage = "previous-session";
-      Homepage.Locked = true;
+        Homepage.StartPage = "previous-session";
+        Homepage.Locked = true;
 
-      # disable DoH
-      DNSOverHTTPS.Enabled = false;
-      DNSOverHTTPS.Locked = true;
+        # disable DoH
+        DNSOverHTTPS.Enabled = false;
+        DNSOverHTTPS.Locked = true;
 
-      # enable tracking protection
-      EnableTrackingProtection = {
+        # enable tracking protection
+        EnableTrackingProtection = {
 
-        Cryptomining = true;
-        Fingerprinting = true;
-        Value = true;
-        Locked = true;
-      };
+          Cryptomining = true;
+          Fingerprinting = true;
+          Value = true;
+          Locked = true;
+        };
 
-      UserMessaging = {
-        ExtensionRecommendations = false;
-        FeatureRecommendations = false;
-        UrlbarInterventions = false;
-        SkipOnboarding = true;
-        MoreFromMozilla = false;
-        FirefoxLabs = false;
-        Locked = true;
-      };
+        UserMessaging = {
+          ExtensionRecommendations = false;
+          FeatureRecommendations = false;
+          UrlbarInterventions = false;
+          SkipOnboarding = true;
+          MoreFromMozilla = false;
+          FirefoxLabs = false;
+          Locked = true;
+        };
 
-      Handlers.schemes =
-        let
-          handler = {
-            action = "useHelperApp";
-            ask = true;
-            handlers = [
-              {
-                name = "VDV PKPass DB Navigator Hook";
-                path = pkgs.writeShellScript "db-hook" ''
-                  #!/usr/bin/env bash
-
-                  if [[ "$1" == "dbnav:"* ]]; then
-                    url=$(echo -n $1 | base64)
-                    xdg-open "https://vdv-pkpass.magicalcodewit.ch/account/db_login/callback?url=$url"
-                  elif [[ "$1" == "bahnbonus:"* ]]; then
-                    url=$(echo -n $1 | base64)
-                    xdg-open "https://vdv-pkpass.magicalcodewit.ch/account/bahnbonus_login/callback?url=$url"
-                  else
-                    xdg-open "$1"
-                  fi
-                '';
-              }
-            ];
+        Handlers.schemes =
+          let
+            handler = {
+              action = "useHelperApp";
+              ask = true;
+              handlers = [
+                {
+                  name = "VDV PKPass DB Navigator Hook";
+                  path = pkgs.writeShellScript "db-hook" ''
+                    #!/usr/bin/env bash
+
+                    if [[ "$1" == "dbnav:"* ]]; then
+                      url=$(echo -n $1 | base64)
+                      xdg-open "https://vdv-pkpass.magicalcodewit.ch/account/db_login/callback?url=$url"
+                    elif [[ "$1" == "bahnbonus:"* ]]; then
+                      url=$(echo -n $1 | base64)
+                      xdg-open "https://vdv-pkpass.magicalcodewit.ch/account/bahnbonus_login/callback?url=$url"
+                    else
+                      xdg-open "$1"
+                    fi
+                  '';
+                }
+              ];
+            };
+          in
+          {
+            dbnav = handler;
+            bahnbonus = handler;
           };
-        in
-        {
-          dbnav = handler;
-          bahnbonus = handler;
-        };
 
-      Preferences = {
-        "browser.uiCustomization.state".Status = "default";
-        "browser.uiCustomization.state".Value = builtins.toJSON {
-          currentVersion = 21;
-          newElementCount = 7;
-          seen = [ ];
-          dirtyAreaCache = [ ];
-          placements = {
-            widget-overflow-fixed-list = [ ];
-            toolbar-menubar = [ "menubar-items" ];
-            vertical-tabs = [ ];
-            PersonalToolbar = [ ];
-            unified-extensions-area = [ ];
-            nav-bar = [
-              "back-button"
-              "forward-button"
-              "vertical-spacer"
-              "stop-reload-button"
-              "urlbar-container"
-              "downloads-button"
-              "_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action"
-              "ublock0_raymondhill_net-browser-action"
-              "unified-extensions-button"
-            ];
-            TabsToolbar = [
-              "tabbrowser-tabs"
-              "new-tab-button"
-            ];
+        Preferences = {
+          "browser.uiCustomization.state".Status = "default";
+          "browser.uiCustomization.state".Value = builtins.toJSON {
+            currentVersion = 21;
+            newElementCount = 7;
+            seen = [ ];
+            dirtyAreaCache = [ ];
+            placements = {
+              widget-overflow-fixed-list = [ ];
+              toolbar-menubar = [ "menubar-items" ];
+              vertical-tabs = [ ];
+              PersonalToolbar = [ ];
+              unified-extensions-area = [ ];
+              nav-bar = [
+                "back-button"
+                "forward-button"
+                "vertical-spacer"
+                "stop-reload-button"
+                "urlbar-container"
+                "downloads-button"
+                "_446900e4-71c2-419f-a6a7-df9c091e268b_-browser-action"
+                "ublock0_raymondhill_net-browser-action"
+                "unified-extensions-button"
+              ];
+              TabsToolbar = [
+                "tabbrowser-tabs"
+                "new-tab-button"
+              ];
+            };
           };
-        };
-      }
-      // (lib.mapAttrs
-        (_name: value: {
-          Status = "locked";
-          Value = value;
-        })
-        {
-          # disable some password-manager/autofill features
-          "signon.generation.enabled" = false;
-          "signon.autofillForms" = false;
-          "signon.firefoxRelay.feature" = "disabled";
-          "signon.management.page.breach-alerts.enabled" = false;
-
-          # ask websites to not share or sell data
-          "privacy.globalprivacycontrol.enabled" = true;
-
-          # disable warning on `abou:config`
-          "browser.aboutConfig.showWarning" = false;
-
-          # disable telemetry stuff
-          "browser.ping-centre.telemetry" = false;
-          "browser.topsites.contile.enabled" = false;
-          "browser.crashReports.unsubmittedCheck.autoSubmit2" = false;
-
-          # just open previous session
-          "browser.startup.page" = 3;
-
-          # disable trending search suggestions
-          "browser.urlbar.suggest.trending" = false;
-
-          # disable 'fancy' newtab page bullshit with tons of tracking and ads
-          "browser.startup.homepage" = "chrome://browser/content/blanktab.html";
-          "browser.newtabpage.enabled" = false;
-          "browser.newtabpage.activity-stream.telemetry" = false;
-          "browser.newtabpage.activity-stream.showSearch" = false;
-          "browser.newtabpage.activity-stream.showSponsored" = false;
-          "browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
-          "browser.newtabpage.activity-stream.feeds.telemetry" = false;
-          "browser.newtabpage.activity-stream.feeds.topsites" = false;
-          "browser.newtabpage.activity-stream.feeds.snippets" = false;
-          "browser.newtabpage.activity-stream.feeds.system.topsites" = false;
-          "browser.newtabpage.activity-stream.feeds.section.highlights" = false;
-          "browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
-          "browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = false;
-          "browser.newtabpage.activity-stream.section.highlights.includeDownloads" = false;
-          "browser.newtabpage.activity-stream.section.highlights.includeVisited" = false;
         }
-      );
-
-      ExtensionSettings =
-        lib.pipe
-          [
-            [
-              "navbar"
-              "{446900e4-71c2-419f-a6a7-df9c091e268b}"
-            ] # Bitwarden Password Manager
-            [
-              "navbar"
-              "uBlock0@raymondhill.net"
-            ] # uBlock Origin
-            [
-              "menupanel"
-              "@ublacklist"
-            ] # uBlacklist
-            [
-              "menupanel"
-              "@contain-facebook"
-            ] # Facebook Container
-            [
-              "menupanel"
-              "@contain-google"
-            ] # Google Container
-            [
-              "menupanel"
-              "containerise@kinte.sh"
-            ] # Containerise
-            [
-              "menupanel"
-              "{12cf650b-1822-40aa-bff0-996df6948878}"
-            ] # cookies.txt
+        // (lib.mapAttrs
+          (_name: value: {
+            Status = "locked";
+            Value = value;
+          })
+          {
+            # disable some password-manager/autofill features
+            "signon.generation.enabled" = false;
+            "signon.autofillForms" = false;
+            "signon.firefoxRelay.feature" = "disabled";
+            "signon.management.page.breach-alerts.enabled" = false;
+
+            # ask websites to not share or sell data
+            "privacy.globalprivacycontrol.enabled" = true;
+
+            # disable warning on `abou:config`
+            "browser.aboutConfig.showWarning" = false;
+
+            # disable telemetry stuff
+            "browser.ping-centre.telemetry" = false;
+            "browser.topsites.contile.enabled" = false;
+            "browser.crashReports.unsubmittedCheck.autoSubmit2" = false;
+
+            # just open previous session
+            "browser.startup.page" = 3;
+
+            # disable trending search suggestions
+            "browser.urlbar.suggest.trending" = false;
+
+            # disable 'fancy' newtab page bullshit with tons of tracking and ads
+            "browser.startup.homepage" = "chrome://browser/content/blanktab.html";
+            "browser.newtabpage.enabled" = false;
+            "browser.newtabpage.activity-stream.telemetry" = false;
+            "browser.newtabpage.activity-stream.showSearch" = false;
+            "browser.newtabpage.activity-stream.showSponsored" = false;
+            "browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
+            "browser.newtabpage.activity-stream.feeds.telemetry" = false;
+            "browser.newtabpage.activity-stream.feeds.topsites" = false;
+            "browser.newtabpage.activity-stream.feeds.snippets" = false;
+            "browser.newtabpage.activity-stream.feeds.system.topsites" = false;
+            "browser.newtabpage.activity-stream.feeds.section.highlights" = false;
+            "browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
+            "browser.newtabpage.activity-stream.section.highlights.includeBookmarks" = false;
+            "browser.newtabpage.activity-stream.section.highlights.includeDownloads" = false;
+            "browser.newtabpage.activity-stream.section.highlights.includeVisited" = false;
+          }
+        );
+
+        ExtensionSettings =
+          lib.pipe
             [
-              "menupanel"
-              "@testpilot-containers"
-            ] # Firefox Multi-Account Containers
+              # Bitwarden Password Manager
+              [
+                "navbar"
+                "{446900e4-71c2-419f-a6a7-df9c091e268b}"
+              ]
+              # uBlock Origin
+              [
+                "navbar"
+                "uBlock0@raymondhill.net"
+              ]
+              # uBlacklist
+              [
+                "menupanel"
+                "@ublacklist"
+              ]
+              # Facebook Container
+              [
+                "menupanel"
+                "@contain-facebook"
+              ]
+              # Google Container
+              [
+                "menupanel"
+                "@contain-google"
+              ]
+              # Containerise
+              [
+                "menupanel"
+                "containerise@kinte.sh"
+              ]
+              # cookies.txt
+              [
+                "menupanel"
+                "{12cf650b-1822-40aa-bff0-996df6948878}"
+              ]
+              # Firefox Multi-Account Containers
+              [
+                "menupanel"
+                "@testpilot-containers"
+              ]
+              # IndicateTLS
+              [
+                "menupanel"
+                "{252ee273-8c8d-4609-b54d-62ae345be0a1}"
+              ]
+              # IPvFoo
+              [
+                "menupanel"
+                "ipvfoo@pmarks.net"
+              ]
+              # Modern for Wikipedia
+              [
+                "menupanel"
+                "{e9090647-32ff-48e4-9c3c-1361e8fd270e}"
+              ]
+              # SponsorBlock for YouTube - Skip Sponsorships
+              [
+                "menupanel"
+                "sponsorBlocker@ajay.app"
+              ]
+              # German Dictionary
+              [
+                "menupanel"
+                "de-DE@dictionaries.addons.mozilla.org"
+              ]
+            ]
             [
-              "menupanel"
-              "{252ee273-8c8d-4609-b54d-62ae345be0a1}"
-            ] # IndicateTLS
-            [
-              "menupanel"
-              "ipvfoo@pmarks.net"
-            ] # IPvFoo
-            [
-              "menupanel"
-              "{e9090647-32ff-48e4-9c3c-1361e8fd270e}"
-            ] # Modern for Wikipedia
-            [
-              "menupanel"
-              "sponsorBlocker@ajay.app"
-            ] # SponsorBlock for YouTube - Skip Sponsorships
-            [
-              "menupanel"
-              "de-DE@dictionaries.addons.mozilla.org"
-            ] # German Dictionary
-          ]
-          [
-            (lib.map (config: {
-              name = lib.elemAt config 1;
-              value = {
-                installation_mode = "normal_installed";
-                default_area = lib.elemAt config 0;
-                install_url = "https://addons.mozilla.org/firefox/downloads/latest/${lib.elemAt config 1}/latest.xpi";
-              };
-            }))
-            lib.listToAttrs
-          ];
+              (lib.map (config: {
+                name = lib.elemAt config 1;
+                value = {
+                  installation_mode = "normal_installed";
+                  default_area = lib.elemAt config 0;
+                  install_url = "https://addons.mozilla.org/firefox/downloads/latest/${lib.elemAt config 1}/latest.xpi";
+                };
+              }))
+              lib.listToAttrs
+            ];
+      };
     };
-  };
 
-  xdg = {
-    enable = true;
-    mime.enable = true;
+    xdg = {
+      enable = true;
+      mime.enable = true;
 
-    #force hm to override existing mimeapps.list file
-    configFile."mimeapps.list".force = true;
+      #force hm to override existing mimeapps.list file
+      configFile."mimeapps.list".force = true;
 
-    mimeApps = {
-      enable = true;
-      defaultApplications = {
-        "x-scheme-handler/http" = "firefox.desktop";
-        "x-scheme-handler/https" = "firefox.desktop";
-        "x-scheme-handler/chrome" = "firefox.desktop";
+      mimeApps = {
+        enable = true;
+        defaultApplications = {
+          "x-scheme-handler/http" = "firefox.desktop";
+          "x-scheme-handler/https" = "firefox.desktop";
+          "x-scheme-handler/chrome" = "firefox.desktop";
 
-        "image/svg+xml" = "firefox.desktop";
+          "image/svg+xml" = "firefox.desktop";
 
-        "text/html" = "firefox.desktop";
-        "text/xml" = "firefox.desktop";
+          "text/html" = "firefox.desktop";
+          "text/xml" = "firefox.desktop";
+        };
       };
     };
   };
diff --git a/config/home/zaphyra/programs/fish.nix b/config/home/zaphyra/programs/fish.nix
@@ -1,19 +1,25 @@
 {
   config,
+  lib,
   ...
 }:
 
 {
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "fish/.local/share/fish"
-  ];
-
-  programs.fish = {
-    enable = true;
-    generateCompletions = true;
+  options.zaphyra.programs.fish.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = true;
   };
 
-  # programs.sherlock.settings.ignore = "fish";
+  config = lib.mkIf config.zaphyra.programs.fish.enable {
+    programs.fish = {
+      enable = true;
+      generateCompletions = true;
+    };
+
+    home.persistence."/nix/persist/home/${config.home.username}".directories = [
+      "fish/.local/share/fish"
+    ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/fractal.nix b/config/home/zaphyra/programs/fractal.nix
@@ -1,16 +1,26 @@
 {
   config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "fractal/.local/share/fractal/"
-    "fractal/.cache/fractal/"
-  ];
+  options.zaphyra.programs.fractal.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  home.packages = [ pkgs.fractal ];
+  config = lib.mkIf config.zaphyra.programs.fractal.enable {
+    home.packages = [ pkgs.fractal ];
+
+    home.persistence."/nix/persist/home/${config.home.username}".directories = [
+      "fractal/.local/share/fractal/"
+      "fractal/.cache/fractal/"
+    ];
+
+  };
 
 }
diff --git a/config/home/zaphyra/programs/fuzzel.nix b/config/home/zaphyra/programs/fuzzel.nix
@@ -1,4 +1,9 @@
-_:
+{
+  config,
+  systemConfig,
+  lib,
+  ...
+}:
 
 let
   colors = import ../colors.nix;

@@ -6,57 +11,64 @@ let
 in
 {
 
-  programs.fuzzel = {
-    enable = true;
-    settings = {
-      main = {
-        launch-prefix = "app2unit --fuzzel-compat --";
-        dpi-aware = false;
-        horizontal-pad = 15;
-        vertical-pad = 15;
-        inner-pad = 5;
-      };
-      border = {
-        width = 2;
-        radius = 6;
-      };
-      colors = {
-        background = "#${
-          lib.concatStrings (
-            lib.map (elem: lib.toHexString elem) [
-              colors.background.r
-              colors.background.g
-              colors.background.b
-              (builtins.floor (100 * colors.background.a))
-            ]
-          )
-        }"; # Background color
-        border = "#${
-          lib.concatStrings (
-            lib.map (elem: lib.toHexString elem) [
-              colors.accentBorder.r
-              colors.accentBorder.g
-              colors.accentBorder.b
-              (builtins.floor (100 * colors.accentBorder.a))
-            ]
-          )
-        }"; # The color of the match count stats printed at the right-hand side of the input prompt
-        selection = "#${
-          lib.concatStrings (
-            lib.map (elem: lib.toHexString elem) [
-              colors.buttonHover.r
-              colors.buttonHover.g
-              colors.buttonHover.b
-              (builtins.floor (100 * colors.buttonHover.a))
-            ]
-          )
-        }"; # Background color of the selected entry
-        text = "#d8daddff"; # Text (foreground) color of unselected entries
-        prompt = "#d8daddff"; # Text (foreground) color of prompt character(s)
-        input = "#d8daddff"; # Text (foreground) color of input string
-        match = "#d8daddff"; # Text (foreground) color of the matched substring
-        selection-text = "#d8daddff"; # Text (foreground) color of the selected entry
-        selection-match = "#b7d4edf2"; # Text (foreground) color of the matched substring of the selected entry
+  options.zaphyra.programs.fuzzel.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.fuzzel.enable {
+    programs.fuzzel = {
+      enable = true;
+      settings = {
+        main = {
+          launch-prefix = "app2unit --fuzzel-compat --";
+          dpi-aware = false;
+          horizontal-pad = 15;
+          vertical-pad = 15;
+          inner-pad = 5;
+        };
+        border = {
+          width = 2;
+          radius = 6;
+        };
+        colors = {
+          background = "#${
+            lib.concatStrings (
+              lib.map (elem: lib.toHexString elem) [
+                colors.background.r
+                colors.background.g
+                colors.background.b
+                (builtins.floor (100 * colors.background.a))
+              ]
+            )
+          }"; # Background color
+          border = "#${
+            lib.concatStrings (
+              lib.map (elem: lib.toHexString elem) [
+                colors.accentBorder.r
+                colors.accentBorder.g
+                colors.accentBorder.b
+                (builtins.floor (100 * colors.accentBorder.a))
+              ]
+            )
+          }"; # The color of the match count stats printed at the right-hand side of the input prompt
+          selection = "#${
+            lib.concatStrings (
+              lib.map (elem: lib.toHexString elem) [
+                colors.buttonHover.r
+                colors.buttonHover.g
+                colors.buttonHover.b
+                (builtins.floor (100 * colors.buttonHover.a))
+              ]
+            )
+          }"; # Background color of the selected entry
+          text = "#d8daddff"; # Text (foreground) color of unselected entries
+          prompt = "#d8daddff"; # Text (foreground) color of prompt character(s)
+          input = "#d8daddff"; # Text (foreground) color of input string
+          match = "#d8daddff"; # Text (foreground) color of the matched substring
+          selection-text = "#d8daddff"; # Text (foreground) color of the selected entry
+          selection-match = "#b7d4edf2"; # Text (foreground) color of the matched substring of the selected entry
+        };
       };
     };
   };
diff --git a/config/home/zaphyra/programs/gajim.nix b/config/home/zaphyra/programs/gajim.nix
@@ -1,16 +1,25 @@
 {
   config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "gajim/.local/share/gajim"
-    "gajim/.config/gajim"
-  ];
+  options.zaphyra.programs.gajim.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  home.packages = [ pkgs.gajim ];
+  config = lib.mkIf config.zaphyra.programs.gajim.enable {
+    home.packages = [ pkgs.gajim ];
+
+    home.persistence."/nix/persist/home/${config.home.username}".directories = [
+      "gajim/.local/share/gajim"
+      "gajim/.config/gajim"
+    ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/ghostty.nix b/config/home/zaphyra/programs/ghostty.nix
@@ -1,19 +1,35 @@
-_:
+{
+  config,
+  systemConfig,
+  lib,
+  ...
+}:
 
 {
 
-  home.sessionVariables.TERMINAL = "ghostty";
+  options.zaphyra.programs.ghostty.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.ghostty.enable {
+    home.sessionVariables.TERMINAL = "ghostty";
+    # xdg.terminal-exec.settings.default = [ "com.mitchellh.ghostty.desktop" ];
+
+    programs.ghostty = {
+      enable = true;
+      enableFishIntegration = true;
+      enableZshIntegration = true;
+      enableBashIntegration = true;
+      installBatSyntax = true;
 
-  programs.ghostty = {
-    enable = true;
-    enableFishIntegration = true;
-    enableZshIntegration = true;
-    enableBashIntegration = true;
-    installBatSyntax = true;
+      settings = {
+        background-opacity = 0.8;
+        background-blur = true;
 
-    settings = {
-      background-opacity = 0.8;
-      background-blur = true;
+        clipboard-trim-trailing-spaces = true;
+        clipboard-paste-protection = false;
+      };
     };
   };
 
diff --git a/config/home/zaphyra/programs/git.nix b/config/home/zaphyra/programs/git.nix
@@ -1,49 +1,65 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.gitui ];
-  home.shellAliases = {
-    reinitgit = "rm -rf .git && git init && git add -A && git commit -m 'init'";
+  options.zaphyra.programs.git.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
   };
 
-  programs.lazygit = {
-    enable = true;
-    settings = {
-      disableStartupPopups = true;
-      gui.nerdFontsVersion = "3";
-      git.overrideGpg = true;
-      os.editPreset = "micro";
+  config = lib.mkIf config.zaphyra.programs.git.enable {
+    home.packages = [ pkgs.gitui ];
+    home.shellAliases = {
+      reinitgit = "rm -rf .git && git init && git add -A && git commit -m 'init'";
     };
-  };
 
-  programs.git = {
-    enable = true;
+    programs.lazygit = {
+      enable = true;
+      settings = {
+        disableStartupPopups = true;
+        gui.nerdFontsVersion = "3";
+        git.overrideGpg = true;
+        os.editPreset = "micro";
+      };
+    };
 
-    package = pkgs.gitFull;
+    programs.difftastic = {
+      enable = true;
+      git.enable = true;
+      git.diffToolMode = true;
+    };
 
-    userName = "Katja Ramona Sophie Kwast (zaphyra)";
-    userEmail = "git@zaphyra.eu";
+    programs.git = {
+      enable = true;
 
-    difftastic.enable = true;
+      package = pkgs.gitFull;
 
-    ignores = [
-      ".DS_Store"
-      "*.swp"
-    ];
+      ignores = [
+        ".DS_Store"
+        "*.swp"
+      ];
 
-    aliases = {
-      log-gpg = "log --show-signature";
-      pfusch = "push -f";
-    };
+      settings = {
+        user.name = "Katja Ramona Sophie Kwast (zaphyra)";
+        user.email = "git@zaphyra.eu";
+
+        aliases = {
+          log-gpg = "log --show-signature";
+          pfusch = "push -f";
+        };
 
-    extraConfig = {
-      features.manyFiles = true;
-      pull.rebase = false;
-      init.defaultBranch = "main";
+        extraConfig = {
+          features.manyFiles = true;
+          pull.rebase = false;
+          init.defaultBranch = "main";
+        };
+      };
     };
   };
 
diff --git a/config/home/zaphyra/programs/gnome-calendar.nix b/config/home/zaphyra/programs/gnome-calendar.nix
@@ -1,48 +1,23 @@
 {
   config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
-let
-  gnome-online-accounts = pkgs.gnome-online-accounts.overrideAttrs (prevAttrs: {
-    mesonFlags = prevAttrs.mesonFlags ++ [
-      "-Dexchange=false"
-      "-Dgoogle=false"
-      "-Dkerberos=false"
-      "-Downcloud=false"
-      "-Dwindows_live=false"
-      "-Dms_graph=false"
-    ];
-  });
-
-in
 {
+  options.zaphyra.programs.gnome-calendar.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "evolution-data-server/.local/share/evolution"
-    "gnome-online-accounts/.config/goa-1.0"
-  ];
-
-  home.packages = with pkgs; [
-    gnome-online-accounts-gtk
-    (evolution-data-server-gtk4.override {
-      withGtk4 = true;
-      enableOAuth2 = false;
-    })
-    gnome-calendar
-  ];
-
-  dbus.packages = [ gnome-online-accounts ];
-
-  systemd.user.services.gnome-online-accounts = {
-    Unit.Description = "Gnome Online Accounts";
+  config = lib.mkIf config.zaphyra.programs.gnome-calendar.enable {
+    zaphyra.programs.gnome-online-accounts.enable = true;
 
-    Service = {
-      Type = "dbus";
-      ExecStart = "${gnome-online-accounts}/libexec/goa-daemon";
-      BusName = "org.gnome.OnlineAccounts";
-    };
+    home.packages = with pkgs; [
+      gnome-calendar
+    ];
   };
 
 }
diff --git a/config/home/zaphyra/programs/gnome-obfuscate.nix b/config/home/zaphyra/programs/gnome-obfuscate.nix
@@ -1,10 +1,20 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.gnome-obfuscate ];
+  options.zaphyra.programs.gnome-obfuscate.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.gnome-obfuscate.enable {
+    home.packages = [ pkgs.gnome-obfuscate ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/gnome-online-accounts.nix b/config/home/zaphyra/programs/gnome-online-accounts.nix
@@ -0,0 +1,53 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+  options.zaphyra.programs.gnome-online-accounts.enable =
+    lib.mkEnableOption "Enable gnome-online-accounts and evolution-data-server";
+
+  config = lib.mkIf config.zaphyra.programs.gnome-online-accounts.enable (
+    let
+      gnome-online-accounts = pkgs.gnome-online-accounts.overrideAttrs (prevAttrs: {
+        mesonFlags = prevAttrs.mesonFlags ++ [
+          "-Dexchange=false"
+          "-Dgoogle=false"
+          "-Dkerberos=false"
+          "-Downcloud=false"
+          "-Dms_graph=false"
+        ];
+      });
+
+    in
+    {
+      home.persistence."/nix/persist/home/${config.home.username}".directories = [
+        "evolution-data-server/.local/share/evolution"
+        "gnome-online-accounts/.config/goa-1.0"
+      ];
+
+      home.packages = with pkgs; [
+        gnome-online-accounts-gtk
+        (evolution-data-server-gtk4.override {
+          withGtk4 = true;
+          enableOAuth2 = false;
+        })
+      ];
+
+      dbus.packages = [ gnome-online-accounts ];
+
+      systemd.user.services.gnome-online-accounts = {
+        Unit.Description = "Gnome Online Accounts";
+
+        Service = {
+          Type = "dbus";
+          ExecStart = "${gnome-online-accounts}/libexec/goa-daemon";
+          BusName = "org.gnome.OnlineAccounts";
+        };
+      };
+    }
+  );
+
+}
diff --git a/config/home/zaphyra/programs/gnome-text-editor.nix b/config/home/zaphyra/programs/gnome-text-editor.nix
@@ -1,21 +1,31 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.gnome-text-editor ];
+  options.zaphyra.programs.gnome-text-editor.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.gnome-text-editor.enable {
+    home.packages = [ pkgs.gnome-text-editor ];
 
-  dconf.settings = {
-    "org/gnome/TextEditor" = {
-      highlight-current-line = true;
-      wrap-text = true;
-      show-line-numbers = true;
-      show-map = true;
-      show-right-margin = true;
-      indent-style = "space";
-      indent-width = 4;
+    dconf.settings = {
+      "org/gnome/TextEditor" = {
+        highlight-current-line = true;
+        wrap-text = true;
+        show-line-numbers = true;
+        show-map = true;
+        show-right-margin = true;
+        indent-style = "space";
+        indent-width = 4;
+      };
     };
   };
 
diff --git a/config/home/zaphyra/programs/gpg.nix b/config/home/zaphyra/programs/gpg.nix
@@ -1,51 +1,59 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home = {
-    packages = [ pkgs.pcsctools ];
-
-    shellAliases = {
-      gpg-card-relearn = "gpg-connect-agent 'scd serialno' 'learn --force' /bye";
-    };
+  options.zaphyra.programs.gpg.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
   };
 
-  programs = {
-    gpg = {
-      enable = true;
-      mutableTrust = true;
-      mutableKeys = true;
-      settings.keyserver = "hkps://keyserver.ubuntu.com:443";
-      scdaemonSettings.disable-ccid = true;
-    };
+  config = lib.mkIf config.zaphyra.programs.gpg.enable {
+    home = {
+      packages = [ pkgs.pcsc-tools ];
 
-    git.signing = {
-      format = "openpgp";
-      signByDefault = true;
-      key = "95F0FE7CD7E6A022";
+      shellAliases = {
+        gpg-card-relearn = "gpg-connect-agent 'scd serialno' 'learn --force' /bye";
+      };
     };
 
-    # sherlock.settings.ignore = "Gscriptor";
-  };
+    programs = {
+      gpg = {
+        enable = true;
+        mutableTrust = true;
+        mutableKeys = true;
+        settings.keyserver = "hkps://keyserver.ubuntu.com:443";
+        scdaemonSettings.disable-ccid = true;
+      };
+
+      git.signing = {
+        format = "openpgp";
+        signByDefault = true;
+        key = "95F0FE7CD7E6A022";
+      };
+    };
 
-  services = {
-    gpg-agent = {
-      enable = true;
-      enableSshSupport = true;
-      enableExtraSocket = true;
+    services = {
+      gpg-agent = {
+        enable = true;
+        enableSshSupport = true;
+        enableExtraSocket = true;
 
-      pinentry.package = pkgs.pinentry-gnome3;
+        pinentry.package = pkgs.pinentry-gnome3;
 
-      defaultCacheTtl = 600;
-      defaultCacheTtlSsh = 600;
+        defaultCacheTtl = 600;
+        defaultCacheTtlSsh = 600;
 
-      sshKeys = [
-        # katja@zaphyra.eu
-        "595A90924C65444EF00F0890BA85DE2A57DD79B2"
-      ];
+        sshKeys = [
+          # katja@zaphyra.eu
+          "595A90924C65444EF00F0890BA85DE2A57DD79B2"
+        ];
+      };
     };
   };
 
diff --git a/config/home/zaphyra/programs/gtklock.nix b/config/home/zaphyra/programs/gtklock.nix
@@ -1,20 +1,30 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  tgc.programs.gtklock = {
-    enable = false;
-    systemd.enable = true;
-    settings.main = {
-      idle-hide = true;
-      idle-timeout = 10;
+  options.zaphyra.programs.gtklock.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.services.gtklock.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.gtklock.enable {
+    tgc.programs.gtklock = {
+      enable = false;
+      systemd.enable = true;
+      settings.main = {
+        idle-hide = true;
+        idle-timeout = 10;
+      };
+      modules = [
+        pkgs.gtklock-playerctl-module
+      ];
     };
-    modules = [
-      pkgs.gtklock-playerctl-module
-    ];
   };
 
 }
diff --git a/config/home/zaphyra/programs/helix.nix b/config/home/zaphyra/programs/helix.nix
@@ -1,43 +1,56 @@
 {
+  config,
+  systemConfig,
   lib,
   pkgs,
   ...
 }:
 
 {
+  options.zaphyra.programs.helix = {
+    enable = lib.mkOption {
+      type = lib.types.bool;
+      default = systemConfig.modules.presets.graphical.enable;
+    };
 
-  home = {
-    # sessionVariables.EDITOR = lib.mkForce "hx";
+    default = lib.mkOption {
+      type = lib.types.bool;
+      default = false;
+    };
   };
 
-  programs.helix = {
-    enable = true;
-    settings = {
-      editor.cursor-shape.insert = "bar";
-      editor.bufferline = "always";
-      keys.insert."C-t" = "indent";
-      keys.insert."C-d" = "unindent";
-      theme = "base16_default";
-    };
-    languages = {
-      language-server.scls.command = lib.getExe pkgs.unstable.simple-completion-language-server;
-      language = [
-        {
-          name = "stub";
-          scope = "text.stub";
-          file-types = [ ];
-          shebangs = [ ];
-          roots = [ ];
-          auto-format = false;
-          language-servers = [ "scls" ];
-        }
+  config = lib.mkIf config.zaphyra.programs.helix.enable {
+    programs.helix = {
+      enable = true;
+      settings = {
+        editor.cursor-shape.insert = "bar";
+        editor.bufferline = "always";
+        keys.insert."C-t" = "indent";
+        keys.insert."C-d" = "unindent";
+        theme = "base16_default";
+      };
+      languages = {
+        language-server.scls.command = lib.getExe pkgs.unstable.simple-completion-language-server;
+        language = [
+          {
+            name = "stub";
+            scope = "text.stub";
+            file-types = [ ];
+            shebangs = [ ];
+            roots = [ ];
+            auto-format = false;
+            language-servers = [ "scls" ];
+          }
+        ];
+      };
+      extraPackages = [
+        pkgs.markdown-oxide
       ];
     };
-    extraPackages = [
-      pkgs.markdown-oxide
-    ];
-  };
 
-  # programs.sherlock.settings.ignore = "Helix";
+    home = lib.mkIf config.zaphyra.programs.helix.default {
+      sessionVariables.EDITOR = lib.mkForce "hx";
+    };
+  };
 
 }
diff --git a/config/home/zaphyra/programs/htop.nix b/config/home/zaphyra/programs/htop.nix
@@ -1,25 +1,32 @@
 {
+  config,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  programs.htop = {
-    enable = true;
+  options.zaphyra.programs.htop.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = true;
+  };
 
-    package = pkgs.htop.override {
-      sensorsSupport = true;
-    };
+  config = lib.mkIf config.zaphyra.programs.htop.enable {
+    programs.htop = {
+      enable = true;
 
-    settings = {
-      hide_userland_threads = 1;
-      tree_view = 1;
-      show_program_path = 0;
-      show_cpu_frequency = 1;
+      package = pkgs.htop.override {
+        sensorsSupport = true;
+      };
+
+      settings = {
+        hide_userland_threads = 1;
+        tree_view = 1;
+        show_program_path = 0;
+        show_cpu_frequency = 1;
+      };
     };
   };
 
-  # programs.sherlock.settings.ignore = "Htop";
-
 }
diff --git a/config/home/zaphyra/programs/imv.nix b/config/home/zaphyra/programs/imv.nix
@@ -1,10 +1,16 @@
 {
+  config,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.imv ];
+  options.zaphyra.programs.imv.enable = lib.mkEnableOption "Enable imv";
+
+  config = lib.mkIf config.zaphyra.programs.imv.enable {
+    home.packages = [ pkgs.imv ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/languages/golang.nix b/config/home/zaphyra/programs/languages/golang.nix
@@ -1,17 +0,0 @@
-{
-  config,
-  lib,
-  pkgs,
-  ...
-}:
-
-{
-
-  home = {
-    packages = [ pkgs.go ];
-    sessionVariables.GOPATH = "${config.xdg.dataHome}/go";
-
-  };
-  programs.micro.lsp-servers.go.command = lib.getExe pkgs.gopls;
-
-}
diff --git a/config/home/zaphyra/programs/languages/javascript.nix b/config/home/zaphyra/programs/languages/javascript.nix
@@ -1,19 +0,0 @@
-{
-  lib,
-  pkgs,
-  ...
-}:
-
-{
-
-  home.packages = with pkgs; [
-    nodejs
-    pnpm
-  ];
-
-  programs.micro.lsp-servers.js.command = lib.getExe pkgs.typescript-language-server;
-  programs.helix.extraPackages = [
-    pkgs.typescript-language-server
-  ];
-
-}
diff --git a/config/home/zaphyra/programs/languages/nimlang.nix b/config/home/zaphyra/programs/languages/nimlang.nix
@@ -1,20 +0,0 @@
-{
-  lib,
-  pkgs,
-  ...
-}:
-
-{
-
-  home.packages = with pkgs; [
-    nim
-    nimble
-  ];
-
-  programs.micro.lsp-servers.nim.command = lib.getExe pkgs.nimlangserver;
-
-  programs.helix.extraPackages = [
-    pkgs.nimlangserver
-  ];
-
-}
diff --git a/config/home/zaphyra/programs/languages/nix.nix b/config/home/zaphyra/programs/languages/nix.nix
@@ -1,25 +0,0 @@
-{
-  lib,
-  pkgs,
-  ...
-}:
-
-{
-
-  home.packages = [ pkgs.nixfmt-rfc-style ];
-
-  programs.helix.extraPackages = [
-    pkgs.nixd
-    pkgs.nil
-  ];
-
-  programs.micro.lsp-servers.nix = {
-    command = lib.getExe pkgs.nixd;
-    options = {
-      config = builtins.toJSON {
-        formatting.command = [ (lib.getExe pkgs.nixfmt-rfc-style) ];
-      };
-    };
-  };
-
-}
diff --git a/config/home/zaphyra/programs/libreoffice.nix b/config/home/zaphyra/programs/libreoffice.nix
@@ -1,12 +1,20 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.libreoffice-fresh ];
+  options.zaphyra.programs.libreoffice.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  # programs.sherlock.settings.ignore = "LibreOffice *";
+  config = lib.mkIf config.zaphyra.programs.libreoffice.enable {
+    home.packages = [ pkgs.libreoffice-fresh ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/loupe.nix b/config/home/zaphyra/programs/loupe.nix
@@ -1,4 +1,6 @@
 {
+  config,
+  systemConfig,
   lib,
   pkgs,
   ...

@@ -6,34 +8,41 @@
 
 {
 
-  home.packages = [ pkgs.loupe ];
+  options.zaphyra.programs.loupe.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.loupe.enable {
+    home.packages = [ pkgs.loupe ];
 
-  xdg.mimeApps = {
-    enable = true;
-    defaultApplications = lib.genAttrs [
-      "image/jpeg"
-      "image/png"
-      "image/gif"
-      "image/webp"
-      "image/tiff"
-      "mage/bmp"
-      "image/svg+xml"
-      "image/svg+xml-compressed"
-      "image/avif"
-      "image/heic"
-    ] (_name: [ "org.gnome.Loupe.desktop" ]);
-    associations.added = lib.genAttrs [
-      "image/jpeg"
-      "image/png"
-      "image/gif"
-      "image/webp"
-      "image/tiff"
-      "mage/bmp"
-      "image/svg+xml"
-      "image/svg+xml-compressed"
-      "image/avif"
-      "image/heic"
-    ] (_name: [ "org.gnome.Loupe.desktop" ]);
+    xdg.mimeApps = {
+      enable = true;
+      defaultApplications = lib.genAttrs [
+        "image/jpeg"
+        "image/png"
+        "image/gif"
+        "image/webp"
+        "image/tiff"
+        "mage/bmp"
+        "image/svg+xml"
+        "image/svg+xml-compressed"
+        "image/avif"
+        "image/heic"
+      ] (_name: [ "org.gnome.Loupe.desktop" ]);
+      associations.added = lib.genAttrs [
+        "image/jpeg"
+        "image/png"
+        "image/gif"
+        "image/webp"
+        "image/tiff"
+        "mage/bmp"
+        "image/svg+xml"
+        "image/svg+xml-compressed"
+        "image/avif"
+        "image/heic"
+      ] (_name: [ "org.gnome.Loupe.desktop" ]);
+    };
   };
 
 }
diff --git a/config/home/zaphyra/programs/mcfly.nix b/config/home/zaphyra/programs/mcfly.nix
@@ -1,19 +1,27 @@
 {
   config,
+  lib,
   ...
 }:
 
 {
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "mcfly/.local/share/mcfly"
-  ];
+  options.zaphyra.programs.mcfly.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = true;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.mcfly.enable {
+    programs.mcfly = {
+      enable = true;
+      enableFishIntegration = true;
+      enableZshIntegration = true;
+      fuzzySearchFactor = 2;
+    };
 
-  programs.mcfly = {
-    enable = true;
-    enableFishIntegration = true;
-    enableZshIntegration = true;
-    fuzzySearchFactor = 2;
+    home.persistence."/nix/persist/home/${config.home.username}".directories = [
+      "mcfly/.local/share/mcfly"
+    ];
   };
 
 }
diff --git a/config/home/zaphyra/programs/micro.nix b/config/home/zaphyra/programs/micro.nix
@@ -7,25 +7,31 @@
 }:
 
 {
+  options = {
+    zaphyra.programs.micro.enable = lib.mkOption {
+      type = lib.types.bool;
+      default = true;
+    };
 
-  options.programs.micro.lsp-servers = lib.mkOption {
-    default = { };
-    type = lib.types.attrsOf (
-      lib.types.submodule {
-        options = {
-          command = lib.mkOption {
-            type = lib.types.str;
-          };
-          options = lib.mkOption {
-            inherit ((pkgs.formats.json { })) type;
-            default = { };
+    programs.micro.lsp-servers = lib.mkOption {
+      default = { };
+      type = lib.types.attrsOf (
+        lib.types.submodule {
+          options = {
+            command = lib.mkOption {
+              type = lib.types.str;
+            };
+            options = lib.mkOption {
+              inherit ((pkgs.formats.json { })) type;
+              default = { };
+            };
           };
-        };
-      }
-    );
+        }
+      );
+    };
   };
 
-  config = {
+  config = lib.mkIf config.zaphyra.programs.micro.enable {
     programs = {
       micro = {
         enable = true;
diff --git a/config/home/zaphyra/programs/mpv.nix b/config/home/zaphyra/programs/mpv.nix
@@ -1,13 +1,20 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  programs = {
-    mpv.enable = true;
-    mpv.scripts = [ pkgs.mpvScripts.mpris ];
+  options.zaphyra.programs.mpv.enable = lib.mkEnableOption "mpv";
+
+  config = lib.mkIf config.zaphyra.programs.mpv.enable {
+    programs = {
+      mpv.enable = true;
+      mpv.scripts = [ pkgs.mpvScripts.mpris ];
+    };
   };
 
 }
diff --git a/config/home/zaphyra/programs/nautilus.nix b/config/home/zaphyra/programs/nautilus.nix
@@ -1,5 +1,6 @@
 {
   config,
+  systemConfig,
   lib,
   pkgs,
   ...

@@ -7,62 +8,70 @@
 
 {
 
-  home.packages = with pkgs; [
-    nautilus
-    sushi # quick-preview for nautilus
-  ];
-
-  home.sessionVariables = {
-    NAUTILUS_4_EXTENSION_DIR = "${config.home.profileDirectory}/lib/nautilus/extensions-4";
+  options.zaphyra.programs.nautilus.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
   };
 
-  xdg.mimeApps.enable = true;
-  xdg.mimeApps.defaultApplications = lib.genAttrs [
-    "inode/directory"
-    "application/x-7z-compressed"
-    "application/x-7z-compressed-tar"
-    "application/x-bzip"
-    "application/x-bzip-compressed-tar"
-    "application/x-compress"
-    "application/x-compressed-tar"
-    "application/x-cpio"
-    "application/x-gzip"
-    "application/x-lha"
-    "application/x-lzip"
-    "application/x-lzip-compressed-tar"
-    "application/x-lzma"
-    "application/x-lzma-compressed-tar"
-    "application/x-tar"
-    "application/x-tarz"
-    "application/x-xar"
-    "application/x-xz"
-    "application/x-xz-compressed-tar"
-    "application/zip"
-    "application/gzip"
-    "application/bzip2"
-    "application/x-bzip2-compressed-tar"
-    "application/vnd.rar;application/zstd"
-    "application/x-zstd-compressed-tar"
-  ] (_name: [ "org.gnome.Nautilus.desktop" ]);
-
-  gtk.gtk4.extraCss = ''
-    /* remove 'starred' in nautilus side-panel */
-    .nautilus-window .navigation-sidebar > .sidebar-row:nth-child(2) {
-      min-height:0;
-      font-size: 0;
-      -gtk-icon-size: 0;
-      margin-top: -2px;
-    }
-  '';
+  config = lib.mkIf config.zaphyra.programs.nautilus.enable {
+    home.packages = with pkgs; [
+      nautilus
+      sushi # quick-preview for nautilus
+    ];
 
-  dconf.settings = {
-    "org/gnome/nautilus/list-view" = {
-      use-tree-view = true;
-      default-zoom-level = "small";
+    home.sessionVariables = {
+      NAUTILUS_4_EXTENSION_DIR = "${config.home.profileDirectory}/lib/nautilus/extensions-4";
     };
-    "org/gnome/nautilus/preferences" = {
-      date-time-format = "detailed";
-      default-folder-viewer = "list-view";
+
+    xdg.mimeApps.enable = true;
+    xdg.mimeApps.defaultApplications = lib.genAttrs [
+      "inode/directory"
+      "application/x-7z-compressed"
+      "application/x-7z-compressed-tar"
+      "application/x-bzip"
+      "application/x-bzip-compressed-tar"
+      "application/x-compress"
+      "application/x-compressed-tar"
+      "application/x-cpio"
+      "application/x-gzip"
+      "application/x-lha"
+      "application/x-lzip"
+      "application/x-lzip-compressed-tar"
+      "application/x-lzma"
+      "application/x-lzma-compressed-tar"
+      "application/x-tar"
+      "application/x-tarz"
+      "application/x-xar"
+      "application/x-xz"
+      "application/x-xz-compressed-tar"
+      "application/zip"
+      "application/gzip"
+      "application/bzip2"
+      "application/x-bzip2-compressed-tar"
+      "application/vnd.rar;application/zstd"
+      "application/x-zstd-compressed-tar"
+    ] (_name: [ "org.gnome.Nautilus.desktop" ]);
+
+    gtk.gtk4.extraCss = ''
+      /* remove 'starred' in nautilus side-panel */
+      .nautilus-window .navigation-sidebar > :nth-child(3) {
+        min-height: 0;
+        font-size: 0;
+        -gtk-icon-size: 0;
+        margin-top: -2px;
+      }
+    '';
+
+    dconf.settings = {
+      "org/gnome/nautilus/list-view" = {
+        use-tree-view = true;
+        default-zoom-level = "small";
+      };
+      "org/gnome/nautilus/preferences" = {
+        date-time-format = "detailed";
+        default-folder-viewer = "list-view";
+        show-delete-permanently = true;
+      };
     };
   };
 
diff --git a/config/home/zaphyra/programs/networkManagerDmenu.nix b/config/home/zaphyra/programs/networkManagerDmenu.nix
@@ -1,46 +1,49 @@
 {
-  pkgs,
+  config,
   lib,
+  pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.networkmanager_dmenu ];
-
-  xdg.configFile."networkmanager-dmenu/config.ini".text = lib.generators.toINI { } {
-    dmenu = {
-      dmenu_command = "${lib.getExe pkgs.fuzzel} --anchor=top-right --x-margin=13 --y-margin=13";
-      active_chars = "==";
-      highlight = true;
-      highlight_bold = true;
-      compact = false;
-      pinentry = lib.getExe pkgs.pinentry-gnome3;
-      wifi_icons = "󰤯󰤟󰤢󰤥󰤨";
-      format = "{name:<{max_len_name}s}  {sec:<{max_len_sec}s} {icon:>4}";
-      list_saved = false;
-      prompt = "Networks";
-    };
-
-    dmenu_passphrase = {
-      obscure = false;
-      obscure_color = "#222222";
-    };
-
-    pinentry = {
-      description = "Get network password";
-      prompt = "Password:";
-    };
-
-    editor = {
-      terminal = lib.getExe pkgs.ghostty;
-      gui_if_available = true;
-      gui = "${pkgs.networkmanagerapplet}/bin/nm-connection-editor";
+  options.zaphyra.programs.networkManagerDmenu.enable = lib.mkEnableOption "networkmanager-dmenu";
+
+  config = lib.mkIf config.zaphyra.programs.networkManagerDmenu.enable {
+    home.packages = [ pkgs.networkmanager_dmenu ];
+
+    xdg.configFile."networkmanager-dmenu/config.ini".text = lib.generators.toINI { } {
+      dmenu = {
+        dmenu_command = "${lib.getExe pkgs.fuzzel} --anchor=top-right --x-margin=13 --y-margin=13";
+        active_chars = "==";
+        highlight = true;
+        highlight_bold = true;
+        compact = false;
+        pinentry = lib.getExe pkgs.pinentry-gnome3;
+        wifi_icons = "󰤯󰤟󰤢󰤥󰤨";
+        format = "{name:<{max_len_name}s}  {sec:<{max_len_sec}s} {icon:>4}";
+        list_saved = false;
+        prompt = "Networks";
+      };
+
+      dmenu_passphrase = {
+        obscure = false;
+        obscure_color = "#222222";
+      };
+
+      pinentry = {
+        description = "Get network password";
+        prompt = "Password:";
+      };
+
+      editor = {
+        terminal = lib.getExe pkgs.ghostty;
+        gui_if_available = true;
+        gui = "${pkgs.networkmanagerapplet}/bin/nm-connection-editor";
+      };
+
+      nmdm.rescan_delay = 5;
     };
-
-    nmdm.rescan_delay = 5;
   };
 
-  # programs.sherlock.settings.ignore = "NetworkManager Dmenu";
-
 }
diff --git a/config/home/zaphyra/programs/niri.nix b/config/home/zaphyra/programs/niri.nix
@@ -1,242 +0,0 @@
-{
-  config,
-  lib,
-  ...
-}:
-
-{
-
-  programs.niri.settings = {
-    input = {
-      workspace-auto-back-and-forth = true;
-
-      focus-follows-mouse = {
-        enable = true;
-        max-scroll-amount = "0%";
-      };
-
-      touchpad.click-method = "clickfinger";
-
-      keyboard.xkb = {
-        layout = "us,de,ru";
-        variant = "mac,qwerty,mac";
-        options = "grp:alt_shift_toggle";
-      };
-    };
-
-    outputs."eDP-1".scale = 1;
-
-    cursor.theme = config.gtk.cursorTheme.name;
-
-    gestures.hot-corners.enable = false;
-
-    layout = {
-      always-center-single-column = true;
-      gaps = 15;
-
-      default-column-width = {
-        proportion = 1.0;
-      };
-
-      focus-ring = {
-        width = 2;
-        inactive.color = "rgba(59, 135, 86, .9)";
-        active.color = "rgba(74, 169, 108, .9)";
-      };
-
-      tab-indicator = {
-        gaps-between-tabs = 10;
-        position = "top";
-      };
-    }
-    // (lib.genAttrs [ "preset-column-widths" "preset-window-heights" ] (_name: [
-      { proportion = 1.0; }
-      { proportion = 0.75; }
-      { proportion = 0.5; }
-      { proportion = 1.0 / 3.0; }
-      { proportion = 0.25; }
-    ]));
-
-    environment = {
-      QT_QPA_PLATFORM = "wayland";
-      QT_WAYLAND_FORCE_DPI = "physical";
-      QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
-    };
-
-    prefer-no-csd = true;
-
-    window-rules = [
-      {
-        shadow.enable = true;
-        matches = [
-          {
-            is-floating = true;
-          }
-        ];
-      }
-      {
-        geometry-corner-radius = lib.genAttrs [ "bottom-left" "bottom-right" "top-left" "top-right" ] (
-          _name: 6.0
-        );
-        clip-to-geometry = true;
-      }
-      {
-        matches = [
-          {
-            at-startup = true;
-            app-id = "org.gnome.Fractal";
-          }
-          {
-            at-startup = true;
-            app-id = "im.dino.Dino";
-          }
-          {
-            at-startup = true;
-            app-id = "org.gajim.Gajim";
-          }
-        ];
-
-        default-column-display = "tabbed";
-        open-on-workspace = "4";
-      }
-      {
-        matches = [
-          { app-id = "firefox$"; }
-          { app-id = "thunderbird$"; }
-        ];
-
-        open-maximized = true;
-      }
-      {
-        matches = [
-          { app-id = "org.gnome.NautilusPreviewer$"; }
-        ];
-
-        open-floating = true;
-      }
-      {
-        matches = [
-          { app-id = "thunderbird$"; }
-        ];
-
-        open-on-workspace = "2";
-      }
-      {
-        matches = [
-          {
-            app-id = "firefox$";
-            title = "^Picture-in-Picture$";
-          }
-        ];
-
-        open-floating = true;
-        default-column-width.fixed = 480;
-        default-window-height.fixed = 270;
-        default-floating-position = {
-          x = 32;
-          y = 32;
-          relative-to = "bottom-right";
-        };
-      }
-    ];
-
-    binds =
-      with config.lib.niri.actions;
-      {
-        "Mod+Shift+E".action = quit;
-        "Mod+Space".action = lib.mkDefault (spawn (lib.getExe pkgs.fuzzel));
-        "Mod+Return".action = lib.mkDefault (spawn (lib.getExe pkgs.unstable.app2unit) "-T");
-
-        "Mod+L".action = spawn (lib.getExe' pkgs.systemd "loginctl") "lock-session";
-        "Mod+Z".action = power-off-monitors;
-        # "Mod+Z".action = spawn (lib.getExe' pkgs.systemd "systemctl") "suspend";
-
-        "Mod+W" = {
-          action = close-window;
-          repeat = false;
-        };
-
-        "XF86AudioRaiseVolume" = {
-          allow-when-locked = true;
-          action = lib.mkDefault (spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "1%+");
-        };
-        "XF86AudioLowerVolume" = {
-          allow-when-locked = true;
-          action = lib.mkDefault (spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "1%-");
-        };
-        "XF86MonBrightnessUp" = {
-          allow-when-locked = true;
-          action = lib.mkDefault (spawn (lib.getExe pkgs.brightnessctl) "s" "+5%");
-        };
-        "XF86MonBrightnessDown" = {
-          allow-when-locked = true;
-          action = lib.mkDefault (spawn (lib.getExe pkgs.brightnessctl) "s" "5%-");
-        };
-
-        "Mod+Tab".action = toggle-overview;
-
-        "Mod+Prior".action = focus-workspace-up;
-        "Mod+Next".action = focus-workspace-down;
-
-        "Mod+Shift+Prior".action = move-window-up-or-to-workspace-up;
-        "Mod+Shift+Next".action = move-window-down-or-to-workspace-down;
-
-        "Mod+Ctrl+Prior".action = focus-monitor-up;
-        "Mod+Ctrl+Next".action = focus-monitor-down;
-
-        "Mod+Left".action = focus-column-left;
-        "Mod+Right".action = focus-column-right;
-        "Mod+Up".action = focus-window-or-workspace-up;
-        "Mod+Down".action = focus-window-or-workspace-down;
-
-        "Mod+Shift+Left".action = move-column-left;
-        "Mod+Shift+Right".action = move-column-right;
-        "Mod+Shift+Up".action = move-window-up;
-        "Mod+Shift+Down".action = move-window-down;
-
-        "Mod+R".action = switch-preset-column-width;
-        "Mod+Shift+R".action = switch-preset-window-height;
-        "Mod+Ctrl+R".action = reset-window-height;
-
-        "Mod+C".action = center-window;
-
-        "Mod+F".action = maximize-column;
-        "Mod+Ctrl+F".action = expand-column-to-available-width;
-        "Mod+Shift+F".action = fullscreen-window;
-        "Mod+Alt+F".action = set-column-width "50%";
-
-        "Mod+Minus".action = set-column-width "-10%";
-        "Mod+Equal".action = set-column-width "+10%";
-        "Mod+Shift+Minus".action = set-window-height "-10%";
-        "Mod+Shift+Equal".action = set-window-height "+10%";
-
-        "Mod+Shift+Space".action = toggle-window-floating;
-
-        "Mod+Shift+Return".action = spawn (lib.getExe pkgs.tgc.nirius) "toggle-follow-mode";
-
-        "Mod+T".action = toggle-column-tabbed-display;
-
-        "Mod+Print".action = spawn (lib.getExe pkgs.hyprpicker) "--lowercase-hex" "--autocopy";
-        "Print".action = screenshot;
-        "Alt+Print".action = screenshot-window;
-      }
-      // (lib.mergeAttrsList (
-        lib.map
-          (num: {
-            "Mod+${toString num}".action.focus-workspace = num;
-            "Mod+Shift+${toString num}".action.move-column-to-workspace = num;
-          })
-          [
-            1
-            2
-            3
-            4
-            5
-            6
-            7
-            8
-            9
-          ]
-      ));
-  };
-}
diff --git a/config/home/zaphyra/programs/niri/binds.nix b/config/home/zaphyra/programs/niri/binds.nix
@@ -0,0 +1,184 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+
+  config = lib.mkIf config.zaphyra.programs.niri.enable {
+    programs.niri.settings = {
+      binds =
+        (lib.mergeAttrsList (
+          lib.map
+            (num: {
+              "Mod+${toString num}" = lib.mkDefault { action.focus-workspace = num; };
+              "Mod+Shift+${toString num}" = lib.mkDefault { action.move-column-to-workspace = num; };
+            })
+            [
+              1
+              2
+              3
+              4
+              5
+              6
+              7
+              8
+              9
+            ]
+        ))
+        // (lib.mapAttrs
+          (
+            _: attrs:
+            (lib.mkDefault (
+              attrs
+              // {
+                action =
+                  if (lib.isList attrs.action) then
+                    {
+                      "spawn" = attrs.action;
+                    }
+                  else if (lib.isAttrs attrs.action) then
+                    attrs.action
+                  else
+                    {
+                      "${attrs.action}" = [ ];
+                    };
+              }
+            ))
+          )
+          {
+            "Mod+1".action.focus-workspace = "browser";
+            "Mod+Shift+1".action.move-column-to-workspace = "browser";
+            "Mod+2".action.focus-workspace = "mail";
+            "Mod+Shift+2".action.move-column-to-workspace = "mail";
+            "Mod+3".action.focus-workspace = "terminal";
+            "Mod+Shift+3".action.move-column-to-workspace = "terminal";
+            "Mod+4".action.focus-workspace = "chat";
+            "Mod+Shift+4".action.move-column-to-workspace = "chat";
+
+            "Mod+Shift+E".action = "quit";
+            "Mod+Z".action = "power-off-monitors";
+            # "Mod+Z".action = spawn (lib.getExe' pkgs.systemd "systemctl") "suspend";
+
+            "Mod+Space".action = [ (lib.getExe pkgs.fuzzel) ];
+            "Mod+Return".action = [
+              (lib.getExe pkgs.unstable.app2unit)
+              "-T"
+            ];
+            "Mod+L".action = [
+              (lib.getExe' pkgs.systemd "loginctl")
+              "lock-session"
+            ];
+
+            "Mod+W" = {
+              action = "close-window";
+              repeat = false;
+            };
+
+            "XF86AudioMute" = {
+              allow-when-locked = true;
+              action = [
+                "wpctl"
+                "set-mute"
+                "@DEFAULT_AUDIO_SINK@"
+                "toggle"
+              ];
+            };
+            "XF86AudioRaiseVolume" = {
+              allow-when-locked = true;
+              action = [
+                "wpctl"
+                "set-volume"
+                "@DEFAULT_AUDIO_SINK@"
+                ".5%+"
+              ];
+            };
+            "XF86AudioLowerVolume" = {
+              allow-when-locked = true;
+              action = [
+                "wpctl"
+                "set-volume"
+                "@DEFAULT_AUDIO_SINK@"
+                ".5%-"
+              ];
+            };
+
+            "XF86MonBrightnessUp" = {
+              allow-when-locked = true;
+              action = [
+                (lib.getExe pkgs.brightnessctl)
+                "s"
+                "+2%"
+              ];
+            };
+            "XF86MonBrightnessDown" = {
+              allow-when-locked = true;
+              action = [
+                (lib.getExe pkgs.brightnessctl)
+                "s"
+                "2%-"
+              ];
+            };
+
+            "Mod+Tab".action = "toggle-overview";
+
+            "Mod+Prior".action = "focus-workspace-up";
+            "Mod+Next".action = "focus-workspace-down";
+
+            "Mod+Shift+Prior".action = "move-window-up-or-to-workspace-up";
+            "Mod+Shift+Next".action = "move-window-down-or-to-workspace-down";
+
+            "Mod+Ctrl+Left".action = "focus-monitor-left";
+            "Mod+Ctrl+Right".action = "focus-monitor-right";
+
+            "Mod+Left".action = "focus-column-left";
+            "Mod+Right".action = "focus-column-right";
+            "Mod+Up".action = "focus-window-or-workspace-up";
+            "Mod+Down".action = "focus-window-or-workspace-down";
+
+            "Mod+Shift+Left".action = "move-column-left";
+            "Mod+Shift+Right".action = "move-column-right";
+            "Mod+Shift+Up".action = "move-window-up";
+            "Mod+Shift+Down".action = "move-window-down";
+
+            "Mod+R".action = "switch-preset-column-width";
+            "Mod+Shift+R".action = "switch-preset-window-height";
+            "Mod+Ctrl+R".action = "reset-window-height";
+
+            "Mod+C".action = "center-window";
+
+            "Mod+F".action = "maximize-column";
+            "Mod+Ctrl+F".action = "expand-column-to-available-width";
+            "Mod+Shift+F".action = "fullscreen-window";
+            "Mod+Alt+F".action.set-column-width = "50%";
+
+            "Mod+Minus".action.set-column-width = "-10%";
+            "Mod+Equal".action.set-column-width = "+10%";
+            "Mod+Shift+Minus".action.set-window-height = "-10%";
+            "Mod+Shift+Equal".action.set-window-height = "+10%";
+
+            "Mod+Shift+Space".action = "toggle-window-floating";
+
+            "Mod+Shift+Return".action = [
+              (lib.getExe pkgs.tgc.nirius)
+              "toggle-follow-mode"
+            ];
+
+            "Mod+T".action = "toggle-column-tabbed-display";
+
+            "Mod+Print".action = [
+              (lib.getExe pkgs.hyprpicker)
+              "--lowercase-hex"
+              "--autocopy"
+            ];
+
+            "Print".action = "screenshot";
+            "Alt+Print".action = "screenshot-window";
+          }
+        );
+    };
+  };
+
+}
diff --git a/config/home/zaphyra/programs/niri/default.nix b/config/home/zaphyra/programs/niri/default.nix
@@ -0,0 +1,74 @@
+{
+  config,
+  systemConfig,
+  lib,
+  ...
+}:
+
+{
+
+  options.zaphyra.programs.niri.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  imports = [
+    ./binds.nix
+    ./io.nix
+    ./rules.nix
+  ];
+
+  config = lib.mkIf config.zaphyra.programs.niri.enable {
+    programs.niri.settings = {
+      environment = {
+        QT_QPA_PLATFORM = "wayland";
+        QT_WAYLAND_FORCE_DPI = "physical";
+        QT_WAYLAND_DISABLE_WINDOWDECORATION = "1";
+      };
+
+      cursor.theme = config.gtk.cursorTheme.name;
+
+      prefer-no-csd = true;
+
+      workspaces = {
+        "001-browser".name = "browser";
+        "003-mail".name = "mail";
+        "003-terminal".name = "terminal";
+        "004-chat".name = "chat";
+      };
+
+      overview = {
+        workspace-shadow.enable = false;
+      };
+
+      layout = {
+        always-center-single-column = true;
+        gaps = 15;
+        background-color = "transparent";
+
+        default-column-width = {
+          proportion = 1.0;
+        };
+
+        focus-ring = {
+          width = 2;
+          inactive.color = "rgba(59, 135, 86, .9)";
+          active.color = "rgba(74, 169, 108, .9)";
+        };
+
+        tab-indicator = {
+          gaps-between-tabs = 10;
+          position = "top";
+        };
+      }
+      // (lib.genAttrs [ "preset-column-widths" "preset-window-heights" ] (_name: [
+        { proportion = 1.0; }
+        { proportion = 0.75; }
+        { proportion = 0.5; }
+        { proportion = 1.0 / 3.0; }
+        { proportion = 0.25; }
+      ]));
+    };
+  };
+
+}
diff --git a/config/home/zaphyra/programs/niri/io.nix b/config/home/zaphyra/programs/niri/io.nix
@@ -0,0 +1,36 @@
+{
+  config,
+  lib,
+  ...
+}:
+
+{
+
+  config = lib.mkIf config.zaphyra.programs.niri.enable {
+    programs.niri.settings = {
+      gestures.hot-corners.enable = false;
+
+      input = {
+        workspace-auto-back-and-forth = true;
+
+        focus-follows-mouse = {
+          enable = true;
+          max-scroll-amount = "0%";
+        };
+
+        touchpad.click-method = "clickfinger";
+
+        keyboard.xkb = {
+          layout = "us,de,ru";
+          variant = "mac,qwerty,mac";
+          options = "grp:alt_shift_toggle";
+        };
+      };
+
+      outputs = {
+        "eDP-1".scale = 1;
+      };
+    };
+  };
+
+}
diff --git a/config/home/zaphyra/programs/niri/rules.nix b/config/home/zaphyra/programs/niri/rules.nix
@@ -0,0 +1,96 @@
+{
+  config,
+  lib,
+  ...
+}:
+{
+
+  config = lib.mkIf config.zaphyra.programs.niri.enable {
+    programs.niri.settings = {
+      layer-rules = [
+        {
+          matches = [
+            { namespace = "shaderbg"; }
+          ];
+          place-within-backdrop = true;
+        }
+      ];
+
+      window-rules = [
+        {
+          shadow.enable = true;
+          matches = [
+            {
+              is-floating = true;
+            }
+          ];
+        }
+        {
+          geometry-corner-radius = lib.genAttrs [ "bottom-left" "bottom-right" "top-left" "top-right" ] (
+            _name: 6.0
+          );
+          clip-to-geometry = true;
+        }
+        {
+          matches = [
+            {
+              at-startup = true;
+              app-id = "^org.gnome.Fractal$";
+            }
+            {
+              at-startup = true;
+              app-id = "^im.dino.Dino$";
+            }
+            {
+              at-startup = true;
+              app-id = "^org.gajim.Gajim$";
+            }
+          ];
+
+          default-column-display = "tabbed";
+          open-on-workspace = "chat";
+        }
+        {
+          matches = [
+            { app-id = "firefox$"; }
+            { app-id = "thunderbird$"; }
+          ];
+
+          open-maximized = true;
+        }
+        {
+          matches = [
+            { app-id = "^org.gnome.NautilusPreviewer$"; }
+          ];
+
+          open-floating = true;
+        }
+        {
+          matches = [
+            { app-id = "^thunderbird$"; }
+          ];
+
+          open-on-workspace = "mail";
+        }
+        {
+          matches = [
+            {
+              app-id = "firefox$";
+              title = "^Picture-in-Picture$";
+            }
+          ];
+
+          open-floating = true;
+          default-column-width.fixed = 480;
+          default-window-height.fixed = 270;
+          default-floating-position = {
+            x = 32;
+            y = 32;
+            relative-to = "bottom-right";
+          };
+        }
+      ];
+    };
+  };
+
+}
diff --git a/config/home/zaphyra/programs/nmgui.nix b/config/home/zaphyra/programs/nmgui.nix
@@ -1,245 +1,251 @@
 {
+  config,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [
-    (pkgs.writeShellScriptBin "nmgui" ''
-      windowID=`niri msg --json windows | jq -re '[.[] | select(.app_id == "com.network.manager") | .id][0]'`
-
-      if [ $windowID != "null" ]
-      then
-        exec niri msg action close-window --id=$windowID
-      else
-        app2unit -- ${
-          lib.getExe (
-            pkgs.unstable.nmgui.overrideAttrs {
-              src = pkgs.fetchFromGitHub {
-                owner = "s-adi-dev";
-                repo = "nmgui";
-                rev = "08b2380e5b230a2215a6430878e2aa13c3d86d44";
-                hash = "sha256-qRFJbzam48GTbQnLrZINE0vAvAJfVN4bJey8MZwCsm4=";
-              };
-            }
-          )
-        }
-      fi
-    '')
-  ];
-
-  xdg.configFile."nmgui/style.css".text = ''
-     * {
-       font-family: "Adwaita Sans", "Symbols Nerd Font";
-       outline-color: @accent-color;
-       color: white;
-     }
-
-     window {
-       border: 2px solid @accent-border-color;
-       background: @background-color;
-     }
-
-     window {
-       border-top: unset;
-       border-bottom-left-radius: 10px;
-       border-bottom-right-radius: 10px;
-     }
-
-    #wifi-scan-label,
-     button,
-     entry {
-       border-radius: 4px;
-     }
-
-     separator {
-       min-height: 2px;
-       margin: 0 -20px;
-       background: @border-color;
-     }
-
-     entry {
-       min-height: 32px;
-       padding-left: 9px;
-       padding-right: 8px;
-       border: 1px solid;
-       border-spacing: 6px;
-     }
-
-     entry:hover {
-       outline: none;
-       background: @button-hover-color;
-       border: 1px solid @border-color;
-     }
-
-     text selection {
-       color: white;
-       background: @accent-color;
-     }
-
-     button {
-       min-height: 24px;
-       min-width: 16px;
-       padding: 4px 9px;
-       background: @button-color;
-       border: 1px solid @border-color;
-       color: white;
-     }
-
-     button.image-button {
-       padding: 8px 12px 8px 8px;
-       border: unset;
-       background: unset;
-     }
-
-     button:hover {
-      background: @button-hover-color;
-     }
-
-     button:disabled {
-       border-left: 4px solid @accent-color;
-       border-top: unset;
-       border-bottom: unset;
-       padding: unset;
-     }
-
-     button:disabled box {
-       margin: -2px;
-       margin-right: 0;
-       background: @button-hover-color;
-       padding: 4px 10px 4px 8px;
-       border: 1px solid @border-color;
-       border-right: unset;
-     }
-
-     switch {
-       border-radius: 4px;
-       border: 1px solid @border-color;
-       background: @button-color;
-     }
-
-     switch:checked {
-       background: alpha(@accent-color, .5);
-     }
-
-     switch slider {
-       border-radius: 4px;
-       border: 1px solid @border-color;
-       background: rgb(190, 190, 190);
-       margin: 3px;
-       min-height: 15px;
-       min-width: 15px;
-     }
-
-     switch:hover slider,
-     switch slider:hover {
-       border 1px solid @border-color;
-       background: rgb(170, 170, 170);
-     }
-
-     #wifi-label {
-       font-size: 15pt;
-       font-weight: 400;
-     }
-
-     #wifi-networks-label {
-       font-size: 12pt;
-       font-weight: 300;
-     }
-
-     #wifi-scan-label {
-       padding: 5px 8px;
-       background: @button-color;
-       border: 1px solid @border-color;
-       color: white;
-     }
-
-     #wifi-scan-label:hover {
-       background: @button-hover-color;
-       color: white;
-     }
-
-     #network-list-box #network-button {
-       margin-right: -5px;
-       border-right: 0;
-       border-top-right-radius: unset;
-       border-bottom-right-radius: unset;
-     }
-
-     #network-list-box .more-details-button {
-       border-top-left-radius: unset;
-       border-bottom-left-radius: unset;
-       margin-left: unset;
-     }
-
-     /* Details page */
-     window > box .image-button {
-       margin-left:-10px;
-     }
-
-     window > box > box > box > box:last-child {
-       margin: 0 -20px -20px;
-     }
-
-     window > box > box > box > box:last-child > button:first-child {
-       margin-right: 15px;
-     }
-
-     /* dialogs */
-     .titlebar {
-       background: transparent;
-     }
-
-     .dialog-vbox button {
-       margin: 10px;
-     }
-
-     .dialog-vbox button:first-child {
-       margin-right: 5px;
-     }
-
-     .dialog-vbox button:last-child {
-       margin-left: 5px;
-     }
-
-     .dialog-vbox box > label:last-child {
-       margin: 0 10px 20px;
-     }
-
-     .password {
-       background: @button-color;
-       border: 1px solid @border-color;
-       color: white;
-     }
-  '';
-
-  programs.niri.settings.window-rules = [
-    {
-      matches = [ { app-id = "com.network.manager$"; } ];
-
-      focus-ring.enable = false;
-
-      open-focused = true;
-      open-floating = true;
-      default-floating-position = {
-        x = 40;
-        y = 0;
-        relative-to = "top-right";
-      };
-
-      geometry-corner-radius = {
-        "bottom-left" = 9.0;
-        "bottom-right" = 9.0;
-        "top-left" = 0.0;
-        "top-right" = 0.0;
-      };
-
-      min-width = 400;
-      max-width = 400;
-      min-height = 500;
-      max-height = 500;
-    }
-  ];
+  options.zaphyra.programs.nmgui.enable = lib.mkEnableOption "Enable nmgui NetworkManager-GUI";
+
+  config = lib.mkIf config.zaphyra.programs.nmgui.enable {
+    home.packages = [
+      (pkgs.writeShellScriptBin "nmgui" ''
+        windowID=`niri msg --json windows | jq -re '[.[] | select(.app_id == "com.network.manager") | .id][0]'`
+
+        if [ $windowID != "null" ]
+        then
+          exec niri msg action close-window --id=$windowID
+        else
+          app2unit -- ${
+            lib.getExe (
+              pkgs.unstable.nmgui.overrideAttrs {
+                src = pkgs.fetchFromGitHub {
+                  owner = "s-adi-dev";
+                  repo = "nmgui";
+                  rev = "08b2380e5b230a2215a6430878e2aa13c3d86d44";
+                  hash = "sha256-qRFJbzam48GTbQnLrZINE0vAvAJfVN4bJey8MZwCsm4=";
+                };
+              }
+            )
+          }
+        fi
+      '')
+    ];
+
+    xdg.configFile."nmgui/style.css".text = ''
+       * {
+         font-family: "Adwaita Sans", "Symbols Nerd Font";
+         outline-color: @accent-color;
+         color: white;
+       }
+
+       window {
+         border: 2px solid @accent-border-color;
+         background: @background-color;
+       }
+
+       window {
+         border-top: unset;
+         border-bottom-left-radius: 10px;
+         border-bottom-right-radius: 10px;
+       }
+
+      #wifi-scan-label,
+       button,
+       entry {
+         border-radius: 4px;
+       }
+
+       separator {
+         min-height: 2px;
+         margin: 0 -20px;
+         background: @border-color;
+       }
+
+       entry {
+         min-height: 32px;
+         padding-left: 9px;
+         padding-right: 8px;
+         border: 1px solid;
+         border-spacing: 6px;
+       }
+
+       entry:hover {
+         outline: none;
+         background: @button-hover-color;
+         border: 1px solid @border-color;
+       }
+
+       text selection {
+         color: white;
+         background: @accent-color;
+       }
+
+       button {
+         min-height: 24px;
+         min-width: 16px;
+         padding: 4px 9px;
+         background: @button-color;
+         border: 1px solid @border-color;
+         color: white;
+       }
+
+       button.image-button {
+         padding: 8px 12px 8px 8px;
+         border: unset;
+         background: unset;
+       }
+
+       button:hover {
+        background: @button-hover-color;
+       }
+
+       button:disabled {
+         border-left: 4px solid @accent-color;
+         border-top: unset;
+         border-bottom: unset;
+         padding: unset;
+       }
+
+       button:disabled box {
+         margin: -2px;
+         margin-right: 0;
+         background: @button-hover-color;
+         padding: 4px 10px 4px 8px;
+         border: 1px solid @border-color;
+         border-right: unset;
+       }
+
+       switch {
+         border-radius: 4px;
+         border: 1px solid @border-color;
+         background: @button-color;
+       }
+
+       switch:checked {
+         background: alpha(@accent-color, .5);
+       }
+
+       switch slider {
+         border-radius: 4px;
+         border: 1px solid @border-color;
+         background: rgb(190, 190, 190);
+         margin: 3px;
+         min-height: 15px;
+         min-width: 15px;
+       }
+
+       switch:hover slider,
+       switch slider:hover {
+         border 1px solid @border-color;
+         background: rgb(170, 170, 170);
+       }
+
+       #wifi-label {
+         font-size: 15pt;
+         font-weight: 400;
+       }
+
+       #wifi-networks-label {
+         font-size: 12pt;
+         font-weight: 300;
+       }
+
+       #wifi-scan-label {
+         padding: 5px 8px;
+         background: @button-color;
+         border: 1px solid @border-color;
+         color: white;
+       }
+
+       #wifi-scan-label:hover {
+         background: @button-hover-color;
+         color: white;
+       }
+
+       #network-list-box #network-button {
+         margin-right: -5px;
+         border-right: 0;
+         border-top-right-radius: unset;
+         border-bottom-right-radius: unset;
+       }
+
+       #network-list-box .more-details-button {
+         border-top-left-radius: unset;
+         border-bottom-left-radius: unset;
+         margin-left: unset;
+       }
+
+       /* Details page */
+       window > box .image-button {
+         margin-left:-10px;
+       }
+
+       window > box > box > box > box:last-child {
+         margin: 0 -20px -20px;
+       }
+
+       window > box > box > box > box:last-child > button:first-child {
+         margin-right: 15px;
+       }
+
+       /* dialogs */
+       .titlebar {
+         background: transparent;
+       }
+
+       .dialog-vbox button {
+         margin: 10px;
+       }
+
+       .dialog-vbox button:first-child {
+         margin-right: 5px;
+       }
+
+       .dialog-vbox button:last-child {
+         margin-left: 5px;
+       }
+
+       .dialog-vbox box > label:last-child {
+         margin: 0 10px 20px;
+       }
+
+       .password {
+         background: @button-color;
+         border: 1px solid @border-color;
+         color: white;
+       }
+    '';
+
+    programs.niri.settings.window-rules = [
+      {
+        matches = [ { app-id = "com.network.manager$"; } ];
+
+        focus-ring.enable = false;
+
+        open-focused = true;
+        open-floating = true;
+        default-floating-position = {
+          x = 40;
+          y = 0;
+          relative-to = "top-right";
+        };
+
+        geometry-corner-radius = {
+          "bottom-left" = 9.0;
+          "bottom-right" = 9.0;
+          "top-left" = 0.0;
+          "top-right" = 0.0;
+        };
+
+        min-width = 400;
+        max-width = 400;
+        min-height = 500;
+        max-height = 500;
+      }
+    ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/ocrmypdf.nix b/config/home/zaphyra/programs/ocrmypdf.nix
@@ -1,10 +1,20 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.ocrmypdf ];
+  options.zaphyra.programs.ocrmypdf.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.ocrmypdf.enable {
+    home.packages = [ pkgs.ocrmypdf ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/overskride.nix b/config/home/zaphyra/programs/overskride.nix
@@ -1,10 +1,17 @@
 {
+  config,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.overskride ];
+  options.zaphyra.programs.overskride.enable =
+    lib.mkEnableOption "Enable overskride bluetooth manager";
+
+  config = lib.mkIf config.zaphyra.programs.overskride.enable {
+    home.packages = [ pkgs.overskride ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/papers.nix b/config/home/zaphyra/programs/papers.nix
@@ -1,19 +1,29 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.papers ];
+  options.zaphyra.programs.papers.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  xdg.mimeApps = {
-    enable = true;
-    defaultApplications = {
-      "application/pdf" = [ "org.gnome.Papers.desktop" ];
-    };
-    associations.added = {
-      "application/pdf" = [ "org.gnome.Papers.desktop" ];
+  config = lib.mkIf config.zaphyra.programs.papers.enable {
+    home.packages = [ pkgs.papers ];
+
+    xdg.mimeApps = {
+      enable = true;
+      defaultApplications = {
+        "application/pdf" = [ "org.gnome.Papers.desktop" ];
+      };
+      associations.added = {
+        "application/pdf" = [ "org.gnome.Papers.desktop" ];
+      };
     };
   };
 
diff --git a/config/home/zaphyra/programs/password-store.nix b/config/home/zaphyra/programs/password-store.nix
@@ -1,25 +1,31 @@
 {
+  config,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.pwgen ];
+  options.zaphyra.programs.password-store.enable = lib.mkEnableOption "Enable password-store";
 
-  programs = {
-    password-store = {
-      enable = true;
-      package = pkgs.pass.withExtensions (exts: [
-        exts.pass-otp
-        exts.pass-update
-        exts.pass-genphrase
-      ]);
-    };
+  config = lib.mkIf config.zaphyra.programs.password-store.enable {
+    home.packages = [ pkgs.pwgen ];
+
+    programs = {
+      password-store = {
+        enable = true;
+        package = pkgs.pass.withExtensions (exts: [
+          exts.pass-otp
+          exts.pass-update
+          exts.pass-genphrase
+        ]);
+      };
 
-    browserpass = {
-      enable = true;
-      browsers = [ "firefox" ];
+      browserpass = {
+        enable = true;
+        browsers = [ "firefox" ];
+      };
     };
   };
 
diff --git a/config/home/zaphyra/programs/pdfarranger.nix b/config/home/zaphyra/programs/pdfarranger.nix
@@ -1,16 +1,26 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.pdfarranger ];
+  options.zaphyra.programs.pdfarranger.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.pdfarranger.enable {
+    home.packages = [ pkgs.pdfarranger ];
 
-  xdg.mimeApps = {
-    enable = true;
-    associations.added = {
-      "application/pdf" = [ "com.github.jeromerobert.pdfarranger.desktop" ];
+    xdg.mimeApps = {
+      enable = true;
+      associations.added = {
+        "application/pdf" = [ "com.github.jeromerobert.pdfarranger.desktop" ];
+      };
     };
   };
 
diff --git a/config/home/zaphyra/programs/pipewire.nix b/config/home/zaphyra/programs/pipewire.nix
@@ -1,62 +1,70 @@
 {
   config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = with pkgs; [
-    pwvucontrol
-    sonusmix
-  ];
+  options.zaphyra.programs.pipewire.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  xdg.configFile."pipewire/pipewire.conf.d/10-chloe-raop.conf".text =
-    let
-      raopSink = ipAddr: name: {
-        name = "libpipewire-module-raop-sink";
-        args = {
-          "raop.ip" = ipAddr;
-          "raop.port" = 7000;
-          "raop.name" = name;
-          "raop.encryption.type" = "auth_setup";
-        };
-      };
+  config = lib.mkIf config.zaphyra.programs.pipewire.enable {
+    home.packages = with pkgs; [
+      pwvucontrol
+    ];
 
-    in
-    builtins.toJSON {
-      "context.modules" = [
-        { name = "libpipewire-module-zeroconf-discover"; }
-        {
-          name = "libpipewire-module-raop-discover";
-          args."roap.discover-local" = true;
-        }
-        (raopSink "192.168.2.63" "Living Room")
-        (raopSink "192.168.2.57" "Bed Room")
-        (raopSink "192.168.2.54" "Datacenter")
-        (raopSink "192.168.2.80" "Kitchen")
-        {
-          name = "libpipewire-module-combine-stream";
+    xdg.configFile."pipewire/pipewire.conf.d/10-chloe-raop.conf".text =
+      let
+        raopSink = ipAddr: name: {
+          name = "libpipewire-module-raop-sink";
           args = {
-            "node.name" = "raop_multi_room";
-            "node.description" = "Multi-Room";
-            "combine.mode" = "sink";
-            "combine.latency-compensate" = false;
-            "combine.on-demand-streams" = true;
-            "stream.rules" = [
-              {
-                actions."create-stream" = { };
-                matches = [
-                  {
-                    "media.class" = "Audio/Sink";
-                    "node.name" = "~raop_sink.*";
-                  }
-                ];
-              }
-            ];
+            "raop.ip" = ipAddr;
+            "raop.port" = 7000;
+            "raop.name" = name;
+            "raop.encryption.type" = "auth_setup";
           };
-        }
-      ];
-    };
+        };
+
+      in
+      builtins.toJSON {
+        "context.modules" = [
+          { name = "libpipewire-module-zeroconf-discover"; }
+          {
+            name = "libpipewire-module-raop-discover";
+            args."roap.discover-local" = true;
+          }
+          (raopSink "192.168.2.63" "Living Room")
+          (raopSink "192.168.2.57" "Bed Room")
+          (raopSink "192.168.2.54" "Datacenter")
+          (raopSink "192.168.2.80" "Kitchen")
+          {
+            name = "libpipewire-module-combine-stream";
+            args = {
+              "node.name" = "raop_multi_room";
+              "node.description" = "Multi-Room";
+              "combine.mode" = "sink";
+              "combine.latency-compensate" = false;
+              "combine.on-demand-streams" = true;
+              "stream.rules" = [
+                {
+                  actions."create-stream" = { };
+                  matches = [
+                    {
+                      "media.class" = "Audio/Sink";
+                      "node.name" = "~raop_sink.*";
+                    }
+                  ];
+                }
+              ];
+            };
+          }
+        ];
+      };
+  };
 
 }
diff --git a/config/home/zaphyra/programs/plattenalbum.nix b/config/home/zaphyra/programs/plattenalbum.nix
@@ -1,10 +1,19 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.plattenalbum ];
+  options.zaphyra.programs.plattenalbum.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
+  config = lib.mkIf config.zaphyra.programs.plattenalbum.enable {
+    home.packages = [ pkgs.plattenalbum ];
+  };
 }
diff --git a/config/home/zaphyra/programs/profanity.nix b/config/home/zaphyra/programs/profanity.nix
@@ -1,16 +1,25 @@
 {
   config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "profanity/.config/profanity/"
-    "profanity/.local/share/profanity/"
-  ];
+  options.zaphyra.programs.profanity.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  home.packages = [ pkgs.profanity ];
+  config = lib.mkIf config.zaphyra.programs.profanity.enable {
+    home.packages = [ pkgs.profanity ];
+
+    home.persistence."/nix/persist/home/${config.home.username}".directories = [
+      "profanity/.config/profanity/"
+      "profanity/.local/share/profanity/"
+    ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/shellUtilities.nix b/config/home/zaphyra/programs/shellUtilities.nix
@@ -1,78 +1,64 @@
 {
   config,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  programs.jq.enable = true;
-
-  home.shellAliases = {
-    ".." = "cd ..";
-    "..." = "cd ../..";
-
-    rm = "trash-put";
-
-    diff = "diff --color";
-    ip = "ip --color=auto";
-
-    killall = "pkill";
-
-    grep = "rg";
-    find = "fd";
+  options.zaphyra.programs.shellUtilities.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = true;
+  };
 
-    zzz = "sleep 1 && systemctl suspend";
+  config = lib.mkIf config.zaphyra.programs.shellUtilities.enable {
+    programs.jq.enable = true;
 
-    wget = "wget --hsts-file=\"${config.xdg.dataHome}/wget-hsts\"";
-  };
+    home.shellAliases = {
+      ".." = "cd ..";
+      "..." = "cd ../..";
 
-  home.packages = with pkgs; [
-    coreutils
-    trash-cli
+      rm = "trash-put";
 
-    pwgen
+      diff = "diff --color";
+      ip = "ip --color=auto";
 
-    (pkgs.writeShellScriptBin "use" ''
-      declare -a all
-      for p in "$@"; do
-        all+=("''${NIXPKGS_PATH}#$p")
-      done
-      eval nix shell ''${all[@]}
-    '')
+      killall = "pkill";
 
-    wget
-    curl
-    rsync
+      grep = "rg";
+      find = "fd";
 
-    ripgrep
-    fd
+      zzz = "sleep 1 && systemctl suspend";
 
-    fx
-    file
-    bc
+      wget = "wget --hsts-file=\"${config.xdg.dataHome}/wget-hsts\"";
+    };
 
-    unzip
+    home.packages = with pkgs; [
+      coreutils
+      trash-cli
 
-    smartmontools
+      pwgen
 
-    gptfdisk
-    e2fsprogs
-    dosfstools
+      (pkgs.writeShellScriptBin "use" ''
+        declare -a all
+        for p in "$@"; do
+          all+=("''${NIXPKGS_PATH}#$p")
+        done
+        eval nix shell ''${all[@]}
+      '')
 
-    (pkgs.writeShellScriptBin "open" (
-      lib.concatStringsSep " " [
-        (lib.getExe' pkgs.coreutils "nohup")
-        (lib.getExe' pkgs.xdg-utils "xdg-open")
-        "$@"
-        "> /dev/null 2>&1"
-      ]
-    ))
+      wget
+      curl
+      rsync
 
-    usbutils
-    pciutils
+      ripgrep
+      fd
 
-    lm_sensors
-  ];
+      fx
+      file
+      bc
+    ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/sherlock-launcher.nix b/config/home/zaphyra/programs/sherlock-launcher.nix
@@ -1,89 +0,0 @@
-{
-  config,
-  pkgs,
-  lib,
-  ...
-}:
-
-{
-
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "sherlock/.cache/sherlock"
-  ];
-
-  programs.niri.settings.binds = with config.lib.niri.actions; {
-    "Mod+Space".action = spawn (lib.getExe pkgs.sherlock-launcher);
-  };
-
-  programs.sherlock = {
-    enable = true;
-    settings = {
-      style = ''
-        window {
-          border-radius: 5px;
-          border: 2px solid rgba(255, 255, 255, 0.08);
-        }
-      '';
-      ignore = ''
-        btop++
-      '';
-      config = {
-        default_apps = {
-          terminal = "${config.home.sessionVariables.TERMINAL} -e";
-          browser = "${config.home.sessionVariables.BROWSER} %u";
-        };
-        behavior.global_prefix = "app2unit";
-        caching.enable = true;
-      };
-      launchers = [
-        {
-          name = "Weather";
-          type = "weather";
-          args.location = "darmstadt";
-          args.update_interval = 30;
-          home = "OnlyHome";
-          priority = 1;
-          async = true;
-          shortcut = false;
-          spawn_focus = false;
-          actions = [
-            {
-              name = "Show on wttr.in";
-              exec = "https://www.wttr.in/darmstadt";
-              icon = "emblem-symbolic-link";
-              method = "web_launcher";
-            }
-          ];
-        }
-        {
-          name = "App Launcher";
-          type = "app_launcher";
-          alias = "app";
-          priority = 3;
-          home = "OnlyHome";
-        }
-        {
-          name = "Emoji Picker";
-          type = "emoji_picker";
-          alias = "emoji";
-          priority = 4;
-          home = "OnlyHome";
-        }
-      ];
-    };
-  };
-
-  # systemd.user.services.sherlock = {
-  #   Unit = {
-  #     Description = "sherlock daemon";
-  #     After = [ "graphical-session.target" ];
-  #   };
-  #   Service = {
-  #     ExecStart = "${lib.getExe pkgs.sherlock-launcher} --daemonize";
-  #     Restart = "on-failure";
-  #     RestartSec = 5;
-  #   };
-  #   Install.WantedBy = [ "graphical-session.target" ];
-  # };
-
-}
diff --git a/config/home/zaphyra/programs/ssh.nix b/config/home/zaphyra/programs/ssh.nix
@@ -1,30 +1,41 @@
 {
   config,
+  systemConfig,
+  lib,
   ...
 }:
 
 {
 
-  home.file.".ssh/known_hosts".force = true;
-  home.persistence."/nix/persist/home/${config.home.username}".files = [
-    "ssh/.ssh/known_hosts"
-  ];
-
-  programs.ssh = {
-    enable = true;
-    compression = true;
+  options.zaphyra.programs.ssh.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = true;
+  };
 
-    controlMaster = "auto";
-    controlPersist = "2m";
+  config = lib.mkIf config.zaphyra.programs.ssh.enable {
+    programs.ssh = {
+      enable = true;
+      enableDefaultConfig = false;
+      matchBlocks = {
+        "*" = {
+          compression = true;
 
-    serverAliveInterval = 30;
+          controlMaster = "auto";
+          controlPersist = "2m";
 
-    matchBlocks = {
-      "zaphyra-git" = {
-        user = "git";
-        hostname = "git.zaphyra.eu";
+          serverAliveInterval = 30;
+        };
+        "zaphyra-git" = {
+          user = "git";
+          hostname = "git.zaphyra.eu";
+        };
       };
     };
+
+    #    home.file.".ssh/known_hosts".force = true;
+    home.persistence."/nix/persist/home/${config.home.username}".files = [
+      "ssh/.ssh/known_hosts"
+    ];
   };
 
 }
diff --git a/config/home/zaphyra/programs/swaylock.nix b/config/home/zaphyra/programs/swaylock.nix
@@ -1,5 +1,6 @@
 {
   inputs,
+  systemConfig,
   config,
   lib,
   pkgs,

@@ -8,37 +9,44 @@
 
 {
 
-  programs.swaylock = {
-    enable = true;
-    package = pkgs.swaylock-plugin-fprintd;
-    settings = {
-      # clock = true;
+  options.zaphyra.programs.swaylock.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.services.swaylock.enable;
+  };
 
-      indicator = true;
-      ring-color = "4aa96c";
-      show-failed-attempts = true;
-      fingerprint = true;
+  config = lib.mkIf config.zaphyra.programs.swaylock.enable {
+    programs.swaylock = {
+      enable = true;
+      package = pkgs.swaylock-plugin-fprintd;
+      settings = {
+        # clock = true;
 
-      command = "${lib.getExe pkgs.tgc.shaderbg} '*' --fps 10 ${inputs.self.resources.shaders.background1}";
+        indicator = true;
+        ring-color = "4aa96c";
+        show-failed-attempts = true;
+        fingerprint = false;
 
-      # image = "/home/zaphyra/Pictures/Backgrounds/lock.png";
-      # scaling = "fit";
-      # color = "ffffaf";
-    };
-  };
+        command = "${lib.getExe pkgs.tgc.shaderbg} '*' --fps 10 ${inputs.self.resources.shaders.background1}";
 
-  systemd.user.services.swaylock = {
-    Unit = {
-      OnSuccess = [ "unlock.target" ];
-      PartOf = [ "lock.target" ];
-      After = [ "lock.target" ];
+        # image = "/home/zaphyra/Pictures/Backgrounds/lock.png";
+        # scaling = "fit";
+        # color = "ffffaf";
+      };
     };
-    Service = {
-      ExecStart = lib.getExe config.programs.swaylock.package;
-      Restart = "on-failure";
-      RestartSec = 0;
+
+    systemd.user.services.swaylock = {
+      Unit = {
+        OnSuccess = [ "unlock.target" ];
+        PartOf = [ "lock.target" ];
+        After = [ "lock.target" ];
+      };
+      Service = {
+        ExecStart = lib.getExe config.programs.swaylock.package;
+        Restart = "on-failure";
+        RestartSec = 0;
+      };
+      Install.WantedBy = [ "lock.target" ];
     };
-    Install.WantedBy = [ "lock.target" ];
   };
 
 }
diff --git a/config/home/zaphyra/programs/systemUtilities.nix b/config/home/zaphyra/programs/systemUtilities.nix
@@ -0,0 +1,32 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+
+  options.zaphyra.programs.systemUtilities.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = true;
+  };
+
+  config = lib.mkIf config.zaphyra.programs.systemUtilities.enable {
+    programs.jq.enable = true;
+
+    home.packages = with pkgs; [
+      smartmontools
+
+      gptfdisk
+      e2fsprogs
+      dosfstools
+
+      usbutils
+      pciutils
+
+      lm_sensors
+    ];
+  };
+
+}
diff --git a/config/home/zaphyra/programs/thunderbird.nix b/config/home/zaphyra/programs/thunderbird.nix
@@ -8,49 +8,56 @@
 
 {
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "thunderbird/.thunderbird/"
-    "thunderbird/.cache/thunderbird"
-  ];
-
-  home.packages = [ pkgs.thunderbird ];
-
-  systemd.user.services.thunderbird = {
-    Unit.After = [ "graphical-session-pre.target" ];
-    Unit.PartOf = [ "graphical-session.target" ];
-
-    Service = {
-      Environment =
-        "PATH="
-        + (lib.makeBinPath [
-          "/run/wrappers"
-          (
-            if !systemConfig.nix.settings.use-xdg-base-directories then
-              "/home/${config.home.username}/.nix-profile"
-            else
-              "/home/${config.home.username}/.local/state/nix/profile"
-          )
-          "/nix/var/nix/profiles/default"
-          "/run/current-system/sw"
-        ]);
-      ExecStart = lib.getExe pkgs.thunderbird;
-      Restart = "always";
-      RestartSec = 5;
-    };
-
-    Install.WantedBy = [ "graphical-session.target" ];
+  options.zaphyra.programs.thunderbird.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
   };
 
-  xdg = {
-    enable = true;
-    mime.enable = true;
+  config = lib.mkIf config.zaphyra.programs.thunderbird.enable {
+    home.packages = [ pkgs.thunderbird ];
+
+    home.persistence."/nix/persist/home/${config.home.username}".directories = [
+      "thunderbird/.thunderbird/"
+      "thunderbird/.cache/thunderbird"
+    ];
+
+    systemd.user.services.thunderbird = {
+      Unit.After = [ "graphical-session-pre.target" ];
+      Unit.PartOf = [ "graphical-session.target" ];
+
+      Service = {
+        Environment =
+          "PATH="
+          + (lib.makeBinPath [
+            "/run/wrappers"
+            (
+              if !systemConfig.nix.settings.use-xdg-base-directories then
+                "/home/${config.home.username}/.nix-profile"
+              else
+                "/home/${config.home.username}/.local/state/nix/profile"
+            )
+            "/nix/var/nix/profiles/default"
+            "/run/current-system/sw"
+          ]);
+        ExecStart = lib.getExe pkgs.thunderbird;
+        Restart = "always";
+        RestartSec = 5;
+      };
+
+      Install.WantedBy = [ "graphical-session.target" ];
+    };
+
+    xdg = {
+      enable = true;
+      mime.enable = true;
 
-    #force hm to override existing mimeapps.list file
-    configFile."mimeapps.list".force = true;
+      #force hm to override existing mimeapps.list file
+      configFile."mimeapps.list".force = true;
 
-    mimeApps.enable = true;
-    mimeApps.defaultApplications = {
-      "x-scheme-handler/mailto" = "thunderbird.desktop";
+      mimeApps.enable = true;
+      mimeApps.defaultApplications = {
+        "x-scheme-handler/mailto" = "thunderbird.desktop";
+      };
     };
   };
 
diff --git a/config/home/zaphyra/programs/tmux.nix b/config/home/zaphyra/programs/tmux.nix
@@ -1,14 +1,22 @@
-_:
+{
+  config,
+  lib,
+  ...
+}:
 
 {
 
-  programs.tmux = {
-    enable = true;
-    clock24 = true;
-    terminal = "xterm-256color";
-    extraConfig = ''
-      set -g mouse on
-    '';
+  options.zaphyra.programs.tmux.enable = lib.mkEnableOption "Enable tmux terminal multiplexer";
+
+  config = lib.mkIf config.zaphyra.programs.tmux.enable {
+    programs.tmux = {
+      enable = true;
+      clock24 = true;
+      terminal = "xterm-256color";
+      extraConfig = ''
+        set -g mouse on
+      '';
+    };
   };
 
 }
diff --git a/config/home/zaphyra/programs/tuba.nix b/config/home/zaphyra/programs/tuba.nix
@@ -1,25 +1,34 @@
 {
   config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "tuba/.cache/tuba"
-  ];
+  options.zaphyra.programs.tuba.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  home.packages = [ pkgs.tuba ];
+  config = lib.mkIf config.zaphyra.programs.tuba.enable {
+    home.packages = [ pkgs.tuba ];
 
-  dconf.settings = {
-    "dev/geopjr/Tuba" = {
-      work-in-background = true;
-      dim-trivial-notifications = true;
-      group-push-notifications = true;
-      reply-to-old-post-reminder = false;
-      show-spoilers = true;
+    dconf.settings = {
+      "dev/geopjr/Tuba" = {
+        work-in-background = true;
+        dim-trivial-notifications = true;
+        group-push-notifications = true;
+        reply-to-old-post-reminder = false;
+        show-spoilers = true;
+      };
     };
+
+    home.persistence."/nix/persist/home/${config.home.username}".directories = [
+      "tuba/.cache/tuba"
+    ];
   };
 
 }
diff --git a/config/home/zaphyra/programs/typst.nix b/config/home/zaphyra/programs/typst.nix
@@ -1,4 +1,6 @@
 {
+  config,
+  systemConfig,
   lib,
   pkgs,
   ...

@@ -6,24 +8,31 @@
 
 {
 
-  home.packages = with pkgs; [
-    typst
-    typst-live
-    typewriter
-  ];
-
-  programs.micro.lsp-servers.typ = {
-    command = lib.getExe pkgs.unstable.tinymist;
+  options.zaphyra.programs.typst.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
   };
 
-  programs.helix.languages = {
-    language-server.tinymist = {
+  config = lib.mkIf config.zaphyra.programs.typst.enable {
+    home.packages = with pkgs; [
+      typst
+      typst-live
+      typewriter
+    ];
+
+    programs.micro.lsp-servers.typ = {
       command = lib.getExe pkgs.unstable.tinymist;
-      config = {
-        preview.background.enabled = true;
-        preview.background.args = [ "--data-plane-host=127.0.0.1:8123" ];
-        fontPaths = [ "./fonts" ];
-        exportPdf = "onSave";
+    };
+
+    programs.helix.languages = {
+      language-server.tinymist = {
+        command = lib.getExe pkgs.unstable.tinymist;
+        config = {
+          preview.background.enabled = true;
+          preview.background.args = [ "--data-plane-host=127.0.0.1:8123" ];
+          fontPaths = [ "./fonts" ];
+          exportPdf = "onSave";
+        };
       };
     };
   };
diff --git a/config/home/zaphyra/programs/wleave.nix b/config/home/zaphyra/programs/wleave.nix
@@ -1,96 +1,103 @@
 {
   config,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [
-    pkgs.tgc.wleave
-  ];
+  options.zaphyra.programs.wleave.enable = lib.mkEnableOption "Enable wleave";
 
-  xdg.configFile."wleave/layout.json".text = builtins.toJSON {
-    no-version-info = true;
-    css = "${config.xdg.configHome}/wleave/style.css";
-    close-on-lost-focus = true;
-    buttons-per-row = "1/1";
-    margin-top = 380;
-    margin-bottom = 380;
-    buttons = [
-      {
-        label = "lock";
-        icon = "${pkgs.tgc.wleave}/share/wleave/icons/lock.svg";
-        action = "loginctl lock-session";
-        text = "Lock";
-        keybind = "l";
-      }
-      {
-        label = "suspend";
-        icon = "${pkgs.tgc.wleave}/share/wleave/icons/suspend.svg";
-        action = "systemctl suspend";
-        text = "Suspend";
-        keybind = "u";
-      }
-      {
-        label = "logout";
-        icon = "${pkgs.tgc.wleave}/share/wleave/icons/logout.svg";
-        action = "loginctl terminate-user $USER";
-        text = "Logout";
-        keybind = "e";
-      }
-      {
-        label = "shutdown";
-        icon = "${pkgs.tgc.wleave}/share/wleave/icons/shutdown.svg";
-        action = "systemctl poweroff";
-        text = "Shutdown";
-        keybind = "s";
-      }
-      {
-        label = "reboot";
-        icon = "${pkgs.tgc.wleave}/share/wleave/icons/reboot.svg";
-        action = "systemctl reboot";
-        text = "Reboot";
-        keybind = "r";
-      }
+  config = lib.mkIf config.zaphyra.programs.wleave.enable {
+    home.packages = [
+      pkgs.tgc.wleave
     ];
-  };
 
-  home.file."${config.xdg.configHome}/wleave/style.css".text = ''
-    * {
-      font-family: "Adwaita Sans", "Symbols Nerd Font";
-      outline: none;
-      color: white;
-    }
+    xdg.configFile = {
+      "wleave/layout.json".text = builtins.toJSON {
+        no-version-info = true;
+        css = "${config.xdg.configHome}/wleave/style.css";
+        close-on-lost-focus = true;
+        buttons-per-row = "1/1";
+        margin-top = 380;
+        margin-bottom = 380;
+        buttons = [
+          {
+            label = "lock";
+            icon = "${pkgs.tgc.wleave}/share/wleave/icons/lock.svg";
+            action = "loginctl lock-session";
+            text = "Lock";
+            keybind = "l";
+          }
+          {
+            label = "suspend";
+            icon = "${pkgs.tgc.wleave}/share/wleave/icons/suspend.svg";
+            action = "systemctl suspend";
+            text = "Suspend";
+            keybind = "u";
+          }
+          {
+            label = "logout";
+            icon = "${pkgs.tgc.wleave}/share/wleave/icons/logout.svg";
+            action = "loginctl terminate-user $USER";
+            text = "Logout";
+            keybind = "e";
+          }
+          {
+            label = "shutdown";
+            icon = "${pkgs.tgc.wleave}/share/wleave/icons/shutdown.svg";
+            action = "systemctl poweroff";
+            text = "Shutdown";
+            keybind = "s";
+          }
+          {
+            label = "reboot";
+            icon = "${pkgs.tgc.wleave}/share/wleave/icons/reboot.svg";
+            action = "systemctl reboot";
+            text = "Reboot";
+            keybind = "r";
+          }
+        ];
+      };
+
+      "wleave/style.css".text = ''
+        * {
+          font-family: "Adwaita Sans", "Symbols Nerd Font";
+          outline: none;
+          color: white;
+        }
 
-    window {
-      background-color: @background-color;
-    }
+        window {
+          background-color: @background-color;
+        }
 
-    button {
-      color: rgb(190, 190, 190);
-      background: @button-color;
-      border: 1px solid @border-color;
-      border-radius: 10px;
-      padding: 10px;
-      margin: 10px;
-    }
+        button {
+          color: rgb(190, 190, 190);
+          background: @button-color;
+          border: 1px solid @border-color;
+          border-radius: 10px;
+          padding: 10px;
+          margin: 10px;
+        }
 
-    button:hover {
-      border-color: @border-color;
-      background: @button-hover-color;
-    }
+        button:hover {
+          border-color: @border-color;
+          background: @button-hover-color;
+        }
 
-    button:focus {
-      border: 2px solid @accent-border-color;
-      background: @button-hover-color;
-    }
+        button:focus {
+          border: 2px solid @accent-border-color;
+          background: @button-hover-color;
+        }
 
-    button label.action-name {
-      margin-top: 20px;
-      font-size: 18pt;
-      font-weight: 300;
-    }
-  '';
+        button label.action-name {
+          margin-top: 20px;
+          font-size: 18pt;
+          font-weight: 300;
+        }
+      '';
+    };
+  };
 
 }
diff --git a/config/home/zaphyra/programs/yazi.nix b/config/home/zaphyra/programs/yazi.nix
@@ -1,37 +1,43 @@
-_:
+{
+  config,
+  lib,
+  ...
+}:
 
 {
 
-  programs.yazi = {
-    enable = true;
-    settings = {
-      mgr = {
-        show_hidden = false;
-        sort_by = "natural";
-        sort_dir_first = true;
-        sort_reverse = true;
-        linemode = "size_and_mtime";
+  options.zaphyra.programs.yazi.enable = lib.mkEnableOption "Enable yazi file-browser";
+
+  config = lib.mkIf config.zaphyra.programs.yazi.enable {
+    programs.yazi = {
+      enable = true;
+      settings = {
+        mgr = {
+          show_hidden = false;
+          sort_by = "natural";
+          sort_dir_first = true;
+          sort_reverse = true;
+          linemode = "size_and_mtime";
+        };
       };
-    };
 
-    initLua = ''
-      -- ~/.config/yazi/init.lua
-      function Linemode:size_and_mtime()
-        local time = math.floor(self._file.cha.mtime or 0)
-        if time == 0 then
-          time = ""
-        elseif os.date("%Y", time) == os.date("%Y") then
-          time = os.date("%b %d %H:%M", time)
-        else
-          time = os.date("%b %d  %Y", time)
-        end
+      initLua = ''
+        -- ~/.config/yazi/init.lua
+        function Linemode:size_and_mtime()
+          local time = math.floor(self._file.cha.mtime or 0)
+          if time == 0 then
+            time = ""
+          elseif os.date("%Y", time) == os.date("%Y") then
+            time = os.date("%b %d %H:%M", time)
+          else
+            time = os.date("%b %d  %Y", time)
+          end
 
-        local size = self._file:size()
-        return string.format("%s %s", size and ya.readable_size(size) or "-", time)
-      end
-    '';
+          local size = self._file:size()
+          return string.format("%s %s", size and ya.readable_size(size) or "-", time)
+        end
+      '';
+    };
   };
 
-  # programs.sherlock.settings.ignore = "Yazi";
-
 }
diff --git a/config/home/zaphyra/programs/yt-dlp.nix b/config/home/zaphyra/programs/yt-dlp.nix
@@ -1,17 +1,27 @@
 {
+  config,
+  systemConfig,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.shellAliases.yt-dlp-audio = "yt-dlp --format bestaudio -x --audio-format opus --add-metadata --embed-thumbnail";
+  options.zaphyra.programs.yt-dlp.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = systemConfig.modules.presets.graphical.enable;
+  };
 
-  home.packages = with pkgs; [
-    yt-dlp
-    (pkgs.writeShellScriptBin "youtube-dl" ''
-      exec ${pkgs.yt-dlp}/bin/yt-dlp --compat-options youtube-dl "$@"
-    '')
-  ];
+  config = lib.mkIf config.zaphyra.programs.yt-dlp.enable {
+    home.packages = with pkgs; [
+      yt-dlp
+      (pkgs.writeShellScriptBin "youtube-dl" ''
+        exec ${pkgs.yt-dlp}/bin/yt-dlp --compat-options youtube-dl "$@"
+      '')
+    ];
+
+    home.shellAliases.yt-dlp-audio = "yt-dlp --format bestaudio -x --audio-format opus --add-metadata --embed-thumbnail";
+  };
 
 }
diff --git a/config/home/zaphyra/programs/zathura.nix b/config/home/zaphyra/programs/zathura.nix
@@ -1,10 +1,16 @@
 {
+  config,
+  lib,
   pkgs,
   ...
 }:
 
 {
 
-  home.packages = [ pkgs.zathura ];
+  options.zaphyra.programs.zathura.enable = lib.mkEnableOption "zathura pdf-viewer";
+
+  config = lib.mkIf config.zaphyra.programs.zathura.enable {
+    home.packages = [ pkgs.zathura ];
+  };
 
 }
diff --git a/config/home/zaphyra/programs/zoxide.nix b/config/home/zaphyra/programs/zoxide.nix
@@ -1,23 +1,31 @@
 {
   config,
+  lib,
   ...
 }:
 
 {
 
-  home.persistence."/nix/persist/home/${config.home.username}".directories = [
-    "zoxide/.local/share/zoxide"
-  ];
-
-  programs.zoxide = {
-    enable = true;
-    enableFishIntegration = true;
-    enableZshIntegration = true;
+  options.zaphyra.programs.zoxide.enable = lib.mkOption {
+    type = lib.types.bool;
+    default = true;
   };
 
-  home.shellAliases = {
-    "cd" = "z";
-    "cdi" = "zi";
+  config = lib.mkIf config.zaphyra.programs.zoxide.enable {
+    programs.zoxide = {
+      enable = true;
+      enableFishIntegration = true;
+      enableZshIntegration = true;
+    };
+
+    home.shellAliases = {
+      "cd" = "z";
+      "cdi" = "zi";
+    };
+
+    home.persistence."/nix/persist/home/${config.home.username}".directories = [
+      "zoxide/.local/share/zoxide"
+    ];
   };
 
 }
diff --git a/config/home/zaphyra/programs/zsh.nix b/config/home/zaphyra/programs/zsh.nix
@@ -1,44 +1,48 @@
 {
   config,
-  pkgs,
   lib,
+  pkgs,
   ...
 }:
 
 {
 
-  home.packages = [
-    pkgs.zsh
-    (lib.lowPrio pkgs.zsh-completions)
-  ];
-
-  programs.zsh = {
-    enable = true;
-    enableCompletion = true;
-    enableVteIntegration = true;
-
-    dotDir = ".config/zsh";
-
-    history = {
-      path = "${config.xdg.dataHome}/zsh/zsh_history";
-      save = 100000000;
-      size = 1000000000;
-      expireDuplicatesFirst = true;
-      ignoreDups = true;
-      share = true;
-    };
+  options.zaphyra.programs.zsh.enable = lib.mkEnableOption "zsh shell";
+
+  config = lib.mkIf config.zaphyra.programs.zsh.enable {
+    home.packages = [
+      pkgs.zsh
+      (lib.lowPrio pkgs.zsh-completions)
+    ];
 
-    oh-my-zsh = {
+    programs.zsh = {
       enable = true;
-      plugins = [
-        "git"
-        "gitfast"
-        "sudo"
-        "systemd"
-      ];
-      extraConfig = ''
-        zstyle ':completion:*' menu select
-      '';
+      enableCompletion = true;
+      enableVteIntegration = true;
+
+      dotDir = ".config/zsh";
+
+      history = {
+        path = "${config.xdg.dataHome}/zsh/zsh_history";
+        save = 100000000;
+        size = 1000000000;
+        expireDuplicatesFirst = true;
+        ignoreDups = true;
+        share = true;
+      };
+
+      oh-my-zsh = {
+        enable = true;
+        plugins = [
+          "git"
+          "gitfast"
+          "sudo"
+          "systemd"
+        ];
+        extraConfig = ''
+          zstyle ':completion:*' menu select
+        '';
+      };
     };
   };
 
diff --git a/config/home/zaphyra/services/swaync.nix b/config/home/zaphyra/services/swaync.nix
@@ -2,15 +2,12 @@
   config,
   lib,
   pkgs,
-  homeManagerModules,
   ...
 }:
 
 {
 
-  imports = [
-    homeManagerModules.zaphyra.programs.wleave
-  ];
+  zaphyra.programs.wleave.enable = true;
 
   services.swaync = {
     enable = true;
diff --git a/config/home/zaphyra/services/waybar.nix b/config/home/zaphyra/services/waybar.nix
@@ -1,6 +1,5 @@
 {
   config,
-  homeManagerModules,
   pkgs,
   lib,
   ...

@@ -8,10 +7,10 @@
 
 {
 
-  imports = with homeManagerModules.zaphyra; [
-    programs.networkManagerDmenu
-    programs.nmgui
-  ];
+  zaphyra.programs = {
+    networkManagerDmenu.enable = true;
+    nmgui.enable = true;
+  };
 
   programs.waybar = {
     enable = true;
diff --git a/config/home/zaphyra/services/wpaperd.nix b/config/home/zaphyra/services/wpaperd.nix
@@ -21,23 +21,31 @@
         transition.bounce = { };
       };
 
-      any.path = pkgs.buildEnv {
-        name = "nixos-artwork";
-        paths = lib.pipe pkgs.nixos-artwork.wallpapers [
-          lib.attrNames
-          (lib.remove "override")
-          (lib.remove "overrideDerivation")
-          # removed because too bright
-          (lib.remove "binary-white")
-          (lib.remove "catppuccin-latte")
-          (lib.remove "moonscape")
-          (lib.remove "nineish-catppuccin-latte")
-          (lib.remove "nineish-catppuccin-latte-alt")
-          (lib.remove "nineish-solarized-light")
-          (lib.remove "nineish")
-          (lib.remove "simple-light-gray")
-          (map (name: "${pkgs.nixos-artwork.wallpapers.${name}}/share/backgrounds/nixos"))
+      any.path = pkgs.symlinkJoin {
+        name = "backgrounds";
+        paths = with pkgs.nixos-artwork.wallpapers; [
+          binary-black
+          binary-blue
+          binary-red
+
+          nineish
+          nineish-solarized-dark
+          nineish-dark-gray
+          nineish-catppuccin-mocha-alt
+          nineish-catppuccin-mocha
+          nineish-catppuccin-frappe-alt
+          nineish-catppuccin-frappe
+          nineish-catppuccin-macchiato-alt
+          nineish-catppuccin-macchiato
+
+          simple-red
+          simple-dark-gray
+          simple-blue
+
+          dracula
+          gradient-grey
         ];
+        stripPrefix = "/share/backgrounds/nixos";
       };
     };
   };
diff --git a/config/nixos/modules/gnomeMinimal.nix b/config/nixos/modules/gnomeMinimal.nix
@@ -307,7 +307,7 @@ in
               "accounts-daemon.service"
             ];
             conflicts = [
-              "getty@${pkgs.gdm.initialVT}.service"
+              "getty@1.service"
               "plymouth-quit.service"
             ];
             onFailure = [ "plymouth-quit.service" ];

@@ -316,7 +316,7 @@ in
               "systemd-logind.service"
               "systemd-user-sessions.service"
               "systemd-machined.service"
-              "getty@${pkgs.gdm.initialVT}.service"
+              "getty@1.service"
               "acpid.service"
               "plymouth-quit.service"
               "plymouth-start.service"
diff --git a/config/nixos/modules/hardware/video/intel.nix b/config/nixos/modules/hardware/video/intel.nix
@@ -1,4 +1,5 @@
 {
+  hostConfig,
   povSelf,
   config,
   lib,

@@ -18,21 +19,24 @@ in
   };
 
   config = lib.mkIf cfg.enable {
-    hardware.intelgpu.driver = "xe";
+    hardware = {
+      #intelgpu.driver = "xe";
+      graphics = {
+        enable = true;
+        enable32Bit = true;
+        extraPackages = with pkgs; [
+          libvdpau-va-gl
+          vpl-gpu-rt
+          libva
+          intel-media-driver
+        ];
+      };
+    };
 
     services.xserver.videoDrivers = [ "intel" ];
 
     environment.systemPackages = [ pkgs.vulkan-validation-layers ];
 
-    hardware.graphics = {
-      enable = true;
-      enable32Bit = true;
-      extraPackages = with pkgs; [
-        libvdpau-va-gl
-        vpl-gpu-rt
-        libva
-      ];
-    };
   };
 
 }
diff --git a/config/nixos/modules/presets/graphical/typeNiri.nix b/config/nixos/modules/presets/graphical/typeNiri.nix
@@ -32,7 +32,9 @@ in
       };
     };
 
-    security.polkit.enable = true;
+    services.gnome.gnome-keyring.enable = false;
+
+    security.soteria.enable = true;
 
     programs = {
       dconf.enable = true;
diff --git a/config/nixos/modules/presets/zaphyra/dnsServer.nix b/config/nixos/modules/presets/zaphyra/dnsServer.nix
@@ -52,6 +52,20 @@ in
 
         in
         {
+          "fc9f.de" = {
+            NS = [
+              "ns1.fc9f.de."
+            ];
+            SOA = {
+              nameServer = "ns1.fc9f.de.";
+              adminEmail = "dns@zaphyra.eu"; # Email address with a real `@`!
+              serial = 0;
+            };
+            subdomains = {
+              ns1 = host inputs.self.hosts.morio.networking.ip4Address inputs.self.hosts.morio.networking.ip6Address;
+              ns2 = host inputs.self.hosts.novus.networking.ip4Address inputs.self.hosts.novus.networking.ip6Address;
+            };
+          };
           "zaphyra.eu" = {
             inherit
               SOA
diff --git a/config/nixos/modules/presets/zaphyra/enable.nix b/config/nixos/modules/presets/zaphyra/enable.nix
@@ -112,7 +112,7 @@ in
 
           journald.extraConfig = "SystemMaxUse=2.5G";
 
-          logind.killUserProcesses = lib.mkDefault true;
+          logind.settings.Login.KillUserProcesses = lib.mkDefault true;
 
           nginx = {
             enable = lib.mkDefault true;
diff --git a/config/nixos/modules/presets/zaphyra/mailServer.nix b/config/nixos/modules/presets/zaphyra/mailServer.nix
@@ -139,7 +139,7 @@ in
           };
         }) cfg.extraDomains);
 
-      systemd.services.dovecot2.after = [ "sops-install-secrets.service" ];
+      systemd.services.dovecot.after = [ "sops-install-secrets.service" ];
 
       sops.secrets = {
         "mailPasswords/katja@zaphyra.eu" = { };

@@ -196,7 +196,7 @@ in
 
       security.acme.certs."${cfg.hostName}".reloadServices = [
         "postfix.service"
-        "dovecot2.service"
+        "dovecot.service"
       ];
 
       services = {

@@ -215,6 +215,7 @@ in
 
       mailserver = {
         enable = true;
+        stateVersion = 3;
         fqdn = cfg.hostName;
 
         openFirewall = true;
diff --git a/config/nixos/modules/programs/AusweisApp.nix b/config/nixos/modules/programs/AusweisApp.nix
@@ -20,7 +20,7 @@ in
 
   config = lib.mkIf cfg.enable {
     networking.firewall.allowedUDPPorts = [ 24727 ];
-    environment.systemPackages = [ pkgs.AusweisApp2 ];
+    environment.systemPackages = [ pkgs.ausweisapp ];
   };
 
 }
diff --git a/config/nixos/modules/services/greetd.nix b/config/nixos/modules/services/greetd.nix
@@ -148,7 +148,7 @@ in
         services.greetd.settings = {
           default_session = {
             command = lib.concatStringsSep " " [
-              (lib.getExe pkgs.greetd.tuigreet)
+              (lib.getExe pkgs.tuigreet)
               "--no-xsession-wrapper"
               "--remember"
               "--remember-session"
diff --git a/config/nixos/modules/services/keyd.nix b/config/nixos/modules/services/keyd.nix
@@ -31,8 +31,10 @@ in
               "leftcontrol" = "leftalt";
               "leftalt" = "leftcontrol";
               "rightalt" = "rightcontrol";
-              "sysrq" = "rightalt";
-              "rightcontrol" = "sysrq";
+              "rightcontrol" = "rightalt";
+              #"rightalt" = "rightcontrol";
+              #"sysrq" = "rightalt";
+              #"rightcontrol" = "sysrq";
               "s+d" = "oneshot(shift)";
               "f+j" = "space";
               "j+k" = "backspace";

@@ -54,7 +56,10 @@ in
           };
         };
         BlackShark = {
-          ids = [ "0c45:8006:d510c59d" ];
+          ids = [
+            "0c45:8006:d510c59d"
+            "04d9:a131:ae490786"
+          ];
           settings.main = {
             "leftcontrol" = "leftalt";
             "leftalt" = "leftcontrol";
diff --git a/config/nixos/modules/users/zaphyra.nix b/config/nixos/modules/users/zaphyra.nix
@@ -45,91 +45,51 @@ in
       }
 
       (lib.mkIf config.modules.homeManager.enable {
-        home-manager.users.zaphyra.imports = lib.concatLists [
-          [
-            homeManagerModules.common.home
-            homeManagerModules.zaphyra.home
-          ]
-
-          (lib.optionals config.modules.filesystem.impermanence.home.enable [
-            homeManagerModules.zaphyra.impermanence
-          ])
-
-          (lib.optionals config.modules.presets.graphical.enable (
-            with homeManagerModules.zaphyra;
+        home-manager.users.zaphyra = {
+          imports = lib.concatLists [
             [
-              configure.xdg
-
-              services.owntone
-
-              programs.ghostty
-              programs.ssh
-              programs.git
-              programs.gpg
-              homeManagerModules.common.programs.gpg
-
-              programs.languages.nix
-              programs.languages.nimlang
-              programs.languages.golang
-              programs.languages.javascript
-
-              programs.yt-dlp
-              programs.bitwarden-cli
-              programs.chaosctl
-
-              programs.pipewire
-
-              programs.firefox
-              programs.thunderbird
-
-              programs.errands
-              programs.gnome-calendar
-
-              programs.fractal
-              programs.dino
-              programs.gajim
-              programs.tuba
-              programs.profanity
-
-              programs.nautilus
-
-              programs.typst
-              programs.ocrmypdf
-              programs.papers
-              programs.pdfarranger
-              programs.libreoffice
-              programs.apostrophe
-              programs.gnome-text-editor
-
-              programs.plattenalbum
-              programs.celluloid
-              programs.loupe
-              programs.gnome-obfuscate
-            ]
-          ))
-
-          (lib.optionals (config.modules.presets.graphical.type == "gnomeMinimal") (
-            with homeManagerModules.zaphyra;
-            [
-              configure.gnome
-
-              gnomeExtensions.dash-to-dock
-              gnomeExtensions.just-perfection
-              gnomeExtensions.space-bar
-              gnomeExtensions.search-light
-              gnomeExtensions.emoji-copy
-              gnomeExtensions.pip-on-top
-              gnomeExtensions.bluetoothBatteryMeter
+              homeManagerModules.common.home
+              homeManagerModules.zaphyra.home
             ]
-          ))
 
-          (lib.optionals (config.modules.presets.graphical.type == "niri") (
-            with homeManagerModules.zaphyra;
-            [
-              configure.niri
-            ]
-          ))
-        ];
+            (lib.optionals config.modules.filesystem.impermanence.home.enable [
+              homeManagerModules.zaphyra.impermanence
+            ])
+
+            (lib.optionals config.modules.presets.graphical.enable (
+              with homeManagerModules.zaphyra;
+              [
+                configure.xdg
+
+                services.owntone
+
+                homeManagerModules.common.programs.gpg
+              ]
+            ))
+
+            (lib.optionals (config.modules.presets.graphical.type == "gnomeMinimal") (
+              with homeManagerModules.zaphyra;
+              [
+                configure.gnome
+
+                gnomeExtensions.dash-to-dock
+                gnomeExtensions.just-perfection
+                gnomeExtensions.space-bar
+                gnomeExtensions.search-light
+                gnomeExtensions.emoji-copy
+                gnomeExtensions.pip-on-top
+                gnomeExtensions.bluetoothBatteryMeter
+              ]
+            ))
+
+            (lib.optionals (config.modules.presets.graphical.type == "niri") (
+              with homeManagerModules.zaphyra;
+              [
+                configure.niri
+              ]
+            ))
+          ];
+        };
       })
     ]
   );
diff --git a/config/nixos/modules/websites/continuwuity.zaphyra.eu.nix b/config/nixos/modules/websites/continuwuity.zaphyra.eu.nix
@@ -4,6 +4,8 @@
   config,
   lib,
   pkgs,
+  inputs,
+  hostConfig,
   ...
 }:
 

@@ -50,6 +52,7 @@ in
 
     services.matrix-continuwuity = {
       enable = true;
+      package = inputs.continuwuity.packages.${hostConfig.system}.default;
       settings = {
         global = {
           address = [ "::1" ];

@@ -73,6 +76,12 @@ in
           };
           matrixClientConfig = {
             "m.homeserver".base_url = "https://${cfg.subdomain}.${cfg.domain}/";
+            "org.matrix.msc4143.rtc_foci" = [
+              {
+                type = "livekit";
+                livekit_service_url = "https://livekit.rtc.matrix.nwex.de";
+              }
+            ];
           };
         in
         {
diff --git a/config/nixos/modules/websites/ente.zaphyra.eu.nix b/config/nixos/modules/websites/ente.zaphyra.eu.nix
@@ -74,7 +74,6 @@ in
     services.ente = {
       web = {
         enable = true;
-        package = pkgs.unstable.ente-web;
         domains = lib.genAttrs subdomains (
           name:
           lib.concatStringsSep "." [

@@ -86,7 +85,6 @@ in
       };
       api = {
         enable = true;
-        package = pkgs.unstable.museum;
         enableLocalDB = true;
         nginx.enable = true;
         domain = "api.${cfg.subdomain}.${cfg.domain}";

@@ -106,9 +104,10 @@ in
     services.nginx = {
       enable = true;
       virtualHosts =
-        (lib.genAttrs' subdomains (
+        (lib.genAttrs' (lib.filter (name: name != "albums") subdomains) (
           name:
           lib.nameValuePair "${name}.${cfg.subdomain}.${cfg.domain}" {
+            serverAliases = lib.mkIf (name == "photos") [ "albums.${cfg.subdomain}.${cfg.domain}" ];
             useACMEHost = config.networking.fqdn;
             forceSSL = true;
             kTLS = true;
diff --git a/config/nixos/modules/websites/music.zaphyra.dn42.nix b/config/nixos/modules/websites/music.zaphyra.dn42.nix
@@ -66,7 +66,6 @@ in
         FFmpegPath = lib.getExe pkgs.ffmpeg;
       };
     };
-
     security.acme.certs."${cfg.subdomain}.${cfg.domain}" = {
       server = "https://acme.burble.dn42/v1/dn42/acme/directory";
       validMinDays = 20;
diff --git a/config/nixos/modules/websites/photos.zaphyra.eu.nix b/config/nixos/modules/websites/photos.zaphyra.eu.nix
@@ -0,0 +1,143 @@
+{
+  povSelf,
+  hostConfig,
+  config,
+  pkgs,
+  lib,
+  dnsNix,
+  ...
+}:
+
+let
+  inherit (lib) types;
+  cfg = lib.getAttrFromPath povSelf config;
+
+in
+{
+
+  options = {
+    enable = {
+      type = types.bool;
+      default = false;
+    };
+    subdomain = {
+      type = types.str;
+      default = "photos";
+    };
+    domain = {
+      type = types.str;
+      default = "zaphyra.eu";
+    };
+  };
+
+  config = lib.mkIf cfg.enable (
+    let
+      galleryConfig = {
+        globalSection = {
+          SourceDir = "/mnt/photos.zaphyra.eu";
+          TargetDir = "/var/lib/gallery";
+          MogrifyCmd = "${pkgs.imagemagick}/bin/mogrify";
+        };
+
+        sections = {
+          Thumbnails = {
+            SmallHeight = "200";
+            SmallQuality = "90";
+          };
+
+          Site = {
+            Author = "zaphyra";
+            Name = "zaphyra.photos";
+            Description = "photos that i made";
+            Tags = "zaphyra, zaphyra bahnbilder";
+            ShowOriginalsButton = "true";
+            SymlinkOriginals = "true";
+            EnableJS = "true";
+          };
+        };
+      };
+
+      galleryConfigFile = pkgs.writeText "gallery.ini" (
+        lib.generators.toINIWithGlobalSection { } galleryConfig
+      );
+
+    in
+    {
+      dns.zones."${cfg.domain}".subdomains."${cfg.subdomain}".CNAME = [ "${config.networking.fqdn}." ];
+
+      modules.filesystem.impermanence.system.dirs = [ "/var/lib/private/gallery" ];
+
+      fileSystems."/mnt/photos.zaphyra.eu" = {
+        device = "/home/zaphyra/Pictures/photos.zaphyra.eu";
+        fsType = "fuse.bindfs";
+        options = [
+          "ro"
+          "perms=0000:a+rX"
+        ];
+      };
+      fileSystems."/mnt/photos.zaphyra.eu-webdir" = {
+        device = "/var/lib/private/gallery";
+        fsType = "fuse.bindfs";
+        options = [
+          "ro"
+          "perms=0000:a+rX"
+        ];
+      };
+
+      systemd.services.gallery = {
+        #startAt = "*-*-* *:0/10:00";
+        wantedBy = [ "multi-user.target" ];
+        requires = [ "local-fs.target" ];
+        path = [ pkgs.imagemagick ];
+
+        serviceConfig = {
+          Type = "oneshot";
+          DynamicUser = true;
+
+          ExecStart = "${pkgs.gallery}/bin/gallery ${galleryConfigFile}";
+
+          User = "gallery";
+          Group = "gallery";
+
+          StateDirectory = "gallery";
+          StateDirectoryMode = "755";
+
+          NoNewPrivileges = true;
+          PrivateTmp = true;
+          PrivateDevices = true;
+
+          RestrictNamespaces = true;
+          RestrictRealtime = true;
+
+          ProtectSystem = "full";
+          ProtectControlGroups = true;
+          ProtectKernelModules = true;
+          ProtectKernelTunables = true;
+
+          DevicePolicy = "closed";
+          LockPersonality = true;
+        };
+      };
+
+      systemd.services.nginx.serviceConfig.BindReadOnlyPaths = [ ];
+
+      services.nginx = {
+        enable = true;
+        virtualHosts."${cfg.subdomain}.${cfg.domain}" = {
+          useACMEHost = "${config.networking.fqdn}";
+          forceSSL = true;
+          kTLS = true;
+          root = "/mnt/photos.zaphyra.eu-webdir";
+          locations."~* \.html$".extraConfig = ''
+            add_header Last-Modified $date_gmt;
+            add_header Cache-Control 'private no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
+            if_modified_since off;
+            expires off;
+            etag off;
+          '';
+        };
+      };
+    }
+  );
+
+}
diff --git a/flake.lock b/flake.lock
@@ -1,5 +1,21 @@
 {
   "nodes": {
+    "advisory-db": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1761112158,
+        "narHash": "sha256-RIXu/7eyKpQHjsPuAUODO81I4ni8f+WYSb7K4mTG6+0=",
+        "owner": "rustsec",
+        "repo": "advisory-db",
+        "rev": "58f3aaec0e1776f4a900737be8cd7cb00972210d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "rustsec",
+        "repo": "advisory-db",
+        "type": "github"
+      }
+    },
     "airpodsctl": {
       "inputs": {
         "nixpkgs": [

@@ -20,6 +36,142 @@
         "url": "https://git.zaphyra.eu/airpodsctl"
       }
     },
+    "base16": {
+      "inputs": {
+        "fromYaml": "fromYaml"
+      },
+      "locked": {
+        "lastModified": 1755819240,
+        "narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=",
+        "owner": "SenchoPens",
+        "repo": "base16.nix",
+        "rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6",
+        "type": "github"
+      },
+      "original": {
+        "owner": "SenchoPens",
+        "repo": "base16.nix",
+        "type": "github"
+      }
+    },
+    "base16-fish": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1754405784,
+        "narHash": "sha256-l9xHIy+85FN+bEo6yquq2IjD1rSg9fjfjpyGP1W8YXo=",
+        "owner": "tomyun",
+        "repo": "base16-fish",
+        "rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tomyun",
+        "repo": "base16-fish",
+        "rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
+        "type": "github"
+      }
+    },
+    "base16-fish_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1754405784,
+        "narHash": "sha256-l9xHIy+85FN+bEo6yquq2IjD1rSg9fjfjpyGP1W8YXo=",
+        "owner": "tomyun",
+        "repo": "base16-fish",
+        "rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tomyun",
+        "repo": "base16-fish",
+        "rev": "23ae20a0093dca0d7b39d76ba2401af0ccf9c561",
+        "type": "github"
+      }
+    },
+    "base16-helix": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1752979451,
+        "narHash": "sha256-0CQM+FkYy0fOO/sMGhOoNL80ftsAzYCg9VhIrodqusM=",
+        "owner": "tinted-theming",
+        "repo": "base16-helix",
+        "rev": "27cf1e66e50abc622fb76a3019012dc07c678fac",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "base16-helix",
+        "type": "github"
+      }
+    },
+    "base16-helix_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1752979451,
+        "narHash": "sha256-0CQM+FkYy0fOO/sMGhOoNL80ftsAzYCg9VhIrodqusM=",
+        "owner": "tinted-theming",
+        "repo": "base16-helix",
+        "rev": "27cf1e66e50abc622fb76a3019012dc07c678fac",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "base16-helix",
+        "type": "github"
+      }
+    },
+    "base16-vim": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1732806396,
+        "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=",
+        "owner": "tinted-theming",
+        "repo": "base16-vim",
+        "rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "base16-vim",
+        "rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
+        "type": "github"
+      }
+    },
+    "base16-vim_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1732806396,
+        "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=",
+        "owner": "tinted-theming",
+        "repo": "base16-vim",
+        "rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "base16-vim",
+        "rev": "577fe8125d74ff456cf942c733a85d769afe58b7",
+        "type": "github"
+      }
+    },
+    "base16_2": {
+      "inputs": {
+        "fromYaml": "fromYaml_2"
+      },
+      "locked": {
+        "lastModified": 1755819240,
+        "narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=",
+        "owner": "SenchoPens",
+        "repo": "base16.nix",
+        "rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6",
+        "type": "github"
+      },
+      "original": {
+        "owner": "SenchoPens",
+        "repo": "base16.nix",
+        "type": "github"
+      }
+    },
     "blobs": {
       "flake": false,
       "locked": {

@@ -52,8 +204,49 @@
         "type": "gitlab"
       }
     },
+    "continuwuity": {
+      "inputs": {
+        "advisory-db": "advisory-db",
+        "crane": "crane",
+        "fenix": "fenix",
+        "flake-compat": "flake-compat",
+        "flake-parts": "flake-parts",
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "treefmt-nix": "treefmt-nix"
+      },
+      "locked": {
+        "lastModified": 1766314730,
+        "narHash": "sha256-HIajaptQe3pTE+c5lDr2yQO5FG4NyZ2GU88d8AWJ0Eg=",
+        "ref": "refs/heads/main",
+        "rev": "7fa4fa98628593c1a963f5aa8dbc3657d604b047",
+        "revCount": 5806,
+        "type": "git",
+        "url": "https://forgejo.ellis.link/continuwuation/continuwuity"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://forgejo.ellis.link/continuwuation/continuwuity"
+      }
+    },
     "crane": {
       "locked": {
+        "lastModified": 1760924934,
+        "narHash": "sha256-tuuqY5aU7cUkR71sO2TraVKK2boYrdW3gCSXUkF4i44=",
+        "owner": "ipetkov",
+        "repo": "crane",
+        "rev": "c6b4d5308293d0d04fcfeee92705017537cad02f",
+        "type": "github"
+      },
+      "original": {
+        "owner": "ipetkov",
+        "repo": "crane",
+        "type": "github"
+      }
+    },
+    "crane_2": {
+      "locked": {
         "lastModified": 1731098351,
         "narHash": "sha256-HQkYvKvaLQqNa10KEFGgWHfMAbWBfFp+4cAgkut+NNE=",
         "owner": "ipetkov",

@@ -67,7 +260,7 @@
         "type": "github"
       }
     },
-    "crane_2": {
+    "crane_3": {
       "locked": {
         "lastModified": 1754269165,
         "narHash": "sha256-0tcS8FHd4QjbCVoxN9jI+PjHgA4vc/IjkUSp+N3zy0U=",

@@ -95,11 +288,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1756719547,
-        "narHash": "sha256-N9gBKUmjwRKPxAafXEk1EGadfk2qDZPBQp4vXWPHINQ=",
+        "lastModified": 1762286984,
+        "narHash": "sha256-9I2H9x5We6Pl+DBYHjR1s3UT8wgwcpAH03kn9CqtdQc=",
         "owner": "serokell",
         "repo": "deploy-rs",
-        "rev": "125ae9e3ecf62fb2c0fd4f2d894eb971f1ecaed2",
+        "rev": "9c870f63e28ec1e83305f7f6cb73c941e699f74f",
         "type": "github"
       },
       "original": {

@@ -115,11 +308,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1758287904,
-        "narHash": "sha256-IGmaEf3Do8o5Cwp1kXBN1wQmZwQN3NLfq5t4nHtVtcU=",
+        "lastModified": 1764350888,
+        "narHash": "sha256-6Rp18zavTlnlZzcoLoBTJMBahL2FycVkw2rAEs3cQvo=",
         "owner": "nix-community",
         "repo": "disko",
-        "rev": "67ff9807dd148e704baadbd4fd783b54282ca627",
+        "rev": "2055a08fd0e2fd41318279a5355eb8a161accf26",
         "type": "github"
       },
       "original": {

@@ -135,11 +328,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1758287904,
-        "narHash": "sha256-IGmaEf3Do8o5Cwp1kXBN1wQmZwQN3NLfq5t4nHtVtcU=",
+        "lastModified": 1764350888,
+        "narHash": "sha256-6Rp18zavTlnlZzcoLoBTJMBahL2FycVkw2rAEs3cQvo=",
         "owner": "nix-community",
         "repo": "disko",
-        "rev": "67ff9807dd148e704baadbd4fd783b54282ca627",
+        "rev": "2055a08fd0e2fd41318279a5355eb8a161accf26",
         "type": "github"
       },
       "original": {

@@ -190,6 +383,60 @@
         "type": "github"
       }
     },
+    "fenix": {
+      "inputs": {
+        "nixpkgs": [
+          "continuwuity",
+          "nixpkgs"
+        ],
+        "rust-analyzer-src": "rust-analyzer-src"
+      },
+      "locked": {
+        "lastModified": 1761115517,
+        "narHash": "sha256-Fev/ag/c3Fp3JBwHfup3lpA5FlNXfkoshnQ7dssBgJ0=",
+        "owner": "nix-community",
+        "repo": "fenix",
+        "rev": "320433651636186ea32b387cff05d6bbfa30cea7",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "fenix",
+        "type": "github"
+      }
+    },
+    "firefox-gnome-theme": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1758112371,
+        "narHash": "sha256-lizRM2pj6PHrR25yimjyFn04OS4wcdbc38DCdBVa2rk=",
+        "owner": "rafaelmardojai",
+        "repo": "firefox-gnome-theme",
+        "rev": "0909cfe4a2af8d358ad13b20246a350e14c2473d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "rafaelmardojai",
+        "repo": "firefox-gnome-theme",
+        "type": "github"
+      }
+    },
+    "firefox-gnome-theme_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1758112371,
+        "narHash": "sha256-lizRM2pj6PHrR25yimjyFn04OS4wcdbc38DCdBVa2rk=",
+        "owner": "rafaelmardojai",
+        "repo": "firefox-gnome-theme",
+        "rev": "0909cfe4a2af8d358ad13b20246a350e14c2473d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "rafaelmardojai",
+        "repo": "firefox-gnome-theme",
+        "type": "github"
+      }
+    },
     "firefoxGnomeTheme": {
       "flake": false,
       "locked": {

@@ -207,7 +454,8 @@
         "type": "github"
       }
     },
-    "flakeCompat": {
+    "flake-compat": {
+      "flake": false,
       "locked": {
         "lastModified": 1747046372,
         "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",

@@ -218,6 +466,99 @@
       },
       "original": {
         "owner": "edolstra",
+        "ref": "master",
+        "repo": "flake-compat",
+        "type": "github"
+      }
+    },
+    "flake-parts": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib"
+      },
+      "locked": {
+        "lastModified": 1760948891,
+        "narHash": "sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "864599284fc7c0ba6357ed89ed5e2cd5040f0c04",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_2": {
+      "inputs": {
+        "nixpkgs-lib": "nixpkgs-lib_2"
+      },
+      "locked": {
+        "lastModified": 1743550720,
+        "narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "c621e8422220273271f52058f618c94e405bb0f5",
+        "type": "github"
+      },
+      "original": {
+        "id": "flake-parts",
+        "type": "indirect"
+      }
+    },
+    "flake-parts_3": {
+      "inputs": {
+        "nixpkgs-lib": [
+          "stylix",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1756770412,
+        "narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "4524271976b625a4a605beefd893f270620fd751",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flake-parts_4": {
+      "inputs": {
+        "nixpkgs-lib": [
+          "stylixUnstable",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1756770412,
+        "narHash": "sha256-+uWLQZccFHwqpGqr2Yt5VsW/PbeJVTn9Dk6SHWhNRPw=",
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "rev": "4524271976b625a4a605beefd893f270620fd751",
+        "type": "github"
+      },
+      "original": {
+        "owner": "hercules-ci",
+        "repo": "flake-parts",
+        "type": "github"
+      }
+    },
+    "flakeCompat": {
+      "locked": {
+        "lastModified": 1761588595,
+        "narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
+        "owner": "edolstra",
+        "repo": "flake-compat",
+        "rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
+        "type": "github"
+      },
+      "original": {
+        "owner": "edolstra",
         "repo": "flake-compat",
         "type": "github"
       }

@@ -229,11 +570,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1759362264,
-        "narHash": "sha256-wfG0S7pltlYyZTM+qqlhJ7GMw2fTF4mLKCIVhLii/4M=",
+        "lastModified": 1763759067,
+        "narHash": "sha256-LlLt2Jo/gMNYAwOgdRQBrsRoOz7BPRkzvNaI/fzXi2Q=",
         "owner": "hercules-ci",
         "repo": "flake-parts",
-        "rev": "758cf7296bee11f1706a574c77d072b8a7baa881",
+        "rev": "2cccadc7357c0ba201788ae99c4dfa90728ef5e0",
         "type": "github"
       },
       "original": {

@@ -297,6 +638,58 @@
         "url": "https://git.zaphyra.eu/flauschehorn.sexy"
       }
     },
+    "fromYaml": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1731966426,
+        "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=",
+        "owner": "SenchoPens",
+        "repo": "fromYaml",
+        "rev": "106af9e2f715e2d828df706c386a685698f3223b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "SenchoPens",
+        "repo": "fromYaml",
+        "type": "github"
+      }
+    },
+    "fromYaml_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1731966426,
+        "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=",
+        "owner": "SenchoPens",
+        "repo": "fromYaml",
+        "rev": "106af9e2f715e2d828df706c386a685698f3223b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "SenchoPens",
+        "repo": "fromYaml",
+        "type": "github"
+      }
+    },
+    "gallery": {
+      "inputs": {
+        "nixpkgs": [
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1748253770,
+        "narHash": "sha256-/X42Pj/eDJx/a/Ws80WIew2N4VeiYzmQUHPrNFax/LM=",
+        "ref": "refs/heads/main",
+        "rev": "16e272e436a7343fa9a7e3b69ce58999cd868ec5",
+        "revCount": 42,
+        "type": "git",
+        "url": "https://git.zaphyra.eu/gallery"
+      },
+      "original": {
+        "type": "git",
+        "url": "https://git.zaphyra.eu/gallery"
+      }
+    },
     "git-hooks": {
       "inputs": {
         "flake-compat": [

@@ -310,11 +703,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1742649964,
-        "narHash": "sha256-DwOTp7nvfi8mRfuL1escHDXabVXFGT1VlPD1JHrtrco=",
+        "lastModified": 1763319842,
+        "narHash": "sha256-YG19IyrTdnVn0l3DvcUYm85u3PaqBt6tI6VvolcuHnA=",
         "owner": "cachix",
         "repo": "git-hooks.nix",
-        "rev": "dcf5072734cb576d2b0c59b2ac44f5050b5eac82",
+        "rev": "7275fa67fbbb75891c16d9dee7d88e58aea2d761",
         "type": "github"
       },
       "original": {

@@ -336,11 +729,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1758108966,
-        "narHash": "sha256-ytw7ROXaWZ7OfwHrQ9xvjpUWeGVm86pwnEd1QhzawIo=",
+        "lastModified": 1763988335,
+        "narHash": "sha256-QlcnByMc8KBjpU37rbq5iP7Cp97HvjRP0ucfdh+M4Qc=",
         "owner": "cachix",
         "repo": "git-hooks.nix",
-        "rev": "54df955a695a84cd47d4a43e08e1feaf90b1fd9b",
+        "rev": "50b9238891e388c9fdc6a5c49e49c42533a1b5ce",
         "type": "github"
       },
       "original": {

@@ -415,6 +808,44 @@
         "type": "github"
       }
     },
+    "gnome-shell": {
+      "flake": false,
+      "locked": {
+        "host": "gitlab.gnome.org",
+        "lastModified": 1762869044,
+        "narHash": "sha256-nwm/GJ2Syigf7VccLAZ66mFC8mZJFqpJmIxSGKl7+Ds=",
+        "owner": "GNOME",
+        "repo": "gnome-shell",
+        "rev": "680e3d195a92203f28d4bf8c6e8bb537cc3ed4ad",
+        "type": "gitlab"
+      },
+      "original": {
+        "host": "gitlab.gnome.org",
+        "owner": "GNOME",
+        "ref": "gnome-49",
+        "repo": "gnome-shell",
+        "type": "gitlab"
+      }
+    },
+    "gnome-shell_2": {
+      "flake": false,
+      "locked": {
+        "host": "gitlab.gnome.org",
+        "lastModified": 1762869044,
+        "narHash": "sha256-nwm/GJ2Syigf7VccLAZ66mFC8mZJFqpJmIxSGKl7+Ds=",
+        "owner": "GNOME",
+        "repo": "gnome-shell",
+        "rev": "680e3d195a92203f28d4bf8c6e8bb537cc3ed4ad",
+        "type": "gitlab"
+      },
+      "original": {
+        "host": "gitlab.gnome.org",
+        "owner": "GNOME",
+        "ref": "gnome-49",
+        "repo": "gnome-shell",
+        "type": "gitlab"
+      }
+    },
     "gpxMap": {
       "inputs": {
         "nixpkgs": [

@@ -483,16 +914,16 @@
         ]
       },
       "locked": {
-        "lastModified": 1758463745,
-        "narHash": "sha256-uhzsV0Q0I9j2y/rfweWeGif5AWe0MGrgZ/3TjpDYdGA=",
+        "lastModified": 1764398914,
+        "narHash": "sha256-YPrpwlVQidzQlMh0OnquaJR+58rKe9YNnuRis293Ilo=",
         "owner": "nix-community",
         "repo": "home-manager",
-        "rev": "3b955f5f0a942f9f60cdc9cacb7844335d0f21c3",
+        "rev": "d0c5fdc48db6f19471b8adc954eca09194e68036",
         "type": "github"
       },
       "original": {
         "owner": "nix-community",
-        "ref": "release-25.05",
+        "ref": "release-25.11",
         "repo": "home-manager",
         "type": "github"
       }

@@ -504,11 +935,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1760312644,
-        "narHash": "sha256-U9SkK45314urw9P7MmjhEgiQwwD/BTj+T3HTuz1JU1Q=",
+        "lastModified": 1764361670,
+        "narHash": "sha256-jgWzgpIaHbL3USIq0gihZeuy1lLf2YSfwvWEwnfAJUw=",
         "owner": "nix-community",
         "repo": "home-manager",
-        "rev": "e121f3773fa596ecaba5b22e518936a632d72a90",
+        "rev": "780be8ef503a28939cf9dc7996b48ffb1a3e04c6",
         "type": "github"
       },
       "original": {

@@ -520,17 +951,17 @@
     },
     "iio-niri": {
       "inputs": {
-        "flake-parts": "flake-parts",
+        "flake-parts": "flake-parts_2",
         "nixpkgs": [
           "nixpkgs"
         ]
       },
       "locked": {
-        "lastModified": 1762776966,
-        "narHash": "sha256-VX1pdkF+GuC80CiX/Xqaa7QRzn9vhKwNr7rDLxuNi5o=",
+        "lastModified": 1764340398,
+        "narHash": "sha256-Sl/JqcKN7Mnc7aAeMQQbSjFyUHhvkg+Yx/scr9DB4M8=",
         "owner": "Zhaith-Izaliel",
         "repo": "iio-niri",
-        "rev": "d120e334939934ad24ddebf81a74a16ea0d515e3",
+        "rev": "6b287806c44830a9c517817c9cf9f6d07a953aea",
         "type": "github"
       },
       "original": {

@@ -556,7 +987,7 @@
     },
     "lanzaboote": {
       "inputs": {
-        "crane": "crane",
+        "crane": "crane_2",
         "flake-compat": [
           "flakeCompat"
         ],

@@ -666,11 +1097,11 @@
     "niri-unstable": {
       "flake": false,
       "locked": {
-        "lastModified": 1759395653,
-        "narHash": "sha256-sv9J1z6CrTPf9lRJLyCN90fZVdQz7LFeX7pIlInH8BQ=",
+        "lastModified": 1764399944,
+        "narHash": "sha256-FC9eYtSmplgxllCX4/3hJq5J3sXWKLSc7at8ZUxycVw=",
         "owner": "YaLTeR",
         "repo": "niri",
-        "rev": "ba6e5e082a79901dc89b0d49c5da1b769d652aec",
+        "rev": "b35bcae35b3f9665043c335e55ed5828af77db85",
         "type": "github"
       },
       "original": {

@@ -693,11 +1124,11 @@
         "xwayland-satellite-unstable": "xwayland-satellite-unstable"
       },
       "locked": {
-        "lastModified": 1760328462,
-        "narHash": "sha256-LAmGgkv25DFSmYyIbcAMGGqKb8ZpFIpsoD5HqtpFPFo=",
+        "lastModified": 1764405884,
+        "narHash": "sha256-TnvBRPmcpcyinvLgsitHS7w5soSa6yNBfRYEI2TK1Ts=",
         "owner": "sodiboo",
         "repo": "niri-flake",
-        "rev": "d8ed6b75d4ff881bf04c805964fd6362c2282ecb",
+        "rev": "10aae4855ee275f7d80d85f4328c24265fb20f1f",
         "type": "github"
       },
       "original": {

@@ -738,11 +1169,11 @@
     },
     "nixos-hardware": {
       "locked": {
-        "lastModified": 1760106635,
-        "narHash": "sha256-2GoxVaKWTHBxRoeUYSjv0AfSOx4qw5CWSFz2b+VolKU=",
+        "lastModified": 1764328224,
+        "narHash": "sha256-hFyF1XQd+XrRx7WZCrGJp544dykexD8Q5SrJJZpEQYg=",
         "owner": "NixOS",
         "repo": "nixos-hardware",
-        "rev": "9ed85f8afebf2b7478f25db0a98d0e782c0ed903",
+        "rev": "d62603a997438e19182af69d3ce7be07565ecad4",
         "type": "github"
       },
       "original": {

@@ -753,20 +1184,50 @@
     },
     "nixpkgs": {
       "locked": {
-        "lastModified": 1760139962,
-        "narHash": "sha256-4xggC56Rub3WInz5eD7EZWXuLXpNvJiUPahGtMkwtuc=",
+        "lastModified": 1764338033,
+        "narHash": "sha256-1LNGcU+aTbATD3BPCf7U1KsP1CjCH+ZWqM6JH0sZ6Q0=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "7e297ddff44a3cc93673bb38d0374df8d0ad73e4",
+        "rev": "ba9b83e5fb4b552a423d24dabe5ccb47a9c89901",
         "type": "github"
       },
       "original": {
         "owner": "NixOS",
-        "ref": "nixos-25.05",
+        "ref": "nixos-25.11",
         "repo": "nixpkgs",
         "type": "github"
       }
     },
+    "nixpkgs-lib": {
+      "locked": {
+        "lastModified": 1754788789,
+        "narHash": "sha256-x2rJ+Ovzq0sCMpgfgGaaqgBSwY+LST+WbZ6TytnT9Rk=",
+        "owner": "nix-community",
+        "repo": "nixpkgs.lib",
+        "rev": "a73b9c743612e4244d865a2fdee11865283c04e6",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixpkgs.lib",
+        "type": "github"
+      }
+    },
+    "nixpkgs-lib_2": {
+      "locked": {
+        "lastModified": 1743296961,
+        "narHash": "sha256-b1EdN3cULCqtorQ4QeWgLMrd5ZGOjLSLemfa00heasc=",
+        "owner": "nix-community",
+        "repo": "nixpkgs.lib",
+        "rev": "e4822aea2a6d1cdd36653c134cacfd64c97ff4fa",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "nixpkgs.lib",
+        "type": "github"
+      }
+    },
     "nixpkgs-stable": {
       "locked": {
         "lastModified": 1730741070,

@@ -801,11 +1262,11 @@
     },
     "nixpkgsUnstable": {
       "locked": {
-        "lastModified": 1760256791,
-        "narHash": "sha256-uTpzDHRASEDeFUuToWSQ46Re8beXyG9dx4W36FQa0/c=",
+        "lastModified": 1764384123,
+        "narHash": "sha256-UoliURDJFaOolycBZYrjzd9Cc66zULEyHqGFH3QHEq0=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "832e3b6db48508ae436c2c7bfc0cf914eac6938e",
+        "rev": "59b6c96beacc898566c9be1052ae806f3835f87d",
         "type": "github"
       },
       "original": {

@@ -815,6 +1276,56 @@
         "type": "github"
       }
     },
+    "nur": {
+      "inputs": {
+        "flake-parts": [
+          "stylix",
+          "flake-parts"
+        ],
+        "nixpkgs": [
+          "stylix",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1758998580,
+        "narHash": "sha256-VLx0z396gDCGSiowLMFz5XRO/XuNV+4EnDYjdJhHvUk=",
+        "owner": "nix-community",
+        "repo": "NUR",
+        "rev": "ba8d9c98f5f4630bcb0e815ab456afd90c930728",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "NUR",
+        "type": "github"
+      }
+    },
+    "nur_2": {
+      "inputs": {
+        "flake-parts": [
+          "stylixUnstable",
+          "flake-parts"
+        ],
+        "nixpkgs": [
+          "stylixUnstable",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1758998580,
+        "narHash": "sha256-VLx0z396gDCGSiowLMFz5XRO/XuNV+4EnDYjdJhHvUk=",
+        "owner": "nix-community",
+        "repo": "NUR",
+        "rev": "ba8d9c98f5f4630bcb0e815ab456afd90c930728",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "NUR",
+        "type": "github"
+      }
+    },
     "oeffisearch": {
       "inputs": {
         "nixpkgs": [

@@ -822,11 +1333,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1761067929,
-        "narHash": "sha256-OqVNtf2+cD9hvyjOaVUfMd3KvjknSXSAP0Z9Vp3c0zM=",
+        "lastModified": 1764603204,
+        "narHash": "sha256-VlCvPIdNGTwKJUCZdbVLct4dooGGfvDyzWjDeMwii7s=",
         "ref": "refs/heads/main",
-        "rev": "522a1f16f969c9c2457f6fc97374d8e47759470f",
-        "revCount": 295,
+        "rev": "6448693a2f30a9f5fa5423737c4cff05122daa53",
+        "revCount": 306,
         "type": "git",
         "url": "https://git.zaphyra.eu/oeffisearch"
       },

@@ -865,6 +1376,7 @@
     "root": {
       "inputs": {
         "airpodsctl": "airpodsctl",
+        "continuwuity": "continuwuity",
         "deploy-rs": "deploy-rs",
         "disko": "disko",
         "diskoUnstable": "diskoUnstable",

@@ -875,6 +1387,7 @@
         "flakeUtils": "flakeUtils",
         "flakeyProfile": "flakeyProfile",
         "flauschehornSexy": "flauschehornSexy",
+        "gallery": "gallery",
         "gpxMap": "gpxMap",
         "haumea": "haumea",
         "homeManager": "homeManager",

@@ -896,11 +1409,30 @@
         "simpleNixosMailserverUnstable": "simpleNixosMailserverUnstable",
         "sopsNix": "sopsNix",
         "stagit": "stagit",
+        "stylix": "stylix",
+        "stylixUnstable": "stylixUnstable",
         "tgcNUR": "tgcNUR",
         "things": "things",
         "zaphyraWebsite": "zaphyraWebsite"
       }
     },
+    "rust-analyzer-src": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1761077270,
+        "narHash": "sha256-O1uTuvI/rUlubJ8AXKyzh1WSWV3qCZX0huTFUvWLN4E=",
+        "owner": "rust-lang",
+        "repo": "rust-analyzer",
+        "rev": "39990a923c8bca38f5bd29dc4c96e20ee7808d5d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "rust-lang",
+        "ref": "nightly",
+        "repo": "rust-analyzer",
+        "type": "github"
+      }
+    },
     "rust-overlay": {
       "inputs": {
         "nixpkgs": [

@@ -945,7 +1477,7 @@
     },
     "sherlock": {
       "inputs": {
-        "crane": "crane_2",
+        "crane": "crane_3",
         "flake-parts": [
           "flakeParts"
         ],

@@ -978,23 +1510,20 @@
         ],
         "git-hooks": "git-hooks",
         "nixpkgs": [
-          "nixpkgsUnstable"
-        ],
-        "nixpkgs-25_05": [
           "nixpkgs"
         ]
       },
       "locked": {
-        "lastModified": 1755110674,
-        "narHash": "sha256-PigqTAGkdBYXVFWsJnqcirrLeFqRFN4PFigLA8FzxeI=",
+        "lastModified": 1764185122,
+        "narHash": "sha256-+HUOwSIFLoyett2cvRjuFIbhobpHallfP9J2cia1apo=",
         "owner": "simple-nixos-mailserver",
         "repo": "nixos-mailserver",
-        "rev": "f5936247dbdb8501221978562ab0b302dd75456c",
+        "rev": "a14fe3b293ec2720e5b7fc72ad136d22967e12ba",
         "type": "gitlab"
       },
       "original": {
         "owner": "simple-nixos-mailserver",
-        "ref": "nixos-25.05",
+        "ref": "nixos-25.11",
         "repo": "nixos-mailserver",
         "type": "gitlab"
       }

@@ -1008,17 +1537,14 @@
         "git-hooks": "git-hooks_2",
         "nixpkgs": [
           "nixpkgsUnstable"
-        ],
-        "nixpkgs-25_05": [
-          "nixpkgs"
         ]
       },
       "locked": {
-        "lastModified": 1759489698,
-        "narHash": "sha256-2lT2i5ha23I2vrolEaBaAS/63ChgZPh181Awt6q1bDY=",
+        "lastModified": 1764381008,
+        "narHash": "sha256-s+/BuhPPSJHpPRcylqfW+3UFyYsHjAhKdtPSxusYn0U=",
         "owner": "simple-nixos-mailserver",
         "repo": "nixos-mailserver",
-        "rev": "6005d88bed7a5418f9772b4058a73cd0fd1e69a1",
+        "rev": "76bd7a85e78a9b8295782a9cf719ec3489d8eb55",
         "type": "gitlab"
       },
       "original": {

@@ -1034,11 +1560,11 @@
         ]
       },
       "locked": {
-        "lastModified": 1760240450,
-        "narHash": "sha256-sa9bS9jSyc4vH0jSWrUsPGdqtMvDwmkLg971ntWOo2U=",
+        "lastModified": 1764021963,
+        "narHash": "sha256-1m84V2ROwNEbqeS9t37/mkry23GBhfMt8qb6aHHmjuc=",
         "owner": "Mic92",
         "repo": "sops-nix",
-        "rev": "41fd1f7570c89f645ee0ada0be4e2d3c4b169549",
+        "rev": "c482a1c1bbe030be6688ed7dc84f7213f304f1ec",
         "type": "github"
       },
       "original": {

@@ -1067,6 +1593,105 @@
         "url": "https://git.zaphyra.eu/stagit"
       }
     },
+    "stylix": {
+      "inputs": {
+        "base16": "base16",
+        "base16-fish": "base16-fish",
+        "base16-helix": "base16-helix",
+        "base16-vim": "base16-vim",
+        "firefox-gnome-theme": "firefox-gnome-theme",
+        "flake-parts": "flake-parts_3",
+        "gnome-shell": "gnome-shell",
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "nur": "nur",
+        "systems": "systems",
+        "tinted-foot": "tinted-foot",
+        "tinted-kitty": "tinted-kitty",
+        "tinted-schemes": "tinted-schemes",
+        "tinted-tmux": "tinted-tmux",
+        "tinted-zed": "tinted-zed"
+      },
+      "locked": {
+        "lastModified": 1764193603,
+        "narHash": "sha256-guX30TWe8HRG2qPFiM9893F2uTw4B8D/xkE6Mq7MiYg=",
+        "owner": "nix-community",
+        "repo": "stylix",
+        "rev": "9bf8725a3d65b3ff0ba68ce13779657f5095e36b",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "ref": "release-25.11",
+        "repo": "stylix",
+        "type": "github"
+      }
+    },
+    "stylixUnstable": {
+      "inputs": {
+        "base16": "base16_2",
+        "base16-fish": "base16-fish_2",
+        "base16-helix": "base16-helix_2",
+        "base16-vim": "base16-vim_2",
+        "firefox-gnome-theme": "firefox-gnome-theme_2",
+        "flake-parts": "flake-parts_4",
+        "gnome-shell": "gnome-shell_2",
+        "nixpkgs": [
+          "nixpkgsUnstable"
+        ],
+        "nur": "nur_2",
+        "systems": "systems_2",
+        "tinted-foot": "tinted-foot_2",
+        "tinted-kitty": "tinted-kitty_2",
+        "tinted-schemes": "tinted-schemes_2",
+        "tinted-tmux": "tinted-tmux_2",
+        "tinted-zed": "tinted-zed_2"
+      },
+      "locked": {
+        "lastModified": 1764254063,
+        "narHash": "sha256-V22JzkaTLF/GAL2LgqvOsJhAr8JbJsKaD8hnHjGwXfE=",
+        "owner": "nix-community",
+        "repo": "stylix",
+        "rev": "a1451bc40413870f0c7b576b751c1ca92055e323",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-community",
+        "repo": "stylix",
+        "type": "github"
+      }
+    },
+    "systems": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
+    },
+    "systems_2": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
+    },
     "tgcNUR": {
       "inputs": {
         "emacs-overlay": "emacs-overlay",

@@ -1078,16 +1703,17 @@
         ]
       },
       "locked": {
-        "dirtyRev": "6f0863f22b74ea5207a90879a98331632ad33437-dirty",
-        "dirtyShortRev": "6f0863f-dirty",
-        "lastModified": 1757583366,
-        "narHash": "sha256-7kcjri4H6o8NPt2NDUkZ7rqi5qCQ2H0gpX+spn+xQtA=",
+        "lastModified": 1762640116,
+        "narHash": "sha256-OlvxMNUVVLTGENgxulk2gp16Lq92dXfwYitOB6skuzk=",
+        "ref": "refs/heads/main",
+        "rev": "3c5fbbb5cb9c4cc4698216a566bc4db62d0ecdfc",
+        "revCount": 71,
         "type": "git",
-        "url": "file:///home/zaphyra/proj/tgc-nix-user-repository"
+        "url": "https://git.transgirl.cafe/zaphyra/tgc-nix-user-repository"
       },
       "original": {
         "type": "git",
-        "url": "file:///home/zaphyra/proj/tgc-nix-user-repository"
+        "url": "https://git.transgirl.cafe/zaphyra/tgc-nix-user-repository"
       }
     },
     "things": {

@@ -1110,6 +1736,189 @@
         "url": "https://git.zaphyra.eu/things"
       }
     },
+    "tinted-foot": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1726913040,
+        "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=",
+        "owner": "tinted-theming",
+        "repo": "tinted-foot",
+        "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "tinted-foot",
+        "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
+        "type": "github"
+      }
+    },
+    "tinted-foot_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1726913040,
+        "narHash": "sha256-+eDZPkw7efMNUf3/Pv0EmsidqdwNJ1TaOum6k7lngDQ=",
+        "owner": "tinted-theming",
+        "repo": "tinted-foot",
+        "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "tinted-foot",
+        "rev": "fd1b924b6c45c3e4465e8a849e67ea82933fcbe4",
+        "type": "github"
+      }
+    },
+    "tinted-kitty": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1735730497,
+        "narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=",
+        "owner": "tinted-theming",
+        "repo": "tinted-kitty",
+        "rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "tinted-kitty",
+        "type": "github"
+      }
+    },
+    "tinted-kitty_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1735730497,
+        "narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=",
+        "owner": "tinted-theming",
+        "repo": "tinted-kitty",
+        "rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "tinted-kitty",
+        "type": "github"
+      }
+    },
+    "tinted-schemes": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1757716333,
+        "narHash": "sha256-d4km8W7w2zCUEmPAPUoLk1NlYrGODuVa3P7St+UrqkM=",
+        "owner": "tinted-theming",
+        "repo": "schemes",
+        "rev": "317a5e10c35825a6c905d912e480dfe8e71c7559",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "schemes",
+        "type": "github"
+      }
+    },
+    "tinted-schemes_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1757716333,
+        "narHash": "sha256-d4km8W7w2zCUEmPAPUoLk1NlYrGODuVa3P7St+UrqkM=",
+        "owner": "tinted-theming",
+        "repo": "schemes",
+        "rev": "317a5e10c35825a6c905d912e480dfe8e71c7559",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "schemes",
+        "type": "github"
+      }
+    },
+    "tinted-tmux": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1757811970,
+        "narHash": "sha256-n5ZJgmzGZXOD9pZdAl1OnBu3PIqD+X3vEBUGbTi4JiI=",
+        "owner": "tinted-theming",
+        "repo": "tinted-tmux",
+        "rev": "d217ba31c846006e9e0ae70775b0ee0f00aa6b1e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "tinted-tmux",
+        "type": "github"
+      }
+    },
+    "tinted-tmux_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1757811970,
+        "narHash": "sha256-n5ZJgmzGZXOD9pZdAl1OnBu3PIqD+X3vEBUGbTi4JiI=",
+        "owner": "tinted-theming",
+        "repo": "tinted-tmux",
+        "rev": "d217ba31c846006e9e0ae70775b0ee0f00aa6b1e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "tinted-tmux",
+        "type": "github"
+      }
+    },
+    "tinted-zed": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1757811247,
+        "narHash": "sha256-4EFOUyLj85NRL3OacHoLGEo0wjiRJzfsXtR4CZWAn6w=",
+        "owner": "tinted-theming",
+        "repo": "base16-zed",
+        "rev": "824fe0aacf82b3c26690d14e8d2cedd56e18404e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "base16-zed",
+        "type": "github"
+      }
+    },
+    "tinted-zed_2": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1757811247,
+        "narHash": "sha256-4EFOUyLj85NRL3OacHoLGEo0wjiRJzfsXtR4CZWAn6w=",
+        "owner": "tinted-theming",
+        "repo": "base16-zed",
+        "rev": "824fe0aacf82b3c26690d14e8d2cedd56e18404e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "tinted-theming",
+        "repo": "base16-zed",
+        "type": "github"
+      }
+    },
+    "treefmt-nix": {
+      "inputs": {
+        "nixpkgs": [
+          "continuwuity",
+          "nixpkgs"
+        ]
+      },
+      "locked": {
+        "lastModified": 1760945191,
+        "narHash": "sha256-ZRVs8UqikBa4Ki3X4KCnMBtBW0ux1DaT35tgsnB1jM4=",
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "rev": "f56b1934f5f8fcab8deb5d38d42fd692632b47c2",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "treefmt-nix",
+        "type": "github"
+      }
+    },
     "xwayland-satellite-stable": {
       "flake": false,
       "locked": {

@@ -1130,11 +1939,11 @@
     "xwayland-satellite-unstable": {
       "flake": false,
       "locked": {
-        "lastModified": 1759707084,
-        "narHash": "sha256-0pkftKs6/LReNvxw7DVTN2AJEheZVgyeK0Aarbagi70=",
+        "lastModified": 1764366786,
+        "narHash": "sha256-yVCJ4Qe/JkdKDu0DddFdAQgDQVeF12nxH7zv3jtooV4=",
         "owner": "Supreeeme",
         "repo": "xwayland-satellite",
-        "rev": "a9188e70bd748118b4d56a529871b9de5adb9988",
+        "rev": "b362a3873710a42f7ac2d8ba03772d8290733934",
         "type": "github"
       },
       "original": {
diff --git a/flake.nix b/flake.nix
@@ -2,15 +2,6 @@
 
   description = "A flake for building our infra";
 
-  # nixConfig = {
-  #   extra-substituters = [
-  #     "http://lucorum.int.eukaryote.eu:5000"
-  #   ];
-  #   extra-trusted-public-keys = [
-  #     "1.hydra.neverstable.net:WgtNg0z0FB7wuWp9nU4gKZpbkW0ug59NlhNp81X7GX0="
-  #   ];
-  # };
-
   outputs =
     inputs:
     let

@@ -59,6 +50,7 @@
         inputs.things.overlays.default
         inputs.mqttWebUI.overlays.default
         inputs.airpodsctl.overlays.default
+        inputs.gallery.overlays.default
         inputs.iio-niri.overlays.default
         inputs.tgcNUR.overlays.default
         inputs.tgcNUR.overlays.nixpkgsUnstable

@@ -227,7 +219,7 @@
     flakeParts.inputs.nixpkgs-lib.follows = "nixpkgs";
 
     # nixpkgs
-    nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05";
+    nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
     nixpkgsUnstable.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
 
     nixos-hardware.url = "github:NixOS/nixos-hardware";

@@ -244,7 +236,7 @@
     sopsNix.url = "github:Mic92/sops-nix";
     sopsNix.inputs.nixpkgs.follows = "nixpkgs";
 
-    stylix.url = "github:nix-community/stylix/release-25.05";
+    stylix.url = "github:nix-community/stylix/release-25.11";
     stylix.inputs.nixpkgs.follows = "nixpkgs";
 
     stylixUnstable.url = "github:nix-community/stylix";

@@ -256,21 +248,19 @@
     diskoUnstable.url = "github:nix-community/disko";
     diskoUnstable.inputs.nixpkgs.follows = "nixpkgsUnstable";
 
-    simpleNixosMailserver.url = "gitlab:simple-nixos-mailserver/nixos-mailserver/nixos-25.05";
+    simpleNixosMailserver.url = "gitlab:simple-nixos-mailserver/nixos-mailserver/nixos-25.11";
     simpleNixosMailserver.inputs = {
-      nixpkgs.follows = "nixpkgsUnstable";
-      nixpkgs-25_05.follows = "nixpkgs";
+      nixpkgs.follows = "nixpkgs";
       flake-compat.follows = "flakeCompat";
     };
 
     simpleNixosMailserverUnstable.url = "gitlab:simple-nixos-mailserver/nixos-mailserver";
     simpleNixosMailserverUnstable.inputs = {
       nixpkgs.follows = "nixpkgsUnstable";
-      nixpkgs-25_05.follows = "nixpkgs";
       flake-compat.follows = "flakeCompat";
     };
 
-    homeManager.url = "github:nix-community/home-manager/release-25.05";
+    homeManager.url = "github:nix-community/home-manager/release-25.11";
     homeManager.inputs.nixpkgs.follows = "nixpkgs";
 
     homeManagerUnstable.url = "github:nix-community/home-manager/master";

@@ -300,6 +290,9 @@
     iio-niri.url = "github:Zhaith-Izaliel/iio-niri";
     iio-niri.inputs.nixpkgs.follows = "nixpkgs";
 
+    continuwuity.url = "git+https://forgejo.ellis.link/continuwuation/continuwuity";
+    continuwuity.inputs.nixpkgs.follows = "nixpkgs";
+
     sherlock.url = "github:Skxxtz/sherlock/8485f8720352c8ba48a4d74d3d33c882f9c0b35b";
     sherlock.inputs = {
       nixpkgs.follows = "nixpkgs";

@@ -307,6 +300,7 @@
     };
 
     tgcNUR.url = "git+https://git.transgirl.cafe/zaphyra/tgc-nix-user-repository";
+    #tgcNUR.url = "git+file:///home/zaphyra/proj/tgc-nix-user-repository";
     tgcNUR.inputs = {
       nixpkgs.follows = "nixpkgs";
       nixpkgsUnstable.follows = "nixpkgsUnstable";

@@ -318,6 +312,9 @@
     stagit.url = "git+https://git.zaphyra.eu/stagit";
     stagit.inputs.nixpkgs.follows = "nixpkgs";
 
+    gallery.url = "git+https://git.zaphyra.eu/gallery";
+    gallery.inputs.nixpkgs.follows = "nixpkgs";
+
     flauschehornSexy.url = "git+https://git.zaphyra.eu/flauschehorn.sexy";
     flauschehornSexy.inputs.nixpkgs.follows = "nixpkgs";
 
diff --git a/hosts/haueri/default.nix b/hosts/haueri/default.nix
@@ -1,5 +1,4 @@
 {
-
   system = "x86_64-linux";
   nixpkgsStable = true;
 

@@ -26,16 +25,20 @@
     }:
     {
 
-      specialisation.gnome.configuration = {
-        modules.presets.graphical.type = lib.mkForce "gnomeMinimal";
-      };
+      # specialisation.gnome.configuration = {
+      #   modules.presets.graphical.type = lib.mkForce "gnomeMinimal";
+      # };
 
       boot.initrd.systemd.emergencyAccess = true;
-      # boot.loader.efi.canTouchEfiVariables = true;
+      boot.kernelParams = [
+        "i915.force_probe=!7dd5"
+        "xe.force_probe=7dd5"
+      ];
 
       sops.secrets."environments/networkManagerProfiles/cccdaWifi" = { };
 
       modules = {
+        boot.secureboot = false;
         filesystem = {
           impermanence.system.enable = true;
           impermanence.home.enable = true;
diff --git a/hosts/huntii/default.nix b/hosts/huntii/default.nix
@@ -26,12 +26,21 @@
     }:
     {
 
+      imports = [ ./thinkmorse.nix ];
+
+      services.thinkmorse = {
+        enable = true;
+        message = "the void is cute!";
+        devices = [ "tpacpi::lid_logo_dot" ];
+        speed = "0.3";
+      };
+
       specialisation.gnome.configuration = {
         modules.presets.graphical.type = lib.mkForce "gnomeMinimal";
       };
 
       boot.initrd.systemd.emergencyAccess = true;
-      boot.kernel.sysctl."power.pm_async" = false;
+      # boot.kernel.sysctl."power.pm_async" = false;
 
       sops.secrets."environments/networkManagerProfiles/cccdaWifi" = { };
 

@@ -133,6 +142,27 @@
           publish.enable = true;
           publish.userServices = true;
         };
+        keyd.keyboards.huntii = {
+          ids = [
+            "0001:0001:70533846"
+            "099a:0500:44f31567"
+          ];
+          settings = {
+            main = {
+              "leftcontrol" = "leftalt";
+              "leftalt" = "leftcontrol";
+              "rightalt" = "rightcontrol";
+              "rightcontrol" = "rightalt";
+              #"rightalt" = "rightcontrol";
+              #"sysrq" = "rightalt";
+              #"rightcontrol" = "sysrq";
+              "s+d" = "oneshot(shift)";
+              "f+j" = "space";
+              "j+k" = "backspace";
+              "k+l" = "enter";
+            };
+          };
+        };
         gnome.at-spi2-core.enable = false;
         pipewire.raopOpenFirewall = true;
       };
diff --git a/hosts/pratorum/default.nix b/hosts/pratorum/default.nix
@@ -178,6 +178,7 @@
           "music.zaphyra.dn42".enable = true;
           "continuwuity-migration.zaphyra.eu".enable = true;
 
+          "photos.zaphyra.eu".enable = true;
           "ente.zaphyra.eu".enable = true;
 
           #old fedi-instance
diff --git a/secrets/morio.yaml b/secrets/morio.yaml
@@ -15,7 +15,7 @@ resticPasswords:
     vaultwarden: ENC[AES256_GCM,data:MmXXWit37MC4dpJG1654IpxfRdw0b+2mpfu7K80ZTRQ=,iv:4wRi3ovrLrzCkUjiGpEpWWPSDkHUdpI82joofhoIP8U=,tag:zgTTK+h/vqLmxCNNtfrxwg==,type:str]
     things: ENC[AES256_GCM,data:9jjtqiUHwtCJKF1Mfg5bNZQhGHDFNZlAm04umn0SqnM=,iv:5sx+9tOTX/GHk7KwEZo1r4vJVX8LTe7clNsjxIhRAYw=,tag:D5b7/H4CWCCnAmTPPyCMyg==,type:str]
 knotKeys: ENC[AES256_GCM,data:jilIpC4cs1Dl738Nh4QM9kwzPz14Pof17vnOVf3Vsp+oFjXIQWRPBz28LtsLPfkMSOvM4DAucbsyWF900J3fWbA2XoxS1Py+AdRkfmzno8k5tJfdZU+hogWokvbfhKgRGk6UBSFFuCAvuV5r3lLXtmSuDWO/wRBQHskiK/j3ZnjlenardP9rH2vIDHqwuEdtzEfaU8Ax3GxAZRpDj0pZVoC6Gp3+F1U1rDLTlBeCJLFIosxz6BoTWOXv6GMyMTsSb6gJYa3cIsuO2DmSCoI5wKyk4cJDONA1jh5I/BljKu/y9KmAqmlXqGS1h5XDR2Za+GUQzVmLBqSuTt7yL0ISG6TvrYIlwAn1iTQSv6VnE06bZZWDnv1HRyR8cIpot9wjowDz2T1hnRfhS+YOzGf72JKYLvRIw1xrReSA2L3aIo9iZWjsryVZV/EdAFu0AA0JdSAn17D4uLsr8UTOHcATtefePRr1rcYusI13nPME0jgsfzWiTaNJ+P/DDiyR+p0CsW3w8rU8WoeYn07GRpusNmc0xtyRUyZIqcPhu9FEmYFElUHzXuKFva3J+x1jDukqR9Fr0EjNL/SBffZUt+5ODDjgFS3GQIPm2nq/98bnWFJnvNbCijtQDxZtu+mxO4EKiboO2orJyJFJ9GxoV6zv0BOiOkPnWAELUelESsXZDfsdmE2VxfTtkg9DTkhiEANY1W/kaeMD+EhbEGpAvxr66BZMuhkQtO9D1/chKbrU4JHtuICSnXuJ6EhxJ+Orfn6oFfK/CTUvKIfyEBxXOhqyJc07w7rwcI8aJy4F5VFIY2MzMrm1Ha3cQbHapoUk3iBO6fUxSs7oAH0Cy+//PEycgsthn4tfNuINX8t0VLGw1cRCcKvSQVT5L8Xd6BF8VWvY3Cs294hZVxv1hoV4c4vAc0aYH/OXsUVmTAY1U1qzejnk+GxBg4b3zopLqtk0lIfRuB2hbUFeFvCRYCwpyhSuOjiBAtXEoo3jpbhI1u8BSCZ9R7xNVRimV9FixnLEvTyqJzNCid2e6uZJPiPvFwzSU8C6KQZAlTCD2XAiFXA/SifhOcoXzFISdkTd98LLmuBMqU9ZYppQUY/eMzYYj2ciWqVQXl4h5zx3Ou33Se8J3p7JnOgvFnE0dl4ST9fyAOxjVUXO57w1NnSHA06Go/HlySrBc5pZSsjOUUo9ov4C+c9E55V99qp5Tfi/G5HdxY5Y06We7rKkfpeO6yhNZsadm9n2phr7ROQF53lqMdyZVOcmdMa/SjkHi7eluoRvKtzTQbXs9Uf9HY331c0FM9iW+LzM6MlPP+Npvkb5KBzhGpZjG09fSDYVo2bRRyL4MpdglTW+dALCFNd7TmZ2MjPuA/Ee/Ik6Y6Wjdk/Dtt036NnOFDfeBww4PnVCF09Pijid6iQn2LfH9UI78UP3xY6m9drhbKIy6hDqNKhTzDD/ooLpr8ofScs6H/fzWs+sKXtaLmdEfhI1QG5C2y7HuCmrVh0JUpf6pXg694LyBCqwR3Q25Mk0Ve9lDZHpn55BYff+bfwhaknOq3IcdP7/mh5JftBAbKbN0GFjrAtlEISY3HnEQewr1Bn6jF32/F+iks/8rSC0f42xpyPEoceu6urnfbQVc2P87p5v1jYFwjKC1RRaEFg9I3U+b4o7/mmLuIblFnMIULG4mirOrw/S+8FqHAM3osuD0hNQL5WORwRU352i12jOKNRIiERBmk8fE00OR5x0Y3ywdvmnAIpbw20MXLO2wbU1JBIj+dnmrHMWL82DkM/irqN4fk2zir6yrftgZJU4Ja3NBa/ro3MPRsvONfeWT8hbjyReKvrrPV1x9TOPmRtwc1BbQfa60P2DEecVMwbc+kOMSTWgC990rfFsvQyFSLcCK42tDibchX0ZUwx1WLBA2onZ+L2epiiH2ChX8NEMqsBsabPPk/P568V7EQTOUi3lMsMMR1y4fQ/vMS1BJDb4rVjVgkdyY33G4d4TZk9l8xbsQNrF17s+ltY=,iv:QunWkACa8csdZYKevo+jjIK24kHdXRBVH3cS4LMiyZE=,tag:6s2YOd9P/YYP6NlkYVIXBA==,type:str]
-radicaleUsers: ENC[AES256_GCM,data:lsVr2x3jZJY8nqJnIEXcd9qNyQsVF4OvcFUwUa+hdlXyACafN7wtDYuc6lvNp7eD6eMz3AD7BO9A6X5SVLQ6bMxUQ8hJYpm0+VeBQSTFFMDdXcVRbad5ymtS3D5sG3v20rlzrLC6tQCkrY7uyKdSKSBCEVcY1BDQMea9uRDi3bRRpiQC8Vz/frxhDnAiVGWtWTOb12KBJPs83STF+IOdZoEZuoKFzuzuhIUekuyEl/l+k/SbXAYA15q+4xK59lbMrJE=,iv:exwd7GdQrYCOFBIi6urDBC3xERo7I1YATN1e/38BIa0=,tag:CtkpxDz5kuU/6/nWEYB23A==,type:str]
+radicaleUsers: ENC[AES256_GCM,data:leYVthpb+8z8ecqZPWeE5N2vqKFOjbo06dBWxY1HYU4Oo6Nhvykh4cauhqwyA2MmZAQ6Zv5CKKd5DXjKUjjy4zY7zdYqmLBuqEXWQWc2r6+nuQQhW+xzvD2x3uCMUR2NExDljK37wii+lKc2abpysMa0ppbLvSUlIhrpkbQi5TtTbe7zygLDgsxlCVuw7FK3yoljRJENDxyPPtUnUljILAOB2UIFYrehU7IGmVOZQHNXqL/GE29BeRy0NMb1VzlVpBNkNTAohpNSqxHljflPlu45y3AzPKPzwHhvBcQiwcWXO4ftfYGL5g7If30c8bbMxbLNgejKTyM95mTzUwlthJNx8jnKpq91iC9hby5YEOeK3uutjAM2Frtwgw==,iv:4+R2IFdub3v1qktHFPYZT7skCZ7m7lKPuWcXtH5tl48=,tag:scIpgzsaCJR9feivF/MCtQ==,type:str]
 gotosocialEnv: ENC[AES256_GCM,data:5hvURqX+EqN8zpjirBmh5TIWWgaCga9QxnAfyW1rwOXELnM9ZBJAmqwLdxUa2j2DGrXsqw==,iv:nhVyiAoOJY0HtjB13FnmnQyLB+BWSRwDVrwUiFHBrE4=,tag:P207zPou7yXJKJBf+pxlHg==,type:str]
 environments:
     vaultwarden: ENC[AES256_GCM,data:uKc/1bnfXcxcUyBrvi5eYXpikmJna6hav0P0x4mopMY4VE6vGp/pSyqWXDzdjBYgV69/O2vqbfS4o61B+OjAS/ssYVyLvVHR3CJ+FCZmgA0zjO52C+TcVFYggxKUtcCVgBuNIzIqZ4lRE5T4I8V8WO6czQtmnBqvu27GY94sjyRUdG7hIySRVRbyhyCPFEYh9PKWUBEcdQf3P9dk9O3KKEG7TrngSm6yJtG0H7hc2M+4/xu8r7+j05AI5y2gs1oFN7QZqqSZ4Es4bUUn/SUXaeHnNCG/fr718fBKmvQuwrHjIfHwnxADA6HfklASKwRYm5EfWSW4RcCLKekFFfdR5O3mhQJR/mis46MdFUlhXvMJWQk=,iv:LnxnMS+xqlQuUQ88h9Etzk5IfpZenW/nOfWLYzABl0E=,tag:t10UUaatvmvZD/WEB0eL6g==,type:str]

@@ -36,8 +36,8 @@ sops:
             Ym5kdER1cTdYM09ydEgwUUlhQ3lXUEEKVjdcjjDXUhmpszI5i3NsjrsF6XRHf1a6
             qzqyN7FQTuwy23N9PBdJMTe7aAcw12vbvuY2v7UfmNzxkvggaDXJ0Q==
             -----END AGE ENCRYPTED FILE-----
-    lastmodified: "2025-10-22T15:59:42Z"
-    mac: ENC[AES256_GCM,data:bvzk8vqZe4KJm5Pzwx2ojWl2ciU0EWFLvYDxniqoHpUovQz/Jwl9CE6jBNsAlA9pj86w35WaR6HDkPQQiMIssiQLKbEA5LYDs9YMndk2UpPKYJgj97RITf26sUL5F1q/zlNdisDsIzArVzsey7hlhK/UKhJJ4bIV+Ch4Atch/EI=,iv:7pUqMVDcy/cae8fJzZBCzzgllIwiBSEVHe2O9aA4vDs=,tag:f8X/yBzNckrxnIoWEZj2Mg==,type:str]
+    lastmodified: "2025-12-01T16:25:34Z"
+    mac: ENC[AES256_GCM,data:2gURtNypBWVjb/c4KmdJeLScMl6YYPZHymNnGYRn8n7+3klgZCZeaYBJA/jSdi5vVglZYj2u4zAZX4DkR5th2R+falOxrxHhtMKqSKePBi2EOlo6RpsRzBEKSYQZfev8vib7WyJ/9cPYCKxwQZU0QAIq2BeV2OSUmpBE9+2U5OA=,iv:kQr+t8EGlPqWyoqDp6idntFSldXzHp/43a+vK9oDa0I=,tag:7KwUNlqqmmHTXsjSyWtQ+Q==,type:str]
     pgp:
         - created_at: "2025-06-16T13:06:52Z"
           enc: |-

@@ -51,4 +51,4 @@ sops:
             -----END PGP MESSAGE-----
           fp: BFE6386C8D66BCD4DAE14FC895F0FE7CD7E6A022
     unencrypted_suffix: _unencrypted
-    version: 3.10.2
+    version: 3.11.0