Skip to main content
The Home Manager modules provide a comprehensive set of configuration options for managing user environments across NixOS systems. These modules are organized into two main categories: core functionality and user applications.

Module Structure

Home Manager modules are located in modules/home/ and are organized as follows:
modules/home/
├── core/          # Essential system configuration
└── userapps/      # User-facing applications

Core Modules

Core modules provide essential functionality that forms the foundation of your home environment:
  • Git Configuration - User identity, signing keys, and project organization
  • GitOps - Automated home configuration sync from Git repositories
  • Secrets Management - SOPS-based secret handling with age encryption
  • Shell Configuration - Fish shell, Starship prompt, and Fastfetch
  • SSH Management - Key deployment and SSH agent configuration
  • Health Checks - Environment validation and warnings
Learn more about core modules →

User Applications

User application modules provide opt-in configurations for common software:
  • Browsers - Firefox, LibreWolf, Chrome, Floorp
  • Communication - Discord/Vesktop
  • Development Tools - Neovim, VSCode, AI agents, terminals
  • Data Fortress - Bitwarden, Nextcloud
  • Office Suite - Productivity applications
Learn more about user applications →

Usage Example

Home Manager modules are configured in your user’s homes/<username>/default.nix:
{pkgs, ...}: {
  # Core configuration
  core = {
    secrets = {
      enable = true;
      defaultSopsFile = ./secrets.yaml;
    };

    git = {
      userName = "soriphoono";
      userEmail = "[email protected]";
    };
  };

  # Optional applications
  userapps.development.editors.neovim.settings = import ./nvim {inherit pkgs;};
}

Key Features

Modular Design

Each module is self-contained with its own options and configuration logic. Enable only what you need.

Type-Safe Configuration

All options are strongly typed using NixOS module system types, providing validation and documentation.

Declarative Management

Your entire home environment is declared in Nix, making it reproducible across machines.

XDG Integration

Modules follow XDG Base Directory specifications and integrate with system MIME types.

Common Patterns

Priority-Based Defaults

Many modules (browsers, editors) support priority values to determine which application becomes the default:
userapps = {
  browsers = {
    librewolf.enable = true;  # priority = 10 (highest)
    firefox.enable = true;     # priority = 20
    chrome.enable = true;      # priority = 100 (fallback)
  };
};
Lower priority values win. This allows multiple applications to be installed while controlling which is the default.

Secrets Integration

Core modules integrate with the secrets system automatically:
core = {
  secrets.enable = true;
  ssh.publicKey = "ssh-ed25519 ...";
};
# SSH private keys are automatically provisioned from secrets

Shell Customization

Shell aliases and environment variables are centralized:
core.shells = {
  shellAliases = {
    g = "git";
    k = "kubectl";
  };
  sessionVariables = {
    EDITOR = "nvim";
  };
};

Next Steps

Build docs developers (and LLMs) love