From 9782272a76149745df7a68b98f020139629198e8 Mon Sep 17 00:00:00 2001
From: Oliver Davies <oliver@oliverdavies.dev>
Date: Tue, 26 Nov 2024 08:40:00 +0000
Subject: [PATCH] Group modules into feature directories

---
 nix/home/opdavies/default.nix                 |  6 ---
 nix/home/opdavies/hosts/lemp11.nix            | 12 +++++-
 nix/hosts/lemp11/configuration.nix            |  4 --
 nix/hosts/lemp11/default.nix                  | 12 ++++++
 nix/modules/home-manager/default.nix          | 40 ++-----------------
 .../home-manager/{ => features/cli}/bat.nix   |  0
 .../home-manager/{ => features/cli}/bin.nix   |  0
 .../{ => features/cli}/bluetuith.nix          |  0
 .../home-manager/features/cli/default.nix     | 37 +++++++++++++++++
 .../{ => features/cli}/direnv.nix             |  0
 .../home-manager/{ => features/cli}/fzf.nix   |  0
 .../home-manager/{ => features/cli}/git.nix   |  0
 .../home-manager/{ => features/cli}/htop.nix  |  0
 .../home-manager/{ => features/cli}/lsd.nix   |  0
 .../{ => features/cli}/neovim.nix             |  0
 .../home-manager/{ => features/cli}/pet.nix   |  0
 .../{ => features/cli}/phpactor.nix           |  0
 .../{ => features/cli}/ripgrep.nix            |  0
 .../{ => features/cli}/starship.nix           |  0
 .../{ => features/cli}/syncthing.nix          |  0
 .../home-manager/{ => features/cli}/tmux.nix  |  0
 .../home-manager/{ => features/cli}/zsh.nix   |  0
 .../{ => features/cli}/zsh/abbreviations.zsh  |  0
 .../{ => features/cli}/zsh/aliases.nix        |  0
 .../{ => features/desktop}/alacritty.nix      |  0
 .../{ => features/desktop}/copyq.nix          |  0
 .../home-manager/features/desktop/default.nix | 13 ++++++
 .../home-manager/features/desktop/discord.nix | 14 +++++++
 .../{ => features/desktop}/espanso.nix        |  0
 .../desktop}/espanso/matches/base.nix         |  0
 .../{ => features/desktop}/flameshot.nix      |  0
 .../{ => features/desktop}/gtk.nix            |  0
 .../features/desktop/media/default.nix        |  8 ++++
 .../features/desktop/media/gimp.nix           | 14 +++++++
 .../features/desktop/media/kdenlive.nix       | 14 +++++++
 .../{ => features/desktop/media}/mpv.nix      |  4 +-
 .../features/desktop/media/pocket-casts.nix   | 14 +++++++
 .../home-manager/features/desktop/slack.nix   | 14 +++++++
 .../home-manager/features/desktop/zoom.nix    | 14 +++++++
 nix/modules/nixos/default.nix                 |  5 +--
 nix/modules/nixos/features/gaming.nix         | 16 ++++++++
 .../nixos/features/homelab/default.nix        |  7 ++++
 nix/modules/nixos/features/homelab/gitea.nix  | 21 ++++++++++
 nix/modules/nixos/features/homelab/immich.nix | 16 ++++++++
 .../nixos/features/homelab/jellyfin.nix       | 12 ++++++
 nix/modules/nixos/gitea.nix                   | 17 --------
 nix/modules/nixos/immich.nix                  |  7 ----
 nix/modules/nixos/jellyfin.nix                |  6 ---
 nix/modules/nixos/steam.nix                   |  0
 49 files changed, 244 insertions(+), 83 deletions(-)
 rename nix/modules/home-manager/{ => features/cli}/bat.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/bin.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/bluetuith.nix (100%)
 create mode 100644 nix/modules/home-manager/features/cli/default.nix
 rename nix/modules/home-manager/{ => features/cli}/direnv.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/fzf.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/git.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/htop.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/lsd.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/neovim.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/pet.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/phpactor.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/ripgrep.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/starship.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/syncthing.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/tmux.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/zsh.nix (100%)
 rename nix/modules/home-manager/{ => features/cli}/zsh/abbreviations.zsh (100%)
 rename nix/modules/home-manager/{ => features/cli}/zsh/aliases.nix (100%)
 rename nix/modules/home-manager/{ => features/desktop}/alacritty.nix (100%)
 rename nix/modules/home-manager/{ => features/desktop}/copyq.nix (100%)
 create mode 100644 nix/modules/home-manager/features/desktop/default.nix
 create mode 100644 nix/modules/home-manager/features/desktop/discord.nix
 rename nix/modules/home-manager/{ => features/desktop}/espanso.nix (100%)
 rename nix/modules/home-manager/{ => features/desktop}/espanso/matches/base.nix (100%)
 rename nix/modules/home-manager/{ => features/desktop}/flameshot.nix (100%)
 rename nix/modules/home-manager/{ => features/desktop}/gtk.nix (100%)
 create mode 100644 nix/modules/home-manager/features/desktop/media/default.nix
 create mode 100644 nix/modules/home-manager/features/desktop/media/gimp.nix
 create mode 100644 nix/modules/home-manager/features/desktop/media/kdenlive.nix
 rename nix/modules/home-manager/{ => features/desktop/media}/mpv.nix (61%)
 create mode 100644 nix/modules/home-manager/features/desktop/media/pocket-casts.nix
 create mode 100644 nix/modules/home-manager/features/desktop/slack.nix
 create mode 100644 nix/modules/home-manager/features/desktop/zoom.nix
 create mode 100644 nix/modules/nixos/features/gaming.nix
 create mode 100644 nix/modules/nixos/features/homelab/default.nix
 create mode 100644 nix/modules/nixos/features/homelab/gitea.nix
 create mode 100644 nix/modules/nixos/features/homelab/immich.nix
 create mode 100644 nix/modules/nixos/features/homelab/jellyfin.nix
 delete mode 100644 nix/modules/nixos/gitea.nix
 delete mode 100644 nix/modules/nixos/immich.nix
 delete mode 100644 nix/modules/nixos/jellyfin.nix
 delete mode 100644 nix/modules/nixos/steam.nix

