From cfd21c973ddedd6fec7ee04d5c3f1278a4e41d8a Mon Sep 17 00:00:00 2001
From: Franek <me@sador.me>
Date: Sun, 23 Mar 2025 18:37:32 +0100
Subject: [PATCH] chunk flake into modules (part 1)

---
 hosts/base-configuration.nix              | 10 ----
 hosts/hulk/default.nix                    |  2 -
 hosts/hulk/modules.nix                    | 55 ++++++++++++++++---
 hosts/hulk/programs.nix                   | 11 ----
 hosts/hulk/services.nix                   | 37 -------------
 hosts/hulk/users.nix                      |  2 -
 modules/desktop-environments/hyprland.nix | 66 +++++++++++++++++++++++
 modules/greetd.nix                        | 16 ------
 modules/home-manager/darkman.nix          | 45 ++++++++++++++++
 modules/{ => nixos}/apple-style.nix       |  4 +-
 modules/nixos/audio.nix                   | 15 ++++++
 modules/{ => nixos}/bluetooth.nix         |  6 ++-
 modules/{ => nixos}/fingerprint.nix       | 14 ++---
 modules/nixos/greetd.nix                  | 20 +++++++
 modules/nixos/nvidia-support.nix          | 13 +++++
 modules/nvidia-support.nix                | 13 -----
 profiles/hulk/default.nix                 | 15 +++---
 profiles/hulk/packages.nix                | 11 ++--
 18 files changed, 233 insertions(+), 122 deletions(-)
 delete mode 100644 hosts/hulk/programs.nix
 delete mode 100644 hosts/hulk/services.nix
 create mode 100644 modules/desktop-environments/hyprland.nix
 delete mode 100644 modules/greetd.nix
 create mode 100644 modules/home-manager/darkman.nix
 rename modules/{ => nixos}/apple-style.nix (81%)
 create mode 100644 modules/nixos/audio.nix
 rename modules/{ => nixos}/bluetooth.nix (64%)
 rename modules/{ => nixos}/fingerprint.nix (65%)
 create mode 100644 modules/nixos/greetd.nix
 create mode 100644 modules/nixos/nvidia-support.nix
 delete mode 100644 modules/nvidia-support.nix

diff --git a/hosts/base-configuration.nix b/hosts/base-configuration.nix
index e3d58bf..1e9c35e 100644
--- a/hosts/base-configuration.nix
+++ b/hosts/base-configuration.nix
@@ -4,12 +4,6 @@
   	# DO NOT change this unless you know what you're doing!
   	system.stateVersion = "24.11";
 
-  	environment.variables = {
-    	XDG_SESSION_TYPE = "wayland";
-    	XDG_CURRENT_DESKTOP = "Hyprland";
-    	NIXPKGS_ALLOW_INSECURE = 1;
-  	};
-
   	nixpkgs.config = {
     	allowInsecurePredicate = pkg: builtins.elem (pkgs.lib.getName pkg) [
       		"fluffychat-linux"
@@ -21,8 +15,6 @@
   	environment.systemPackages = with pkgs; [
     	alacritty
     	vim
-    	bluez
-    	xwayland
     	unzip
 		networkmanager
   	];
@@ -31,6 +23,4 @@
 
   	boot.loader.grub.enable = false;
 	boot.loader.systemd-boot.enable = true;
-
-	programs.xwayland.enable = true;
 }
diff --git a/hosts/hulk/default.nix b/hosts/hulk/default.nix
index f449600..56b0001 100644
--- a/hosts/hulk/default.nix
+++ b/hosts/hulk/default.nix
@@ -2,8 +2,6 @@
   	imports = [
     	./hardware-configuration.nix
     	./modules.nix
-    	./services.nix
-    	./programs.nix
     	./users.nix
 		./networking.nix
 	];
diff --git a/hosts/hulk/modules.nix b/hosts/hulk/modules.nix
index 98caea5..a90f5fd 100644
--- a/hosts/hulk/modules.nix
+++ b/hosts/hulk/modules.nix
@@ -1,12 +1,51 @@
-{ inputs, ... }:
+{ pkgs, inputs, ... }: 
 
 {
 	imports = [
-    	../../modules/nvidia-support.nix
-    	../../modules/fingerprint.nix
-		../../modules/apple-style.nix
-		../../modules/bluetooth.nix
-		../../modules/greetd.nix
-		inputs.nordvpn.nixosModules.nordvpn
-  	];
+    	# DEs
+    	../../modules/desktop-environments/hyprland.nix
+ 
+    	# Utilities
+    	../../modules/nixos/nvidia-support.nix
+    	../../modules/nixos/fingerprint.nix
+    	../../modules/nixos/apple-style.nix
+    	../../modules/nixos/bluetooth.nix
+    	../../modules/nixos/greetd.nix
+    	../../modules/nixos/audio.nix
+
+		# Apps
+    	inputs.nordvpn.nixosModules.nordvpn
+    ];
+
+  	modules.hyprland = {
+		enable = true;
+		additionalPackages = with pkgs; [ hyprshot ];
+	};
+
+	modules.apple-style.enable = true;
+  	modules.bluetooth.enable = true;
+	modules.nvidia.enable = true;
+  	modules.audio.enable = true;
+	modules.fingerprint-fix = {
+		enable = true;
+		calibDataFile = ./calib-data.bin;
+	};
+
+	services = {
+		nordvpn.enable = true;
+  		printing = {
+    		enable = true;
+    		drivers = with pkgs; [ hplipWithPlugin ];
+  		};
+	};
+
+	programs = {
+		adb.enable = true;
+       	thunar.enable = true;
+  
+       	thunar.plugins = with pkgs.xfce; [
+           thunar-archive-plugin
+           thunar-volman
+      	];
+	};
 }
