Skip to main content

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 systems

Home Manager Modules

modules/home/User-level configuration and applications

Droid Modules

modules/droid/Android device configuration via Nix-on-Droid

Module Structure

All modules are automatically discovered and imported using a discovery mechanism:
modules/nixos/default.nix
This means any .nix file you add to a module directory is automatically available in your configurations.

NixOS Modules

Located in modules/nixos/, these modules configure system-level settings.

Module Categories

Essential system configuration:
Usage:

Home Manager Modules

Located in modules/home/, these modules configure user environments.

Module Categories

Essential user configuration:
Usage:

Droid Modules

Located in modules/droid/, these modules configure Nix-on-Droid environments.
Usage:

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

function
Creates a boolean option that defaults to false
function
Creates a custom option with type, default, and description

Common Types

  • lib.types.bool - Boolean (true/false)
  • lib.types.str - String
  • lib.types.int - Integer
  • lib.types.path - File path
  • lib.types.package - Nix package
  • lib.types.listOf <type> - List of items
  • lib.types.attrsOf <type> - Attribute set
  • lib.types.submodule - Nested module
  • lib.types.enum [...] - One of the listed values

Conditional Configuration

Use lib.mkIf to apply configuration only when an option is enabled:
Use lib.mkMerge to merge multiple conditional blocks:

Module Imports

Modules can import other modules:
modules/nixos/desktop/default.nix

Best Practices

  1. Use namespaces - Organize options under logical namespaces (core, desktop, userapps)
  2. Provide defaults - Always provide sensible defaults for options
  3. Document everything - Use description and example fields
  4. Use enable options - Gate configuration behind enable flags
  5. Keep modules focused - Each module should do one thing well
  6. Use conditional imports - Only import what’s needed
  7. Test modules - Test your modules on different systems

Module Discovery

The module system uses lib.discover to automatically find and import modules:
This means:
  • Any .nix file 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