Module Architecture
This configuration uses a modular architecture with 17+ modules organized across 9 categories. Each module encapsulates specific functionality and can be imported as needed by host and user configurations.
Module Categories
Desktop Modules (modules/desktop/
)
- hyprland.nix - Hyprland window manager configuration
Font Modules (modules/fonts/
)
- default.nix - System font configurations and font packages
Hardware Modules (modules/hardware/
)
- nvidia.nix - NVIDIA GPU drivers and configuration
Network Modules (modules/network/
)
- wireguard.nix - WireGuard VPN configuration
OS Modules (modules/os/
)
- common.nix - Universal settings for all systems (Nix features, experimental flags)
- nixos.nix - NixOS-specific system configurations
- darwin.nix - macOS-specific system configurations
Program Modules (modules/programs/
)
- git.nix - Git configuration and aliases
Security Modules (modules/security/
)
- gpg.nix - GPG configuration and key management
- gpg-agent.nix - GPG agent configuration
- ssh.nix - SSH client and server configuration
Terminal Modules (modules/terminal/
)
- nvim.nix - Neovim editor configuration
- starship.nix - Starship prompt configuration
- tmux.nix - Terminal multiplexer configuration
- zsh.nix - Z shell configuration and plugins
Virtualization Modules (modules/virtualization/
)
- podman.nix - Podman container runtime
- qemu.nix - QEMU virtualization platform
Module Usage Patterns
Host Configuration Pattern
Host configurations (hosts/*/config.nix
) typically import:
- OS-specific modules (
modules/os/common.nix
+modules/os/nixos.nix
ormodules/os/darwin.nix
) - Hardware-specific modules as needed
- Host-specific hardware configuration
Example:
{pkgs, ...}: {
imports = [
../../modules/os/common.nix # Universal settings
../../modules/os/nixos.nix # NixOS-specific settings
./hardware.nix # Host hardware config
];
networking.hostName = "powerhouse";
system.stateVersion = "25.05";
}
User Configuration Pattern
User configurations (users/*/home.nix
) import user-specific modules:
{pkgs, ...}: {
imports = [
../../modules/fonts/default.nix
../../modules/terminal/zsh.nix
../../modules/terminal/starship.nix
../../modules/terminal/tmux.nix
../../modules/terminal/nvim.nix
../../modules/security/gpg.nix
../../modules/security/ssh.nix
../../modules/security/gpg-agent.nix
../../modules/network/wireguard.nix
../../modules/programs/git.nix
];
# User-specific configuration
home.username = "username";
# ... rest of configuration
}
Cross-Platform Compatibility
Modules are designed to work across NixOS and macOS:
- OS modules provide platform-specific configurations
- User modules use conditional logic for platform differences
- Hardware modules are imported only when relevant
Example of cross-platform user configuration:
home.homeDirectory =
if pkgs.stdenv.isLinux
then "/home/username"
else if pkgs.stdenv.isDarwin
then "/Users/username"
else throw "Unsupported OS";
Adding New Modules
1. Choose the Right Category
Place your module in the appropriate directory:
- System-level configs →
modules/os/
- User programs →
modules/programs/
- Terminal tools →
modules/terminal/
- Security configs →
modules/security/
- etc.
2. Follow Module Structure
{pkgs, ...}: {
# Module configuration here
# Use conditional logic for cross-platform support if needed
}
3. Import in Configurations
Add the module import to relevant host or user configurations:
imports = [
../../modules/category/your-module.nix
# ... other imports
];
4. Test the Configuration
# Validate syntax
nix flake check
# Test darwin config
just check-darwin
# Test NixOS config
just build-linux
Module Dependencies
Modules can depend on other modules by importing them:
{pkgs, ...}: {
imports = [
./base-module.nix
];
# Additional configuration
}
Keep dependencies minimal and well-documented to maintain modularity.