diff --git a/hosts/hulk/programs.nix b/hosts/hulk/programs.nix
deleted file mode 100644
index 17947e3..0000000
--- a/hosts/hulk/programs.nix
+++ /dev/null
@@ -1,11 +0,0 @@
-{ pkgs, ... }:
-
-{
-	programs.adb.enable = true;
-	programs.thunar.enable = true;
-	
-	programs.thunar.plugins = with pkgs.xfce; [
-  		thunar-archive-plugin
-  		thunar-volman
-	];
-}
diff --git a/hosts/hulk/services.nix b/hosts/hulk/services.nix
deleted file mode 100644
index 6e842d2..0000000
--- a/hosts/hulk/services.nix
+++ /dev/null
@@ -1,37 +0,0 @@
-{ pkgs, ... }: 
-
-{
-  	services.greetd-hyprland.enable = true;
-	services.apple-style.enable = true;
-  	services.bluetooth.enable = true;
-	services.nvidia.enable = true;
-  	services.fingerprint-fix = {
-		enable = true;
-		calibDataFile = ./calib-data.bin;
-	};
-
-	services.nordvpn.enable = true;
-  	services.upower.enable = true;
-  	services.udev.enable = true;
-  	services.udev.packages = [ pkgs.hyprland ];
-
-  	services.printing = {
-    	enable = true;
-    	drivers = with pkgs; [ hplipWithPlugin ];
-  	};
-
-	services.gvfs.enable = true;
-	services.geoclue2 = {
-    	enableWifi = true;
-    	geoProviderUrl = "https://api.beacondb.net/v1/geolocate";
-	};
-
-	services.dbus.enable = true;
-	services.pipewire = {
-    	enable = true;
-    	alsa.enable = true;
-    	alsa.support32Bit = true;
-    	pulse.enable = true;
-    	jack.enable = true;
-	};
-}
diff --git a/hosts/hulk/users.nix b/hosts/hulk/users.nix
index 3cf3ab6..1d8aae8 100644
--- a/hosts/hulk/users.nix
+++ b/hosts/hulk/users.nix
@@ -13,6 +13,4 @@ in {
     	shell = preferredShell;
     	ignoreShellProgramCheck = true; # Will do it later in profile configuration
   	};
-
-	users.users.nordvpn.extraGroups = [ "networkmanager" ];
 }
