Overview
The homelab uses a modular architecture to organize configurations. Modules are reusable configuration components that can be enabled or disabled with simple options.Module Types
There are three types of modules corresponding to the three configuration types:NixOS Modules
modules/nixos/System-level configuration for NixOS systemsHome Manager Modules
modules/home/User-level configuration and applicationsDroid Modules
modules/droid/Android device configuration via Nix-on-DroidModule Structure
All modules are automatically discovered and imported using a discovery mechanism:modules/nixos/default.nix
.nix file you add to a module directory is automatically available in your configurations.
NixOS Modules
Located inmodules/nixos/, these modules configure system-level settings.
Module Categories
- Core
- Desktop
- Hosting
Essential system configuration:Usage:
Home Manager Modules
Located inmodules/home/, these modules configure user environments.
Module Categories
- Core
- Applications
Essential user configuration:Usage:
Droid Modules
Located inmodules/droid/, these modules configure Nix-on-Droid environments.
Creating Custom Modules
Basic Module Structure
A module typically follows this pattern:modules/nixos/example/feature.nix
Real Module Example
Here’s the actual hardware module from the homelab:modules/nixos/core/hardware/default.nix
Home Manager Module Example
The Git module with advanced options:modules/home/core/git.nix
Module Options
Common Option Types
Creates a boolean option that defaults to
falseCreates a custom option with type, default, and description
Common Types
lib.types.bool- Boolean (true/false)lib.types.str- Stringlib.types.int- Integerlib.types.path- File pathlib.types.package- Nix packagelib.types.listOf <type>- List of itemslib.types.attrsOf <type>- Attribute setlib.types.submodule- Nested modulelib.types.enum [...]- One of the listed values
Conditional Configuration
Uselib.mkIf to apply configuration only when an option is enabled:
lib.mkMerge to merge multiple conditional blocks:
Module Imports
Modules can import other modules:modules/nixos/desktop/default.nix
Best Practices
- Use namespaces - Organize options under logical namespaces (core, desktop, userapps)
- Provide defaults - Always provide sensible defaults for options
- Document everything - Use
descriptionandexamplefields - Use enable options - Gate configuration behind
enableflags - Keep modules focused - Each module should do one thing well
- Use conditional imports - Only import what’s needed
- Test modules - Test your modules on different systems
Module Discovery
The module system useslib.discover to automatically find and import modules:
- Any
.nixfile in the module directory is automatically loaded - Subdirectories are recursively scanned
- No manual import list to maintain
Debugging Modules
Check Module Options
List all available options:View Module Values
See the current value of an option:Test Module Configuration
Build without switching:Common Patterns
Feature Flag Pattern
Multiple Choice Pattern
Next Steps
Systems
Configure NixOS systems
Home Manager
Configure user environments
Creating Modules
Learn how to create modules
Contributing
Contribute your own modules