diff --git a/nix/home/opdavies/default.nix b/nix/home/opdavies/default.nix
index c76fa348..b846b753 100644
--- a/nix/home/opdavies/default.nix
+++ b/nix/home/opdavies/default.nix
@@ -61,11 +61,8 @@ in
       [
         brave
         build-glove80
-        discord
-        gimp
         gscan2pdf
         handbrake
-        kdenlive
         meslo-lg
         obs-studio
         okular
@@ -74,11 +71,8 @@ in
         pavucontrol
         pinentry
         via
-        pocket-casts
         xcape
         xsel
-
-        pkgs.nixpkgs-2405.zoom-us
       ]
     );
 
diff --git a/nix/home/opdavies/hosts/lemp11.nix b/nix/home/opdavies/hosts/lemp11.nix
index f71044bf..93870f6f 100644
--- a/nix/home/opdavies/hosts/lemp11.nix
+++ b/nix/home/opdavies/hosts/lemp11.nix
@@ -9,10 +9,20 @@
 
     desktop = {
       copyq.enable = true;
+      discord.enable = true;
       espanso.enable = true;
       flameshot.enable = true;
       gtk.enable = true;
-      mpv.enable = true;
+      slack.enable = true;
+
+      media = {
+        gimp.enable = true;
+        kdenlive.enable = true;
+        pocket-casts.enable = true;
+        mpv.enable = true;
+      };
+
+      zoom.enable = true;
     };
   };
 }
diff --git a/nix/hosts/lemp11/configuration.nix b/nix/hosts/lemp11/configuration.nix
index 47cfbb2a..5d95b080 100644
--- a/nix/hosts/lemp11/configuration.nix
+++ b/nix/hosts/lemp11/configuration.nix
@@ -195,14 +195,10 @@
       rclone
       rclone-browser
       shotwell