diff --git a/modules/desktop-environments/hyprland.nix b/modules/desktop-environments/hyprland.nix
new file mode 100644
index 0000000..7d50f38
--- /dev/null
+++ b/modules/desktop-environments/hyprland.nix
@@ -0,0 +1,66 @@
+{ pkgs, config, lib, ... }: 
+
+{
+	options.modules.hyprland = {
+		enable = lib.mkEnableOption "Enable Hyprland";
+		additionalPackages = lib.mkOption {
+			type = lib.types.listOf lib.types.package;
+			description = "Additional Hyprland-related packages to install";
+			default = [];
+		};
+	};
+
+  	config = lib.mkIf config.modules.hyprland.enable {
+    	environment.systemPackages = with pkgs; [
+			hyprlock hypridle wl-clipboard cliphist swww 	
+		] ++ config.modules.hyprland.additionalPackages;
+
+		programs.hyprland.withUWSM = true;
+    	programs.hyprland.enable = true;
+		programs.hyprland.xwayland.enable = true;
+
+	    services.logind.extraConfig = ''
+    	  	HandleLidSwitch=suspend
+			HandleLidSwitchExternalPower=ignore
+			HandlePowerKey=ignore
+    	'';
+
+    	xdg.portal = {
+    		enable = true;
+      		extraPortals = with pkgs; [
+        		xdg-desktop-portal-gtk
+      		];
+    	};
+
+    	security.polkit.enable = true;
+    	systemd.user.services.authentication-agent = {
+        	description = "GNOME Authentication Agent";
+        	wantedBy = ["graphical-session.target"];
+        	wants = ["graphical-session.target"];
+        	after = ["graphical-session.target"];
+        	serviceConfig = {
+          		Type = "simple";
+          		ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
+          		Restart = "on-failure";
+          		RestartSec = 1;
+        		TimeoutStopSec = 10;
+       		};
+    	};
+
+    	services = {
+			dbus.enable = true;
+     		gvfs.enable = true;
+      		upower.enable = true;
+      		power-profiles-daemon.enable = true;
+    	};
+
+    	services.xserver.displayManager = {
+			gdm.enable = true;
+			startx.enable = true;
+    	};
+
+    	systemd.tmpfiles.rules = [
+      		"d '/var/cache/greeter' - greeter greeter - -"
+    	];
+	};
+}
diff --git a/modules/greetd.nix b/modules/greetd.nix
deleted file mode 100644
index aa32316..0000000
--- a/modules/greetd.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{ config, lib, pkgs, ... }:
-
-{
-  options.services.greetd-hyprland.enable = lib.mkEnableOption "Enable GreetD with TUI-based login.";
-
-  config = lib.mkIf config.services.greetd-hyprland.enable {
-    services.greetd = {
-      enable = true;
-      settings = {
-        default_session = {
-          command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd Hyprland";
-        };
-      };
-    };
-  };
-}
diff --git a/modules/home-manager/darkman.nix b/modules/home-manager/darkman.nix
new file mode 100644
index 0000000..e5052df
--- /dev/null
+++ b/modules/home-manager/darkman.nix
@@ -0,0 +1,45 @@
+{ config, pkgs, lib, ... }:
+
+{
+	options.modules.darkman = {
+		enable = lib.mkEnableOption "Darkman service and integration";
+		customLightModeScript = lib.mkOption {
+			type = lib.types.str;
+			description = "Path to custom light mode script";
+		};
+
+		customDarkModeScript = lib.mkOption {
+			type = lib.types.str;
+			description = "Path to custom dark mode script";
+		};
+	};
+
+	config = lib.mkIf config.modules.darkman.enable {
+		home.packages = with pkgs; [ dconf ];
+
+		services.darkman = {
+			enable = true;
+			darkModeScripts = {
+        		theme = ''
+					${pkgs.dconf}/bin/dconf write\
+          			/org/gnome/desktop/interface/color-scheme "'prefer-dark'"
+        		'';
+
+				custom = config.modules.darkman.customDarkModeScript;
+				pywalfox = "command -v pywalfox &>/dev/null && pywalfox dark && pywalfox update";
+      		};
+
+      		lightModeScripts = {
+        		theme = ''
+          			${pkgs.dconf}/bin/dconf write\
+          			/org/gnome/desktop/interface/color-scheme "'prefer-light'"
+        		'';
+
+				custom = config.modules.darkman.customLightModeScript;
+				pywalfox = "command -v pywalfox &>/dev/null && pywalfox light && pywalfox update";
+      		};
+
+      		settings.usegeoclue = true;
+		};
+	};
+}
diff --git a/modules/apple-style.nix b/modules/nixos/apple-style.nix
similarity index 81%
rename from modules/apple-style.nix
rename to modules/nixos/apple-style.nix
index c1c2a21..6e7ddb4 100644
--- a/modules/apple-style.nix
+++ b/modules/nixos/apple-style.nix
@@ -1,9 +1,9 @@
 { config, lib, pkgs, inputs, ... }:
 
 {
-  	options.services.apple-style.enable = lib.mkEnableOption "Enable Apple fonts and emojis";
+  	options.modules.apple-style.enable = lib.mkEnableOption "Enable Apple fonts and emojis";
 
-  	config = lib.mkIf config.services.apple-style.enable {
+  	config = lib.mkIf config.modules.apple-style.enable {
     	fonts.fontDir.enable = true;
     	fonts.packages = [
       		inputs.apple-emoji.packages.${pkgs.system}.apple-emoji-nix
diff --git a/modules/nixos/audio.nix b/modules/nixos/audio.nix
new file mode 100644
index 0000000..509b2f6
--- /dev/null
+++ b/modules/nixos/audio.nix
@@ -0,0 +1,15 @@
+{ config, lib, ... }:
+
+{
+	options.modules.audio.enable = lib.mkEnableOption "Enable Pipewire audio";
+
+	config = lib.mkIf config.modules.audio.enable {
+		services.pipewire = {
+			enable = true;
+			alsa.enable = true;
+			alsa.support32Bit = true;
+			pulse.enable = true;
+			jack.enable = true;		
+		};
+	};
+}
diff --git a/modules/bluetooth.nix b/modules/nixos/bluetooth.nix
similarity index 64%
rename from modules/bluetooth.nix
rename to modules/nixos/bluetooth.nix
index 10c1055..a65300d 100644
--- a/modules/bluetooth.nix
+++ b/modules/nixos/bluetooth.nix
@@ -1,9 +1,11 @@
 { config, lib, pkgs, ... }:
 
 {
-	options.services.bluetooth.enable = lib.mkEnableOption "Enable Bluetooth";
+	options.modules.bluetooth.enable = lib.mkEnableOption "Enable Bluetooth";
+
+	config = lib.mkIf config.modules.bluetooth.enable {
+		environment.systemPackages = with pkgs; [ bluez ];
 
-	config = lib.mkIf config.services.bluetooth.enable {
 		# add compatibility layer
 		systemd.services.bluetooth.serviceConfig.ExecStart = lib.mkForce [
 			""
diff --git a/modules/fingerprint.nix b/modules/nixos/fingerprint.nix
similarity index 65%
rename from modules/fingerprint.nix
rename to modules/nixos/fingerprint.nix
index 62aa314..82f51fe 100644
--- a/modules/fingerprint.nix
+++ b/modules/nixos/fingerprint.nix
@@ -1,21 +1,23 @@
 { config, lib, pkgs, inputs, ... }:
 
 {
-	options.services.fingerprint-fix.enable = lib.mkEnableOption "Enable support for fingerprint for P51S-like ThinkPads.";
-	options.services.fingerprint-fix.calibDataFile = lib.mkOption {
-		description = "Path to calibration data file.";
+	options.modules.fingerprint-fix = {
+		enable = lib.mkEnableOption "Enable support for fingerprint for P51S-like ThinkPads.";
+		calibDataFile = lib.mkOption {
+			description = "Path to calibration data file.";
+		};
 	};
 
 	imports = [
 		inputs.fingerprint-sensor.nixosModules."06cb-009a-fingerprint-sensor"
 	];
 
-  	config = lib.mkIf config.services.fingerprint-fix.enable {
+  	config = lib.mkIf config.modules.fingerprint-fix.enable {
     	# Needed because we're getting TLS error with open-fprintd-resume
 		systemd.services.validity-restart = let
     		targets = [ "suspend.target" "hibernate.target" "hybrid-sleep.target" "suspend-then-hibernate.target" ];
     	in {
-    	  	description = "Restart services to fix fingerprint integration";
+    	  	description = "Restart.modules.to fix fingerprint integration";
     	  	wantedBy = targets;
     	 	after = targets;
     	  	serviceConfig.ExecStart = "systemctl restart open-fprintd python3-validity";
@@ -24,7 +26,7 @@
 		services."06cb-009a-fingerprint-sensor" = {
     		enable = true;
         	backend = "python-validity";
-        	calib-data-file = config.services.fingerprint-fix.calibDataFile;
+        	calib-data-file = config.modules.fingerprint-fix.calibDataFile;
     	};
 
 		security.pam.services.su.fprintAuth = true;
diff --git a/modules/nixos/greetd.nix b/modules/nixos/greetd.nix
new file mode 100644
index 0000000..930cd6f
--- /dev/null
+++ b/modules/nixos/greetd.nix
@@ -0,0 +1,20 @@
+{ config, lib, pkgs, ... }:
+
+{
+	options.modules.greetd = {
+		enable = lib.mkEnableOption "Enable GreetD with TUI-based login.";
+		command = lib.mkOption {
+			type = lib.types.str;
+			description = "Command to run after successful login";
+		};
+	};
+
+  	config = lib.mkIf config.modules.greetd.enable {
+    	services.greetd = {
+      		enable = true;
+      		settings = {
+        		default_session.command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd ${config.modules.greetd.Command}";
+        	};
+      	};
+  	};
+}
diff --git a/modules/nixos/nvidia-support.nix b/modules/nixos/nvidia-support.nix
new file mode 100644
index 0000000..ab085a3
--- /dev/null
+++ b/modules/nixos/nvidia-support.nix
@@ -0,0 +1,13 @@
+{ config, lib, ... }:
+
+{
+	options.modules.nvidia.enable = lib.mkEnableOption "Enable NVIDIA kernel and modprobe configurations.";
+
+	config = lib.mkIf config.modules.nvidia.enable {
+    	boot.kernelModules = [ "nvidia" "nvidia_modeset" "nvidia_uvm" "nvidia_drm" ];
+    	boot.extraModprobeConfig = ''
+      		options nvidia NVreg_OpenRmEnableUnsupportedGpus=1
+    	'';
+  	};
+}
+
diff --git a/modules/nvidia-support.nix b/modules/nvidia-support.nix
deleted file mode 100644
index 0f27bd0..0000000
--- a/modules/nvidia-support.nix
+++ /dev/null
@@ -1,13 +0,0 @@
-{ config, lib, ... }:
-
-{
-  options.services.nvidia.enable = lib.mkEnableOption "Enable NVIDIA kernel and modprobe configurations.";
-
-  config = lib.mkIf config.services.nvidia.enable {
-    boot.kernelModules = [ "nvidia" "nvidia_modeset" "nvidia_uvm" "nvidia_drm" ];
-    boot.extraModprobeConfig = ''
-      options nvidia NVreg_OpenRmEnableUnsupportedGpus=1
-    '';
-  };
-}
-
diff --git a/profiles/hulk/default.nix b/profiles/hulk/default.nix
index b93c1b2..da71d67 100644
--- a/profiles/hulk/default.nix
+++ b/profiles/hulk/default.nix
@@ -1,27 +1,24 @@
 { pkgs, ... }:
 
 let
-  username = "sadorowo";
-  homeDirectory = "/home/${username}";
+	username = "sadorowo";
+  	homeDirectory = "/home/${username}";
 in {
 	imports = [
-    	./packages.nix 		 # Packages to install
-    	./programs.nix 		 # Programs to enable
-		./theme.nix 		 # System-wide/GTK theme
+    	./packages.nix
+    	./programs.nix
+		./theme.nix
 	];
 
   	home = {
     	inherit username homeDirectory;
     	sessionVariables = {
-      		NIXPKGS_ALLOW_UNFREE = "1";
-      		NIXPKGS_ALLOW_INSECURE = "1";
       		NIXOS_OZONE_WL = "1";
 			TZ = "Europe/Warsaw";
-			LD_LIBRARY_PATH="${pkgs.stdenv.cc.cc.lib}/lib:$LD_LIBRARY_PATH";
     	};
   	};
 
   	programs.home-manager.enable = true;
-  	home.stateVersion = "24.11"; # DO NOT change this unless you know what you're doing!
+	home.stateVersion = "24.11";
 }
 
diff --git a/profiles/hulk/packages.nix b/profiles/hulk/packages.nix
index 5fbae85..e0c3f24 100644
--- a/profiles/hulk/packages.nix
+++ b/profiles/hulk/packages.nix
@@ -2,11 +2,17 @@
 
 {
 	imports = [
+		../../modules/home-manager/darkman.nix
 		inputs.ags.homeManagerModules.default
 	];
+
+    modules.darkman = {
+		enable = true;
+        customLightModeScript = "$HOME/.config/hypr/scripts/random-wallpaper.sh";
+        customDarkModeScript = "$HOME/.config/hypr/scripts/random-wallpaper.sh";
+    };
 	
 	home.packages = with pkgs; [
-      	hyprland hyprlock hypridle hyprshot wl-clipboard cliphist swww
 		pywal pywalfox-native
 
 		(python3.withPackages (py: with py; [
@@ -21,8 +27,6 @@
 		}))
 
 		jq
-		bluez
-		dconf
       	starship
 		element-desktop
 		firefox-beta-bin
@@ -36,7 +40,6 @@
 		fish
 		anydesk
 		fastfetch
-		greetd.greetd greetd.tuigreet
 		playerctl
 		adwaita-icon-theme
 		android-tools