- Nix 72.4%
- Shell 27.6%
| .claude | ||
| docs | ||
| modules | ||
| secrets | ||
| zsh | ||
| .gitignore | ||
| .sops.yaml | ||
| AGENTS.md | ||
| flake.lock | ||
| flake.nix | ||
| LICENSE | ||
| README.md | ||
envconf
Configuration macOS déclarative avec nix-darwin, Home Manager et Homebrew.
Vue d'ensemble
Ce dépôt gère l'intégralité de la configuration d'un Mac (Apple Silicon) de manière reproductible :
- nix-darwin — configuration système macOS (Homebrew, paramètres dock, garbage collection Nix)
- Home Manager — dotfiles et outils utilisateur (shell, git, éditeurs, outils CLI)
- Homebrew (via nix-darwin) — installation des applications GUI (.app) via
casks - Nix (nixpkgs) — installation des outils CLI/infra via
environment.systemPackagesouhome.packages - sops-nix — gestion de secrets chiffrés (age + sops)
Le tout est orchestré par un Nix Flake (flake.nix) qui câble les inputs et produit une unique darwinConfiguration nommée "MBPJB".
Structure des fichiers
flake.nix ← point d'entrée : inputs, wiring, userConfig
modules/
darwin/ ← configuration système (nix-darwin)
default.nix ← imports
system.nix ← utilisateur, dock, defaults macOS
nix-settings.nix ← experimental-features, GC hebdo, optimise
homebrew.nix ← activation Homebrew + liste des casks GUI
packages.nix ← paquets CLI système (vim, wget, kubectl, terraform, gcloud…)
home/ ← configuration utilisateur (Home Manager)
default.nix ← imports
core.nix ← stateVersion, env, PATH + outils CLI user (bat, eza, fd, jq, rg, yq, fzf) + aliases
shell.nix ← zsh (oh-my-zsh, plugins, aliases) + direnv
git.nix ← config git complète (aliases, merge, diff, push…)
vscode.nix ← VS Code déclaratif (extensions + settings)
secrets.nix ← sops-nix (age key, github_token)
secrets/
global.sops.yaml ← secrets chiffrés (sops)
zsh/
zsh_functions.sh ← fonctions ZSH custom (docker_*, extract, clear_history…)
.local.zshrc ← config locale non versionnée (secrets, paths machine)
model-zshrc.local.zshrc ← template pour créer .local.zshrc
Comment ça fonctionne
Le Flake (flake.nix)
Le flake déclare quatre inputs :
nixpkgs(unstable) — le catalogue de paquetsnix-darwin— le framework de configuration macOShome-manager— la gestion des dotfiles utilisateursops-nix— la gestion de secrets chiffrés
Il exporte une unique darwinConfigurations."MBPJB" qui :
- Charge les modules darwin (système)
- Intègre Home Manager comme module darwin, ce qui permet de gérer la config utilisateur dans le même
darwin-rebuild switch - Importe
sops-nix.homeManagerModules.sopsau niveau utilisateur
La variable userConfig (username, fullName, email) est passée à tous les modules via specialArgs / extraSpecialArgs.
Flux d'évaluation
flake.nix
└─ darwinConfigurations."MBPJB" (aarch64-darwin)
│
├─ modules/darwin/default.nix
│ ├─ system.nix → utilisateur, dock, defaults macOS
│ ├─ nix-settings.nix → flakes, GC dimanche 3h, optimise dimanche 4h
│ ├─ homebrew.nix → casks GUI (Chrome, Discord, IntelliJ…) + "zap" cleanup
│ └─ packages.nix → paquets CLI système (vim, wget, kubectl, terraform, gcloud, gnupg…)
│
└─ home-manager.users.jbwittner
└─ modules/home/default.nix
├─ core.nix → EDITOR, PATH, sessionVariables, outils CLI (bat/eza/fd/jq/rg/yq/fzf) + aliases
├─ shell.nix → oh-my-zsh, plugins, aliases, initContent + direnv
├─ git.nix → aliases git, merge, diff, push config
├─ vscode.nix → extensions + settings déclaratifs
└─ secrets.nix → sops + age + github_token
Homebrew et le cleanup "zap"
Dans modules/darwin/homebrew.nix :
homebrew = {
enable = true;
onActivation.cleanup = "zap";
casks = [ "google-chrome" "discord" ... ];
};
"zap" signifie : toute application installée via Homebrew qui n'est pas déclarée dans la config sera supprimée (y compris ses données). Cela garantit que la machine reste synchronisée avec le code.
Fusion automatique des listes
Le système de modules Nix fusionne automatiquement les listes de même type déclarées dans des modules différents. Si plusieurs modules déclarent home.packages = [ ... ] ou programs.zsh.shellAliases = { ... }, Nix les combine — aucun module ne remplace l'autre.
Configuration ZSH
La configuration ZSH (modules/home/shell.nix) combine :
- Oh My Zsh — thème
robbyrussell, pluginsgit,git-flow,sdk… - Plugins Nix —
zsh-autosuggestionsetzsh-syntax-highlightinginstallés via nixpkgs - Aliases — aliases de navigation (
cdworkspace,cdenv) et de gestion (applyenv,buildenv…) - initContent — source deux fichiers externes :
zsh/zsh_functions.sh— fonctions Docker (docker_container_stop,docker_system_clean…),extract,clear_history…zsh/.local.zshrc— config locale non versionnée (secrets, variables spécifiques à la machine)
Les aliases des outils CLI (bat/eza/fd/rg) sont déclarés directement dans modules/home/core.nix et fusionnés automatiquement.
Configuration Git
modules/home/git.nix configure Git de manière exhaustive :
- Identité — nom/email depuis
userConfig - Aliases —
st,lg(graphe coloré),oops(amend),yolo(commit message aléatoire + push) - Merge/Diff — conflit style
diff3, difftool/mergetool VSCode - Push —
push.default = "current", followTags - Pull — fast-forward only
- Rerere — réutilisation automatique des résolutions de conflits
Configuration VS Code
modules/home/vscode.nix installe VS Code avec :
- Extensions déclaratives — Nix, Java (RedHat + vscjava), Kubernetes, Remote SSH/Containers, Claude Code
mutableExtensionsDir = false— requis sur macOS (avectrueles symlinks ne sont pas chargés)- Settings — autosave, Copilot, thème Visual Studio Dark, formatters YAML
Secrets (sops-nix)
modules/home/secrets.nix configure :
- age key file —
~/.config/sops/age/keys.txt - Secrets sources — secrets/global.sops.yaml
- Secret déchiffré —
github_token
Nix Settings
modules/darwin/nix-settings.nix configure :
- Flakes activés —
experimental-features = "nix-command flakes" - GC automatique — dimanche 3h, supprime les générations > 14 jours
- Optimise — dimanche 4h, déduplique le store
- Parallélisme —
max-jobs = "auto",cores = 0(utilise tous les cœurs)
Commandes utiles
| Alias | Action |
|---|---|
applyenv |
Applique la configuration (sudo darwin-rebuild switch --flake ~/.envconf) |
buildenv |
Vérifie sans appliquer (sudo darwin-rebuild build --flake ~/.envconf) |
updateenv |
Met à jour les inputs du flake (sudo nix flake update --flake ~/.envconf) |
cleanenv |
Nettoie le store Nix (GC + optimise) |
cdenv |
cd ~/.envconf |
cdworkspace |
cd ~/workspace |
Cas d'usage
Ajouter une application GUI
Ajouter le nom du cask dans la liste de modules/darwin/homebrew.nix :
homebrew.casks = [
# ...
"slack" # ← ajouter ici
];
Puis applyenv. Pour désinstaller : retirer la ligne et applyenv — le cleanup = "zap" supprime l'app automatiquement.
Ajouter une app GUI avec configuration XDG
- Ajouter le cask dans modules/darwin/homebrew.nix.
- Ajouter le fichier de config dans modules/home/core.nix :
xdg.configFile."ghostty/config".text = ''
font-family = JetBrainsMono Nerd Font
font-size = 13
'';
Si l'app nécessite une font Nerd Font, ajouter aussi "font-jetbrains-mono-nerd-font" aux casks.
Ajouter un outil CLI système (ex. ArgoCD)
Ajouter le paquet dans modules/darwin/packages.nix :
environment.systemPackages = [
# ...
pkgs.argocd
];
Ajouter un outil CLI utilisateur avec aliases
Dans modules/home/core.nix, ajouter le paquet à home.packages et l'alias à programs.zsh.shellAliases :
home.packages = with pkgs; [
# ...
delta
];
programs.zsh.shellAliases = {
# ...
diff = "delta";
};
Modifier la configuration ZSH (aliases, plugins…)
- Aliases shell généraux → modules/home/shell.nix (section
shellAliases) - Alias lié à un outil CLI → modules/home/core.nix
- Fonctions custom → zsh/zsh_functions.sh
- Secrets / variables machine →
zsh/.local.zshrc(non versionné, créer depuismodel-zshrc.local.zshrc)
Modifier la configuration Git
Éditer modules/home/git.nix.
Modifier la configuration VS Code
Éditer modules/home/vscode.nix (extensions dans profiles.default.extensions, settings dans profiles.default.userSettings).
Modifier les variables d'environnement ou le PATH
Éditer modules/home/core.nix (home.sessionVariables, home.sessionPath).
Modifier les paramètres Nix (GC, cache, jobs…)
Éditer modules/darwin/nix-settings.nix.
Gérer un secret
Les secrets en clair sont dans secrets/*.secret.yaml (non versionnés). Les versions chiffrées *.sops.yaml sont générées avec sops.
Régénérer tous les secrets (après avoir modifié un .secret.yaml) :
encryptsecrets
Éditer un secret chiffré existant :
sops secrets/global.sops.yaml
Référencer un secret dans modules/home/secrets.nix :
sops.secrets."mon_secret" = {};
# ou pour un fichier non-default :
sops.secrets."mon_secret" = { sopsFile = ../../secrets/autre.sops.yaml; };
Appliquer les changements
# Vérifier que ça compile sans appliquer
buildenv
# Appliquer la configuration
applyenv
# Mettre à jour les dépendances (nixpkgs, home-manager, nix-darwin, sops-nix)
updateenv
Fonctions ZSH disponibles
Fonctions définies dans zsh/zsh_functions.sh :
| Fonction | Description |
|---|---|
docker_container_stop |
Arrête tous les conteneurs en cours |
docker_container_clean |
Arrête et supprime tous les conteneurs |
docker_volume_clean |
Supprime tous les volumes Docker |
docker_network_clean |
Supprime les réseaux Docker custom |
docker_images_clean |
Supprime toutes les images Docker |
docker_system_clean |
Nettoie tout sauf les images |
docker_system_clean_and_images |
Nettoie tout y compris les images |
extract <fichier> |
Extrait une archive dans un dossier du même nom |
clear_history |
Efface l'historique du shell courant |
docker_live_stats et docker_ps sont des aliases définis dans modules/home/shell.nix (pas des fonctions).