Aller au contenu
Logo Nix

Home Manager - dotfiles declaratifs

NixOS déclare l’état du système. Home Manager fait la même chose côté utilisateur : shell, éditeur, git, polices, outils… tout ce qui vit normalement dans ~/.config ou quelque part dans le home.

Ce qui est moins évident : Home Manager ne dépend pas de NixOS. Il tourne sur n’importe quel Linux - Arch, Ubuntu - et sur macOS. On peut l’utiliser seul, juste pour les dotfiles, sans toucher au reste.

En standalone, il s’installe séparément et s’active avec home-manager switch. Utile sur une machine qui n’est pas sous NixOS.

Intégré dans un flake NixOS, il devient un module comme les autres, activé au même moment que nixos-rebuild switch. C’est ce que je fais - plus rien à gérer séparément :

outputs = { nixpkgs, home-manager, ... }: {
nixosConfigurations.laptop = nixpkgs.lib.nixosSystem {
modules = [
home-manager.nixosModules.home-manager
{
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users.tim = import ./home/tim;
}
];
};
};

home.packages installe des packages sans les configurer :

home.packages = with pkgs; [ ripgrep fd tree ];

programs.* installe et configure en même temps :

programs.git = {
enable = true;
userName = "Tim";
userEmail = "tim@example.com";
extraConfig.pull.rebase = true;
};
programs.starship = {
enable = true;
enableBashIntegration = true;
};
programs.zoxide = {
enable = true;
enableBashIntegration = true;
};

programs.starship génère le bon ~/.config/starship.toml. programs.zoxide ajoute le hook dans le shell. Les intégrations sont câblées automatiquement - plus besoin de les ajouter à la main dans le .bashrc.

La liste des programmes supportés est longue : nix-community.github.io/home-manager.

Ma config home/tim/ est un dossier de modules thématiques plutôt qu’un seul gros fichier :

home/tim/
├── default.nix # point d'entrée, imports + packages de base
├── shell.nix # bash, aliases, starship, zoxide, fzf
├── git.nix # config git
├── terminals.nix # émulateur de terminal
├── wm.nix # i3 et ses outils
├── email.nix # neomutt, msmtp
├── pim.nix # calendrier et contacts (khal, khard, vdirsyncer)
├── tools.nix # polices, yazi, fastfetch, ripgrep...
└── ai.nix # outils IA

default.nix importe tout :

{ config, pkgs, ... }:
{
imports = [
./shell.nix
./git.nix
./terminals.nix
./wm.nix
./email.nix
./pim.nix
./tools.nix
./ai.nix
];
home.username = "tim";
home.homeDirectory = "/home/tim";
home.stateVersion = "25.11";
}

Mon laptop, mon WSL, une VM - tous importent le même ./home/tim. Les rares différences entre machines (désactiver NetworkManager sur le WSL par exemple) se gèrent au niveau NixOS, pas ici. La config Home Manager, elle, ne change pas d’une machine à l’autre.

Avant, c’était un repo git avec des symlinks à la main, ou Stow. Ça marchait, mais les packages restaient à installer séparément et tout était à refaire sur chaque nouvelle machine.

Avec Home Manager, faire nixos-rebuild switch --flake .#laptop sur une installation fraîche suffit pour tout récupérer : outils, polices, intégrations shell, config git. Pas de script d’install, pas d’étapes à se souvenir. Le flake.lock fixe les versions, donc le résultat est le même à six mois d’intervalle.