-      slack
       vscode
       xfce.thunar
       xfce.thunar-volman
       xfce.tumbler
-
-      # Games.
-      zeroad
     ];
 
   # Some programs need SUID wrappers, can be configured further or are
diff --git a/nix/hosts/lemp11/default.nix b/nix/hosts/lemp11/default.nix
index f56e1f9e..c35679f4 100644
--- a/nix/hosts/lemp11/default.nix
+++ b/nix/hosts/lemp11/default.nix
@@ -1,3 +1,15 @@
 {
+  features = {
+    desktop = {
+      gaming.enable = true;
+
+      homelab = {
+        gitea.enable = true;
+        immich.enable = true;
+        jellyfin.enable = true;
+      };
+    };
+  };
+
   imports = [ ./configuration.nix ];
 }
diff --git a/nix/modules/home-manager/default.nix b/nix/modules/home-manager/default.nix
index d3e5d8a7..9f44b44b 100644
--- a/nix/modules/home-manager/default.nix
+++ b/nix/modules/home-manager/default.nix
@@ -1,42 +1,8 @@
-{
-  config,
-  inputs,
-  lib,
-  pkgs,
-  ...
-}:
+{ ... }:
 
 {
   imports = [
-    (import ./neovim.nix {
-      inherit
-        config
-        inputs
-        lib
-        pkgs
-        ;
-    })
-
-    ./alacritty.nix
-    ./bat.nix
-    ./bin.nix
-    ./bluetuith.nix
-    ./copyq.nix
-    ./direnv.nix
-    ./espanso.nix
-    ./flameshot.nix
-    ./fzf.nix
-    ./git.nix
-    ./gtk.nix
-    ./htop.nix
-    ./lsd.nix
-    ./mpv.nix
-    ./pet.nix
-    ./phpactor.nix
-    ./ripgrep.nix
-    ./starship.nix
-    ./syncthing.nix
-    ./tmux.nix
-    ./zsh.nix
+    ./features/cli
+    ./features/desktop
   ];
 }
