Module Structure
Modules in this homelab are organized by scope:modules/nixos/- System-level NixOS modulesmodules/home/- User-level Home Manager modulesmodules/droid/- Nix-on-Droid modules
Creating a Module
Choose Module Location
Decide where your module belongs based on its scope:
- System hardware? →
modules/nixos/core/hardware/ - Desktop feature? →
modules/nixos/desktop/features/ - User application? →
modules/home/userapps/
Register Module
Add your module to the appropriate
default.nix file:modules/nixos/core/hardware/default.nix
Module Patterns
Basic Enable Module
Simplest form - just an enable option:Module with Options
Add configuration options:Nested Module Structure
For complex features, use nested modules:Home Manager Module
User-level modules follow similar patterns:Module Best Practices
Naming Conventions
Naming Conventions
- Use descriptive, lowercase names
- Separate words with hyphens in filenames:
bluetooth.nix,network-manager.nix - Use dot notation in option paths:
core.hardware.bluetooth
Option Design
Option Design
- Always use
lib.mkEnableOptionfor boolean enables - Provide sensible defaults
- Include descriptions for all options
- Add example values where helpful
- Use proper types:
lib.types.str,lib.types.int,lib.types.path, etc.
Configuration Organization
Configuration Organization
- Group related configuration together
- Use
let ... infor computed values - Keep
configsection clean and readable - Use
lib.mkIfto conditionally apply configuration
Dependencies
Dependencies
- Declare module inputs:
lib,config,pkgs - Import other modules through
default.nixfiles - Avoid circular dependencies
Testing Your Module
Local Testing
Test on a system configuration:systems/test-system/default.nix