Home Manager - dotfiles declaratifs
Ce que c’est
Section intitulée « Ce que c’est »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.
Deux façons de l’utiliser
Section intitulée « Deux façons de l’utiliser »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; } ]; };};programs.* vs home.packages
Section intitulée « programs.* vs home.packages »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.
Découper par domaine
Section intitulée « Découper par domaine »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 IAdefault.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.
Ce que ça change
Section intitulée « Ce que ça change »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.