Skip to main content

Overview

Home Manager configurations define user-specific settings, applications, and dotfiles. These configurations are stored in the homes/ directory and follow a specific naming pattern.

Naming Patterns

Home Manager profiles use three naming patterns:

1. Global User Configuration

Pattern: homes/username/default.nix Applies to a user across all systems where they exist:
homes/soriphoono/default.nix
{pkgs, ...}: {
  core = {
    secrets = {
      enable = true;
      defaultSopsFile = ./secrets.yaml;
    };

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

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

2. Host-Specific User Configuration

Pattern: homes/username@hostname/default.nix Overrides or extends settings for a specific system:
homes/soriphoono@zephyrus/default.nix
{config, ...}: {
  core = {
    shells.fish.generateCompletions = true;

    git = {
      projectsDir = "${config.home.homeDirectory}/Documents/Projects/";
      extraIdentities = {
        school = {
          directory = "School";
          name = "soriphoono";
          email = "[email protected]";
          signingKey = "ssh-ed25519 AAAA...";
        };
        work = {
          directory = "Work";
          name = "xrezdev11";
          email = "[email protected]";
          signingKey = "ssh-ed25519 AAAA...";
        };
      };
    };
  };

  userapps = {
    enable = true;
    browsers = {
      chrome.enable = true;
      librewolf.enable = true;
    };
    communication = {
      discord.enable = true;
    };
    data-fortress = {
      nextcloud.enable = true;
      bitwarden.enable = true;
    };
    office = {
      onlyoffice.enable = true;
    };
    development = {
      enable = true;
      terminal = {
        ghostty.enable = true;
      };
      knowledge-management.obsidian.enable = true;
      editors = {
        neovim.enable = true;
        antigravity.enable = true;
      };
      agents = {
        gemini = {
          enable = true;
          enableJules = true;
        };
      };
    };
  };
}

3. Standalone Home Manager

Pattern: homes/username@global/default.nix For systems not managed by NixOS (using standalone Home Manager):
homes/user@global/default.nix
{pkgs, ...}: {
  home.stateVersion = "24.05";
  
  core = {
    git = {
      userName = "user";
      userEmail = "[email protected]";
    };
  };
  
  userapps.browsers.firefox.enable = true;
}

Configuration Priority

When a user exists on a system, configurations are merged in this order:
  1. homes/username/default.nix (global user config)
  2. homes/username@hostname/default.nix (host-specific overrides)
Host-specific settings override global settings.

Complete Examples

A basic configuration with just Git and secrets:
homes/spookyskelly/default.nix
{
  core = {
    secrets = {
      enable = true;
      defaultSopsFile = ./secrets.yaml;
    };

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

Core Configuration

Git Configuration

The core.git module provides comprehensive Git setup:
core.git.userName
string
required
Your Git username
core.git.userEmail
string
required
Your Git email address
core.git.projectsDir
path
default:"~/Documents/Projects"
Directory where Git projects are stored
core.git.extraIdentities
attrset
default:"{}"
Additional Git identities for different contexts (work, school, etc.)Each identity has:
  • directory - Subdirectory under projectsDir
  • name - Git user name for this identity
  • email - Git email for this identity
  • signingKey - SSH key for commit signing

Multiple Git Identities Example

core.git = {
  userName = "soriphoono";
  userEmail = "[email protected]";
  projectsDir = "${config.home.homeDirectory}/Documents/Projects/";
  
  extraIdentities = {
    school = {
      directory = "School";
      name = "soriphoono";
      email = "[email protected]";
      signingKey = "ssh-ed25519 AAAA...";
    };
    work = {
      directory = "Work";
      name = "professional";
      email = "[email protected]";
      signingKey = "ssh-ed25519 AAAA...";
    };
  };
};
Projects under ~/Documents/Projects/School/ will use the school identity, while projects under ~/Documents/Projects/Work/ will use the work identity.

Shell Configuration

core.shells.fish.generateCompletions
boolean
default:"false"
Generate Fish shell completions for installed packages
core.shells.starship.enable
boolean
default:"false"
Enable Starship prompt
core.shells.fastfetch.enable
boolean
default:"false"
Enable Fastfetch system info display

Secrets Management

core.secrets.enable
boolean
default:"false"
Enable SOPS secrets management
core.secrets.defaultSopsFile
path
Path to the default SOPS secrets file

User Applications

The userapps namespace provides categorized application modules:

Browsers

userapps.browsers = {
  firefox.enable = true;
  librewolf.enable = true;
  floorp.enable = true;
  chrome.enable = true;
};
userapps.browsers.firefox.enable
boolean
default:"false"
Install Firefox browser
userapps.browsers.librewolf.enable
boolean
default:"false"
Install LibreWolf (privacy-focused Firefox fork)
userapps.browsers.chrome.enable
boolean
default:"false"
Install Google Chrome

Development Tools

userapps.development = {
  enable = true;
  
  editors = {
    neovim.enable = true;
    vscode.enable = true;
    antigravity.enable = true;
  };
  
  terminal = {
    kitty.enable = true;
    ghostty.enable = true;
    warp.enable = true;
  };
  
  knowledge-management.obsidian.enable = true;
  
  domain_specific.k8s.enable = true;
  
  agents = {
    gemini.enable = true;
    mcp-servers.enable = true;
  };
};
userapps.development.editors.neovim.enable
boolean
default:"false"
Install Neovim editor
userapps.development.editors.neovim.settings
attrset
Custom Neovim configuration (plugins, settings, etc.)
userapps.development.editors.vscode.enable
boolean
default:"false"
Install Visual Studio Code
userapps.development.editors.antigravity.enable
boolean
default:"false"
Install Antigravity editor
userapps.development.terminal.kitty.enable
boolean
default:"false"
Install Kitty terminal emulator
userapps.development.terminal.ghostty.enable
boolean
default:"false"
Install Ghostty terminal emulator
userapps.development.domain_specific.k8s.enable
boolean
default:"false"
Install Kubernetes tools (kubectl, k9s, helm, etc.)
userapps.development.agents.gemini.enable
boolean
default:"false"
Install Google Gemini AI assistant

Communication

userapps.communication = {
  discord.enable = true;
};
userapps.communication.discord.enable
boolean
default:"false"
Install Discord

Data Fortress (Security)

userapps.data-fortress = {
  bitwarden.enable = true;
  nextcloud.enable = true;
};
userapps.data-fortress.bitwarden.enable
boolean
default:"false"
Install Bitwarden password manager
userapps.data-fortress.nextcloud.enable
boolean
default:"false"
Install Nextcloud client

Office Applications

userapps.office = {
  onlyoffice.enable = true;
};
userapps.office.onlyoffice.enable
boolean
default:"false"
Install OnlyOffice suite

Advanced Configurations

Custom Neovim Configuration

You can import complex configurations from subdirectories:
homes/user/default.nix
{pkgs, ...}: {
  userapps.development.editors.neovim.settings = import ./nvim {inherit pkgs;};
}
Then create homes/user/nvim/default.nix with your Neovim configuration.

Conditional Configuration

Use Nix expressions for conditional setup:
{config, lib, ...}: {
  userapps.development.editors = {
    neovim.enable = true;
    vscode.enable = lib.mkIf (config.home.username == "developer") true;
  };
}

Directory Structure

A complete homes directory might look like:
homes/
├── soriphoono/
│   ├── default.nix         # Global config
│   ├── secrets.yaml        # Global secrets
│   └── nvim/
│       └── default.nix     # Neovim config
├── soriphoono@zephyrus/
│   └── default.nix         # Host-specific
├── soriphoono@droid/
│   └── default.nix         # Droid-specific
├── spookyskelly/
│   └── default.nix         # Global config
└── spookyskelly@lg-laptop/
    ├── default.nix         # Host-specific
    └── secrets.yaml        # Host secrets

Using Home Manager Modules

All modules from modules/home/ are automatically available:
# These modules are loaded automatically
core.git = { ... };
core.shells.fish = { ... };
userapps.browsers.firefox = { ... };
See the Modules documentation for creating custom modules.

Next Steps

NixOS Systems

Configure system-level settings

Modules

Learn about available modules

Secrets

Manage secrets with SOPS

Nix-on-Droid

Configure Android devices

Build docs developers (and LLMs) love