From 827217da51fa55eda69f4c405e88e9c365f05a32 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Felix=20Schr=C3=B6ter?= <dev@felschr.com>
Date: Mon, 28 Apr 2025 17:02:09 +0200
Subject: [PATCH] feat: expose home-manager configurations

---
 flake.nix              |  8 +---
 home/flake-module.nix  | 55 +++++++++++++++++++++++++
 hosts/flake-module.nix | 21 +++++-----
 lib/createUser.nix     | 91 +++++++++++++++++++++---------------------
 lib/flake-module.nix   | 15 +++----
 5 files changed, 117 insertions(+), 73 deletions(-)
 create mode 100644 home/flake-module.nix

diff --git a/flake.nix b/flake.nix
index 4219e6d..fd02c7a 100644
--- a/flake.nix
+++ b/flake.nix
@@ -103,6 +103,7 @@ rec {
         ./pkgs/flake-module.nix
         ./lib/flake-module.nix
         ./hosts/flake-module.nix
+        ./home/flake-module.nix
         ./overlays.nix
       ];
       flake = {
@@ -113,13 +114,6 @@ rec {
           systemdNotify = import ./modules/systemdNotify.nix;
           inadyn = import ./modules/inadyn.nix;
         };
-
-        homeManagerModules = {
-          git = import ./home/modules/git.nix;
-          firefox = import ./home/modules/firefox/firefox.nix;
-          tor-browser = import ./home/modules/firefox/tor-browser.nix;
-          mullvad-browser = import ./home/modules/firefox/mullvad-browser.nix;
-        };
       };
       perSystem =
         {
diff --git a/home/flake-module.nix b/home/flake-module.nix
new file mode 100644
index 0000000..6722451
--- /dev/null
+++ b/home/flake-module.nix
@@ -0,0 +1,55 @@
+{
+  self,
+  inputs,
+  pkgs,
+  ...
+}:
+
+let
+  createHomeConfig =
+    name: args:
+    inputs.home-manager.lib.homeManagerConfiguration (
+      {
+        inherit pkgs;
+        extraSpecialArgs = { inherit inputs; };
+      }
+      // args
+    );
+in
+{
+  flake = {
+    homeModules = {
+      git = import ./modules/git.nix;
+      firefox = import ./modules/firefox/firefox.nix;
+      tor-browser = import ./modules/firefox/tor-browser.nix;
+      mullvad-browser = import ./modules/firefox/mullvad-browser.nix;
+
+      # users
+      felschr = import ./felschr.nix;
+      felschr-server = import ./felschr-server.nix;
+      felschr-work = import ./felschr-work.nix;
+    };
+    homeConfigurations = {
+      felschr = createHomeConfig {
+        modules = [
+          self.homeModules.git
+          self.homeModules.felschr
+        ];
+      };
+      felschr-server = createHomeConfig {
+        modules = [
+          self.homeModules.git
+          self.homeModules.felschr-server
+        ];
+      };
+      felschr-work = createHomeConfig {
+        modules = [
+          self.homeModules.git
+          self.homeModules.felschr-work
+        ];
+      };
+    };
+    # HINT alias for deprecated output
+    homeManagerModules = self.homeModules;
+  };
+}
diff --git a/hosts/flake-module.nix b/hosts/flake-module.nix
index 1a4387f..218e42f 100644
--- a/hosts/flake-module.nix
+++ b/hosts/flake-module.nix
@@ -10,12 +10,13 @@
           inputs.nixos-hardware.nixosModules.common-pc-ssd
           inputs.nixos-hardware.nixosModules.common-cpu-amd-pstate
           inputs.nixos-hardware.nixosModules.common-gpu-amd
-          (self.lib.createSystem "home-pc" {
+          (self.lib.createSystemModule "home-pc" {
             hardwareConfig = ../hardware/home-pc.nix;
             config = ../hosts/home-pc.nix;
           })
           self.lib.createMediaGroup
-          (self.lib.createUser "felschr" {
+          (self.lib.createUserModule "felschr" {
+            homeModule = self.homeModules.felschr;
             user.extraGroups = [
               "wheel"
               "networkmanager"
@@ -26,8 +27,6 @@
               "gamemode"
               "media"
             ];
-            modules = [ self.homeManagerModules.git ];
-            config = ../home/felschr.nix;
             usesContainers = true;
           })
           (
@@ -48,18 +47,17 @@
           inputs.nixos-hardware.nixosModules.common-pc
           inputs.nixos-hardware.nixosModules.common-pc-ssd
           inputs.nixos-hardware.nixosModules.common-cpu-intel
-          (self.lib.createSystem "pilot1" {
+          (self.lib.createSystemModule "pilot1" {
             hardwareConfig = ../hardware/pilot1.nix;
             config = ../hosts/work-pc.nix;
           })
-          (self.lib.createUser "felschr" {
+          (self.lib.createUserModule "felschr" {
+            homeModule = self.homeModules.felschr-work;
             user.extraGroups = [
               "wheel"
               "audio"
               "disk"
             ];
-            modules = [ self.homeManagerModules.git ];
-            config = ../home/felschr-work.nix;
             usesContainers = true;
           })
         ];
@@ -76,12 +74,13 @@
           inputs.nixos-hardware.nixosModules.common-cpu-intel
           inputs.nixos-hardware.nixosModules.common-gpu-intel-kaby-lake
           inputs.matrix-appservices.nixosModule
-          (self.lib.createSystem "home-server" {
+          (self.lib.createSystemModule "home-server" {
             hardwareConfig = ../hardware/lattepanda.nix;
             config = ../hosts/home-server.nix;
           })
           self.lib.createMediaGroup
-          (self.lib.createUser "felschr" {
+          (self.lib.createUserModule "felschr" {
+            homeModule = self.homeModules.felschr-server;
             user = {
               extraGroups = [
                 "wheel"
@@ -93,8 +92,6 @@
                 "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP751vlJUnB7Pfe1KNr6weWkx/rkP4J3lTYpAekHdOgV"
               ];
             };
-            modules = [ self.homeManagerModules.git ];
-            config = ../home/felschr-server.nix;
           })
         ];
         specialArgs = {
diff --git a/lib/createUser.nix b/lib/createUser.nix
index ada8dcc..56f68d3 100644
--- a/lib/createUser.nix
+++ b/lib/createUser.nix
@@ -1,52 +1,53 @@
-name:
-{
-  user ? { },
-  hm ? { },
-  modules ? [ ],
-  config,
-  usesContainers ? false,
-  ...
-}:
+{ self, ... }:
 
 {
-  inputs,
-  pkgs,
-  lib,
-  home-manager,
-  ...
-}:
-{
-  imports = [ home-manager.nixosModules.home-manager ];
+  flake.lib.createUserModule =
+    name:
+    {
+      homeModule,
+      user ? { },
+      usesContainers ? false,
+      ...
+    }:
+    {
+      inputs,
+      pkgs,
+      lib,
+      ...
+    }:
+    {
+      imports = [ inputs.home-manager.nixosModules.home-manager ];
 
-  users.users."${name}" = {
-    isNormalUser = true;
-    shell = pkgs.zsh;
+      users.users."${name}" = {
+        isNormalUser = true;
+        shell = pkgs.zsh;
 
-    # increase sub{u,g}id range for container user namespaces
-    subUidRanges = lib.optionals usesContainers [
-      {
-        startUid = 100000;
-        count = 60000000;
-      }
-    ];
-    subGidRanges = lib.optionals usesContainers [
-      {
-        startGid = 100000;
-        count = 60000000;
-      }
-    ];
-  } // user;
+        # increase sub{u,g}id range for container user namespaces
+        subUidRanges = lib.optionals usesContainers [
+          {
+            startUid = 100000;
+            count = 60000000;
+          }
+        ];
+        subGidRanges = lib.optionals usesContainers [
+          {
+            startGid = 100000;
+            count = 60000000;
+          }
+        ];
+      } // user;
 
-  home-manager = {
-    useUserPackages = true;
-    useGlobalPkgs = true;
-    backupFileExtension = "backup";
-    users."${name}" = lib.mkMerge [
-      { imports = modules; }
-      (import config)
-    ];
-    extraSpecialArgs = {
-      inherit inputs;
+      home-manager = {
+        useGlobalPkgs = true;
+        useUserPackages = true;
+        backupFileExtension = "backup";
+        users."${name}" = {
+          imports = [
+            self.homeModules.git
+            homeModule
+          ];
+        };
+        extraSpecialArgs = { inherit inputs; };
+      };
     };
-  } // hm;
 }
diff --git a/lib/flake-module.nix b/lib/flake-module.nix
index 9a1cb3f..843786a 100644
--- a/lib/flake-module.nix
+++ b/lib/flake-module.nix
@@ -1,13 +1,13 @@
-{ inputs, lib, ... }:
+{ lib, ... }:
 
-let
-  createUser' = import ./createUser.nix;
-in
 {
-  imports = [ ./openwrt.nix ];
+  imports = [
+    ./createUser.nix
+    ./openwrt.nix
+  ];
   options.flake.lib = lib.mkOption { type = with lib.types; lazyAttrsOf raw; };
   config.flake.lib = {
-    createSystem =
+    createSystemModule =
       hostName:
       { hardwareConfig, config }:
       (
@@ -22,9 +22,6 @@ in
           ];
         }
       );
-    createUser =
-      name: args:
-      ({ pkgs, ... }@args2: (createUser' name args) ({ inherit (inputs) home-manager; } // args2));
     createMediaGroup = _: { users.groups.media.gid = 600; };
   };
 }