diff --git a/nix/modules/home-manager/bat.nix b/nix/modules/home-manager/features/cli/bat.nix
similarity index 100%
rename from nix/modules/home-manager/bat.nix
rename to nix/modules/home-manager/features/cli/bat.nix
diff --git a/nix/modules/home-manager/bin.nix b/nix/modules/home-manager/features/cli/bin.nix
similarity index 100%
rename from nix/modules/home-manager/bin.nix
rename to nix/modules/home-manager/features/cli/bin.nix
diff --git a/nix/modules/home-manager/bluetuith.nix b/nix/modules/home-manager/features/cli/bluetuith.nix
similarity index 100%
rename from nix/modules/home-manager/bluetuith.nix
rename to nix/modules/home-manager/features/cli/bluetuith.nix
diff --git a/nix/modules/home-manager/features/cli/default.nix b/nix/modules/home-manager/features/cli/default.nix
new file mode 100644
index 00000000..75604cf0
--- /dev/null
+++ b/nix/modules/home-manager/features/cli/default.nix
@@ -0,0 +1,37 @@
+{
+  config,
+  inputs,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+  imports = [
+    # (import ./neovim.nix {
+    #   inherit
+    #     config
+    #     inputs
+    #     lib
+    #     pkgs
+    #     ;
+    # })
+
+    ./bat.nix
+    ./bin.nix
+    ./bluetuith.nix
+    ./direnv.nix
+    ./fzf.nix
+    ./git.nix
+    ./htop.nix
+    ./lsd.nix
+    ./neovim.nix
+    ./pet.nix
+    ./phpactor.nix
+    ./ripgrep.nix
+    ./starship.nix
+    ./syncthing.nix
+    ./tmux.nix
+    ./zsh.nix
+  ];
+}
diff --git a/nix/modules/home-manager/direnv.nix b/nix/modules/home-manager/features/cli/direnv.nix
similarity index 100%
rename from nix/modules/home-manager/direnv.nix
rename to nix/modules/home-manager/features/cli/direnv.nix
diff --git a/nix/modules/home-manager/fzf.nix b/nix/modules/home-manager/features/cli/fzf.nix
similarity index 100%
rename from nix/modules/home-manager/fzf.nix
rename to nix/modules/home-manager/features/cli/fzf.nix
diff --git a/nix/modules/home-manager/git.nix b/nix/modules/home-manager/features/cli/git.nix
similarity index 100%
rename from nix/modules/home-manager/git.nix
rename to nix/modules/home-manager/features/cli/git.nix
diff --git a/nix/modules/home-manager/htop.nix b/nix/modules/home-manager/features/cli/htop.nix
similarity index 100%
rename from nix/modules/home-manager/htop.nix
rename to nix/modules/home-manager/features/cli/htop.nix
diff --git a/nix/modules/home-manager/lsd.nix b/nix/modules/home-manager/features/cli/lsd.nix
similarity index 100%
rename from nix/modules/home-manager/lsd.nix
rename to nix/modules/home-manager/features/cli/lsd.nix
diff --git a/nix/modules/home-manager/neovim.nix b/nix/modules/home-manager/features/cli/neovim.nix
similarity index 100%
rename from nix/modules/home-manager/neovim.nix
rename to nix/modules/home-manager/features/cli/neovim.nix
diff --git a/nix/modules/home-manager/pet.nix b/nix/modules/home-manager/features/cli/pet.nix
similarity index 100%
rename from nix/modules/home-manager/pet.nix
rename to nix/modules/home-manager/features/cli/pet.nix
diff --git a/nix/modules/home-manager/phpactor.nix b/nix/modules/home-manager/features/cli/phpactor.nix
similarity index 100%
rename from nix/modules/home-manager/phpactor.nix
rename to nix/modules/home-manager/features/cli/phpactor.nix
diff --git a/nix/modules/home-manager/ripgrep.nix b/nix/modules/home-manager/features/cli/ripgrep.nix
similarity index 100%
rename from nix/modules/home-manager/ripgrep.nix
rename to nix/modules/home-manager/features/cli/ripgrep.nix
diff --git a/nix/modules/home-manager/starship.nix b/nix/modules/home-manager/features/cli/starship.nix
similarity index 100%
rename from nix/modules/home-manager/starship.nix
rename to nix/modules/home-manager/features/cli/starship.nix
diff --git a/nix/modules/home-manager/syncthing.nix b/nix/modules/home-manager/features/cli/syncthing.nix
similarity index 100%
rename from nix/modules/home-manager/syncthing.nix
rename to nix/modules/home-manager/features/cli/syncthing.nix
diff --git a/nix/modules/home-manager/tmux.nix b/nix/modules/home-manager/features/cli/tmux.nix
similarity index 100%
rename from nix/modules/home-manager/tmux.nix
rename to nix/modules/home-manager/features/cli/tmux.nix
diff --git a/nix/modules/home-manager/zsh.nix b/nix/modules/home-manager/features/cli/zsh.nix
similarity index 100%
rename from nix/modules/home-manager/zsh.nix
rename to nix/modules/home-manager/features/cli/zsh.nix
diff --git a/nix/modules/home-manager/zsh/abbreviations.zsh b/nix/modules/home-manager/features/cli/zsh/abbreviations.zsh
similarity index 100%
rename from nix/modules/home-manager/zsh/abbreviations.zsh
rename to nix/modules/home-manager/features/cli/zsh/abbreviations.zsh
diff --git a/nix/modules/home-manager/zsh/aliases.nix b/nix/modules/home-manager/features/cli/zsh/aliases.nix
similarity index 100%
rename from nix/modules/home-manager/zsh/aliases.nix
rename to nix/modules/home-manager/features/cli/zsh/aliases.nix
diff --git a/nix/modules/home-manager/alacritty.nix b/nix/modules/home-manager/features/desktop/alacritty.nix
similarity index 100%
rename from nix/modules/home-manager/alacritty.nix
rename to nix/modules/home-manager/features/desktop/alacritty.nix
diff --git a/nix/modules/home-manager/copyq.nix b/nix/modules/home-manager/features/desktop/copyq.nix
similarity index 100%
rename from nix/modules/home-manager/copyq.nix
rename to nix/modules/home-manager/features/desktop/copyq.nix
diff --git a/nix/modules/home-manager/features/desktop/default.nix b/nix/modules/home-manager/features/desktop/default.nix
new file mode 100644
index 00000000..243d22d0
--- /dev/null
+++ b/nix/modules/home-manager/features/desktop/default.nix
@@ -0,0 +1,13 @@
+{
+  imports = [
+    ./alacritty.nix
+    ./copyq.nix
+    ./discord.nix
+    ./espanso.nix
+    ./flameshot.nix
+    ./gtk.nix
+    ./media
+    ./slack.nix
+    ./zoom.nix
+  ];
+}
diff --git a/nix/modules/home-manager/features/desktop/discord.nix b/nix/modules/home-manager/features/desktop/discord.nix
new file mode 100644
index 00000000..5fed5daa
--- /dev/null
+++ b/nix/modules/home-manager/features/desktop/discord.nix
@@ -0,0 +1,14 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+  options.features.desktop.discord.enable = lib.mkEnableOption "Enable Discord";
+
+  config = lib.mkIf config.features.desktop.discord.enable {
+    home.packages = with pkgs; [ discord ];
+  };
+}
diff --git a/nix/modules/home-manager/espanso.nix b/nix/modules/home-manager/features/desktop/espanso.nix
similarity index 100%
rename from nix/modules/home-manager/espanso.nix
rename to nix/modules/home-manager/features/desktop/espanso.nix
diff --git a/nix/modules/home-manager/espanso/matches/base.nix b/nix/modules/home-manager/features/desktop/espanso/matches/base.nix
similarity index 100%
rename from nix/modules/home-manager/espanso/matches/base.nix
rename to nix/modules/home-manager/features/desktop/espanso/matches/base.nix
diff --git a/nix/modules/home-manager/flameshot.nix b/nix/modules/home-manager/features/desktop/flameshot.nix
similarity index 100%
rename from nix/modules/home-manager/flameshot.nix
rename to nix/modules/home-manager/features/desktop/flameshot.nix
diff --git a/nix/modules/home-manager/gtk.nix b/nix/modules/home-manager/features/desktop/gtk.nix
similarity index 100%
rename from nix/modules/home-manager/gtk.nix
rename to nix/modules/home-manager/features/desktop/gtk.nix
diff --git a/nix/modules/home-manager/features/desktop/media/default.nix b/nix/modules/home-manager/features/desktop/media/default.nix
new file mode 100644
index 00000000..0bd4055f
--- /dev/null
+++ b/nix/modules/home-manager/features/desktop/media/default.nix
@@ -0,0 +1,8 @@
+{
+  imports = [
+    ./gimp.nix
+    ./kdenlive.nix
+    ./mpv.nix
+    ./pocket-casts.nix
+  ];
+}
diff --git a/nix/modules/home-manager/features/desktop/media/gimp.nix b/nix/modules/home-manager/features/desktop/media/gimp.nix
new file mode 100644
index 00000000..8597aebb
--- /dev/null
+++ b/nix/modules/home-manager/features/desktop/media/gimp.nix
@@ -0,0 +1,14 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+  options.features.desktop.media.gimp.enable = lib.mkEnableOption "Enable gimp";
+
+  config = lib.mkIf config.features.desktop.media.gimp.enable {
+    home.packages = with pkgs; [ gimp ];
+  };
+}
diff --git a/nix/modules/home-manager/features/desktop/media/kdenlive.nix b/nix/modules/home-manager/features/desktop/media/kdenlive.nix
new file mode 100644
index 00000000..b6f7b21c
--- /dev/null
+++ b/nix/modules/home-manager/features/desktop/media/kdenlive.nix
@@ -0,0 +1,14 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+  options.features.desktop.media.kdenlive.enable = lib.mkEnableOption "Enable kdenlive";
+
+  config = lib.mkIf config.features.desktop.media.kdenlive.enable {
+    home.packages = with pkgs; [ kdenlive ];
+  };
+}
diff --git a/nix/modules/home-manager/mpv.nix b/nix/modules/home-manager/features/desktop/media/mpv.nix
similarity index 61%
rename from nix/modules/home-manager/mpv.nix
rename to nix/modules/home-manager/features/desktop/media/mpv.nix
index c0764ddd..f06a6e21 100644
--- a/nix/modules/home-manager/mpv.nix
+++ b/nix/modules/home-manager/features/desktop/media/mpv.nix
@@ -1,9 +1,9 @@
 { config, lib, ... }:
 
 {
-  options.features.desktop.mpv.enable = lib.mkEnableOption "Enable mpv media player";
+  options.features.desktop.media.mpv.enable = lib.mkEnableOption "Enable mpv media player";
 
-  config = lib.mkIf config.features.desktop.mpv.enable {
+  config = lib.mkIf config.features.desktop.media.mpv.enable {
     programs.mpv = {
       enable = true;
 
diff --git a/nix/modules/home-manager/features/desktop/media/pocket-casts.nix b/nix/modules/home-manager/features/desktop/media/pocket-casts.nix
new file mode 100644
index 00000000..6f088c43
--- /dev/null
+++ b/nix/modules/home-manager/features/desktop/media/pocket-casts.nix
@@ -0,0 +1,14 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+  options.features.desktop.media.pocket-casts.enable = lib.mkEnableOption "Enable Pocket Casts";
+
+  config = lib.mkIf config.features.desktop.media.pocket-casts.enable {
+    home.packages = with pkgs; [ pocket-casts ];
+  };
+}
diff --git a/nix/modules/home-manager/features/desktop/slack.nix b/nix/modules/home-manager/features/desktop/slack.nix
new file mode 100644
index 00000000..463a91e1
--- /dev/null
+++ b/nix/modules/home-manager/features/desktop/slack.nix
@@ -0,0 +1,14 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+  options.features.desktop.slack.enable = lib.mkEnableOption "Enable Slack";
+
+  config = lib.mkIf config.features.desktop.slack.enable {
+    home.packages = with pkgs; [ slack ];
+  };
+}
diff --git a/nix/modules/home-manager/features/desktop/zoom.nix b/nix/modules/home-manager/features/desktop/zoom.nix
new file mode 100644
index 00000000..d1a6c458
--- /dev/null
+++ b/nix/modules/home-manager/features/desktop/zoom.nix
@@ -0,0 +1,14 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+  options.features.desktop.zoom.enable = lib.mkEnableOption "Enable zoom";
+
+  config = lib.mkIf config.features.desktop.zoom.enable {
+    home.packages = with pkgs; [ nixpkgs-2405.zoom-us ];
+  };
+}
diff --git a/nix/modules/nixos/default.nix b/nix/modules/nixos/default.nix
index d2ecedd8..dfd00b70 100644
--- a/nix/modules/nixos/default.nix
+++ b/nix/modules/nixos/default.nix
@@ -2,11 +2,10 @@
   imports = [
     ./autorandr.nix
     ./docker.nix
+    ./features/gaming.nix
+    ./features/homelab
     ./fonts.nix
-    ./gitea.nix
     ./i3.nix
-    ./immich.nix
-    ./jellyfin.nix
     ./kanata.nix
     ./rofi.nix
     ./rsnapshot.nix
diff --git a/nix/modules/nixos/features/gaming.nix b/nix/modules/nixos/features/gaming.nix
new file mode 100644
index 00000000..d7dd0747
--- /dev/null
+++ b/nix/modules/nixos/features/gaming.nix
@@ -0,0 +1,16 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+  options.features.desktop.gaming.enable = lib.mkEnableOption "Enable games";
+
+  config = lib.mkIf config.features.desktop.gaming.enable {
+    programs.steam.enable = true;
+
+    environment.systemPackages = with pkgs; [ zeroad ];
+  };
+}
diff --git a/nix/modules/nixos/features/homelab/default.nix b/nix/modules/nixos/features/homelab/default.nix
new file mode 100644
index 00000000..d7742bab
--- /dev/null
+++ b/nix/modules/nixos/features/homelab/default.nix
@@ -0,0 +1,7 @@
+{
+  imports = [
+    ./gitea.nix
+    ./immich.nix
+    ./jellyfin.nix
+  ];
+}
diff --git a/nix/modules/nixos/features/homelab/gitea.nix b/nix/modules/nixos/features/homelab/gitea.nix
new file mode 100644
index 00000000..848ba836
--- /dev/null
+++ b/nix/modules/nixos/features/homelab/gitea.nix
@@ -0,0 +1,21 @@
+{ config, lib, ... }:
+
+{
+  options.features.desktop.homelab.gitea.enable = lib.mkEnableOption "Enable gitea";
+
+  config = lib.mkIf config.features.desktop.homelab.gitea.enable {
+    services.gitea = {
+      enable = true;
+
+      settings = {
+        server = {
+          HTTP_PORT = 2222;
+        };
+
+        service = {
+          DISABLE_REGISTRATION = true;
+        };
+      };
+    };
+  };
+}
diff --git a/nix/modules/nixos/features/homelab/immich.nix b/nix/modules/nixos/features/homelab/immich.nix
new file mode 100644
index 00000000..83f9d7f9
--- /dev/null
+++ b/nix/modules/nixos/features/homelab/immich.nix
@@ -0,0 +1,16 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+
+{
+  options.features.desktop.homelab.immich.enable = lib.mkEnableOption "Enable immich";
+
+  config = lib.mkIf config.features.desktop.homelab.immich.enable {
+    services.immich.enable = true;
+
+    environment.systemPackages = [ pkgs.immich-cli ];
+  };
+}
diff --git a/nix/modules/nixos/features/homelab/jellyfin.nix b/nix/modules/nixos/features/homelab/jellyfin.nix
new file mode 100644
index 00000000..8866d5f9
--- /dev/null
+++ b/nix/modules/nixos/features/homelab/jellyfin.nix
@@ -0,0 +1,12 @@
+{ config, lib, ... }:
+
+{
+  options.features.desktop.homelab.jellyfin.enable = lib.mkEnableOption "Enable jellyfin";
+
+  config = lib.mkIf config.features.desktop.homelab.jellyfin.enable {
+    services.jellyfin = {
+      enable = true;
+      openFirewall = true;
+    };
+  };
+}
diff --git a/nix/modules/nixos/gitea.nix b/nix/modules/nixos/gitea.nix
deleted file mode 100644
index b093e0f1..00000000
--- a/nix/modules/nixos/gitea.nix
+++ /dev/null
@@ -1,17 +0,0 @@
-{ pkgs, ... }:
-
-{
-  services.gitea = {
-    enable = true;
-
-    settings = {
-      server = {
-        HTTP_PORT = 2222;
-      };
-
-      service = {
-        DISABLE_REGISTRATION = true;
-      };
-    };
-  };
-}
diff --git a/nix/modules/nixos/immich.nix b/nix/modules/nixos/immich.nix
deleted file mode 100644
index 0a8cb46e..00000000
--- a/nix/modules/nixos/immich.nix
+++ /dev/null
@@ -1,7 +0,0 @@
-{ pkgs, ... }:
-
-{
-  services.immich.enable = true;
-
-  environment.systemPackages = [ pkgs.immich-cli ];
-}
diff --git a/nix/modules/nixos/jellyfin.nix b/nix/modules/nixos/jellyfin.nix
deleted file mode 100644
index 83798315..00000000
--- a/nix/modules/nixos/jellyfin.nix
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  services.jellyfin = {
-    enable = true;
-    openFirewall = true;
-  };
-}
diff --git a/nix/modules/nixos/steam.nix b/nix/modules/nixos/steam.nix
deleted file mode 100644
index e69de29b..00000000