diff --git a/flake.nix b/flake.nix
index e7a3933..c897492 100644
--- a/flake.nix
+++ b/flake.nix
@@ -75,12 +75,7 @@ rec {
   };
 
   outputs =
-    {
-      self,
-      nixpkgs,
-      nixpkgs-unstable,
-      ...
-    }@inputs:
+    inputs:
     inputs.flake-parts.lib.mkFlake { inherit inputs; } {
       systems = [
         "x86_64-linux"
@@ -91,7 +86,7 @@ rec {
         ./lib/flake-module.nix
         ./hosts/flake-module.nix
         ./home/flake-module.nix
-        ./overlays.nix
+        ./overlays/flake-module.nix
       ];
       flake = {
         inherit nixConfig;
@@ -110,11 +105,6 @@ rec {
           ...
         }:
         {
-          _module.args.pkgs = import nixpkgs {
-            inherit system;
-            config.allowUnfree = true;
-          };
-
           devShells.default = pkgs.mkShell { inherit (config.checks.pre-commit) shellHook; };
 
           checks = {
diff --git a/home/felschr-server.nix b/home/felschr-server.nix
index fbaeeb2..82c0de5 100644
--- a/home/felschr-server.nix
+++ b/home/felschr-server.nix
@@ -38,11 +38,5 @@
 
   programs.git.defaultProfile = "private";
 
-  xdg.configFile."nixpkgs/config.nix".text = ''
-    {
-      allowUnfree = true;
-    }
-  '';
-
   home.stateVersion = "25.05";
 }
diff --git a/home/felschr-work.nix b/home/felschr-work.nix
index db68ce4..43fd5e1 100644
--- a/home/felschr-work.nix
+++ b/home/felschr-work.nix
@@ -40,12 +40,6 @@ with pkgs;
     defaultProfile = "work";
   };
 
-  xdg.configFile."nixpkgs/config.nix".text = ''
-    {
-      allowUnfree = true;
-    }
-  '';
-
   home.packages = with pkgs; [
     fh
 
diff --git a/home/felschr.nix b/home/felschr.nix
index b9b43b2..49eb332 100644
--- a/home/felschr.nix
+++ b/home/felschr.nix
@@ -38,12 +38,6 @@
 
   programs.git.defaultProfile = "private";
 
-  xdg.configFile."nixpkgs/config.nix".text = ''
-    {
-      allowUnfree = true;
-    }
-  '';
-
   home.packages = with pkgs; [
     # system
     gparted
diff --git a/home/flake-module.nix b/home/flake-module.nix
index 763fe14..f6b54ac 100644
--- a/home/flake-module.nix
+++ b/home/flake-module.nix
@@ -1,26 +1,38 @@
 {
   self,
   inputs,
-  pkgs,
+  lib,
   ...
 }:
 
 let
-  createHomeConfig =
-    name: args:
-    inputs.home-manager.lib.homeManagerConfiguration (
-      {
-        inherit pkgs;
-        extraSpecialArgs = { inherit inputs; };
-      }
-      // args
-    );
+  mkHomeConfiguration =
+    {
+      user,
+      system,
+      modules,
+    }:
+    inputs.home-manager.lib.homeManagerConfiguration {
+      pkgs = self.pkgsFor system;
+      extraSpecialArgs = { inherit inputs; };
+
+      modules =
+        (with self.homeModules; [ nixpkgs ])
+        ++ [
+          {
+            home.username = user;
+            home.homeDirectory = "/home/${user}";
+          }
+        ]
+        ++ modules;
+    };
 in
 {
   imports = [ inputs.home-manager.flakeModules.home-manager ];
 
   flake = {
     homeModules = {
+      nixpkgs = import ./modules/nixpkgs.nix;
       git = import ./modules/git.nix;
       firefox = import ./modules/firefox/firefox.nix;
       tor-browser = import ./modules/firefox/tor-browser.nix;
@@ -32,26 +44,31 @@ in
       felschr-work = import ./felschr-work.nix;
     };
     homeConfigurations = {
-      felschr = createHomeConfig {
+      felschr = mkHomeConfiguration {
+        user = "felschr";
+        system = "x86_64-linux";
         modules = [
           self.homeModules.git
           self.homeModules.felschr
         ];
       };
-      felschr-server = createHomeConfig {
+      felschr-server = mkHomeConfiguration {
+        user = "felschr";
+        system = "x86_64-linux";
         modules = [
           self.homeModules.git
           self.homeModules.felschr-server
         ];
       };
-      felschr-work = createHomeConfig {
+      felschr-work = mkHomeConfiguration {
+        user = "felschr";
+        system = "x86_64-linux";
         modules = [
           self.homeModules.git
           self.homeModules.felschr-work
         ];
       };
     };
-    # HINT alias for deprecated output
-    homeManagerModules = self.homeModules;
+    homeManagerModules = lib.warn "`homeManagerModules` is deprecated. Use `homeModules` instead." self.homeModules;
   };
 }
diff --git a/home/modules/nixpkgs.nix b/home/modules/nixpkgs.nix
new file mode 100644
index 0000000..de2d9c2
--- /dev/null
+++ b/home/modules/nixpkgs.nix
@@ -0,0 +1,11 @@
+_:
+
+{
+  nixpkgs.config.allowUnfree = true;
+
+  xdg.configFile."nixpkgs/config.nix".text = ''
+    {
+      allowUnfree = true;
+    }
+  '';
+}
diff --git a/hosts/home-pc/default.nix b/hosts/home-pc/default.nix
index 7ff949f..2a26cfd 100644
--- a/hosts/home-pc/default.nix
+++ b/hosts/home-pc/default.nix
@@ -22,8 +22,6 @@
     ../../services/open-webui.nix
   ];
 
-  nixpkgs.config.allowUnfree = true;
-
   boot.loader.systemd-boot.memtest86.enable = true;
 
   # running binaries for other architectures
diff --git a/hosts/home-server/default.nix b/hosts/home-server/default.nix
index e8a4eda..e947b56 100644
--- a/hosts/home-server/default.nix
+++ b/hosts/home-server/default.nix
@@ -50,8 +50,6 @@ in
   age.secrets.cloudflare.file = ../../secrets/cloudflare.age;
   age.secrets.hostKey.file = ../../secrets/home-server/hostKey.age;
 
-  nixpkgs.config.allowUnfree = true;
-
   networking.domain = "home.felschr.com";
 
   networking.firewall.allowedTCPPorts = [
diff --git a/overlays.nix b/overlays.nix
deleted file mode 100644
index a317b32..0000000
--- a/overlays.nix
+++ /dev/null
@@ -1,14 +0,0 @@
-{ inputs, ... }:
-
-{
-  flake = {
-    overlays.default = final: prev: {
-      unstable = import inputs.nixpkgs-unstable {
-        inherit (prev) system;
-        config.allowUnfree = true;
-      };
-      inherit (inputs.self.packages.${prev.system}) deconz brlaser;
-      vimPlugins = prev.vimPlugins // final.callPackage ./pkgs/vim-plugins { inherit inputs; };
-    };
-  };
-}
diff --git a/overlays/flake-module.nix b/overlays/flake-module.nix
new file mode 100644
index 0000000..93e5b19
--- /dev/null
+++ b/overlays/flake-module.nix
@@ -0,0 +1,27 @@
+{ self, inputs, ... }:
+
+{
+  flake = {
+    overlays.default = final: prev: {
+      unstable = import inputs.nixpkgs-unstable {
+        inherit (prev) system;
+        config.allowUnfree = true;
+      };
+      inherit (inputs.self.packages.${prev.system}) deconz brlaser;
+      vimPlugins = prev.vimPlugins // final.callPackage ../pkgs/vim-plugins { inherit inputs; };
+    };
+    pkgsFor =
+      system:
+      import inputs.nixpkgs {
+        inherit system;
+        overlays = [ self.overlays.default ];
+        config.allowUnfree = true;
+      };
+  };
+
+  perSystem =
+    { system, ... }:
+    {
+      _module.args.pkgs = self.pkgsFor system;
+    };
+}
diff --git a/system/nix.nix b/system/nix.nix
index 6cdf0c9..3a8a7f5 100644
--- a/system/nix.nix
+++ b/system/nix.nix
@@ -4,6 +4,8 @@ let
   inherit (inputs.self.outputs) nixConfig;
 in
 {
+  nixpkgs.config.allowUnfree = true;
+
   nix.gc = {
     automatic = true;
     dates = "04:00";