A list of configuration settings for my environment
  • Nix 72.4%
  • Shell 27.6%
Find a file
Jean-Baptiste WITTNER 9418555862 DEAL WITH IT
2026-06-08 19:04:25 +02:00
.claude someone fails and it isn't me 2026-06-01 23:36:03 +02:00
docs FOR REAL. 2026-05-30 00:31:48 +02:00
modules Never gonna run around and desert you 2026-06-08 15:11:35 +02:00
secrets Updated 2026-06-02 00:47:56 +02:00
zsh What happens in vegas stays in vegas 2026-06-01 23:43:11 +02:00
.gitignore No time to commit.. My people need me! 2026-05-29 22:37:16 +02:00
.sops.yaml No time to commit.. My people need me! 2026-05-29 22:37:16 +02:00
AGENTS.md And if you ask me how I'm feeling 2026-05-30 00:12:00 +02:00
flake.lock DEAL WITH IT 2026-06-08 19:04:25 +02:00
flake.nix better grepping 2026-05-29 22:20:09 +02:00
LICENSE Initial commit 2026-05-26 09:38:31 +00:00
README.md What happens in vegas stays in vegas 2026-06-01 23:43:11 +02:00

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.systemPackages ou home.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 paquets
  • nix-darwin — le framework de configuration macOS
  • home-manager — la gestion des dotfiles utilisateur
  • sops-nix — la gestion de secrets chiffrés

Il exporte une unique darwinConfigurations."MBPJB" qui :

  1. Charge les modules darwin (système)
  2. Intègre Home Manager comme module darwin, ce qui permet de gérer la config utilisateur dans le même darwin-rebuild switch
  3. Importe sops-nix.homeManagerModules.sops au 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 :

  1. Oh My Zsh — thème robbyrussell, plugins git, git-flow, sdk
  2. Plugins Nixzsh-autosuggestions et zsh-syntax-highlighting installés via nixpkgs
  3. Aliases — aliases de navigation (cdworkspace, cdenv) et de gestion (applyenv, buildenv…)
  4. 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
  • Aliasesst, lg (graphe coloré), oops (amend), yolo (commit message aléatoire + push)
  • Merge/Diff — conflit style diff3, difftool/mergetool VSCode
  • Pushpush.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 (avec true les 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 sourcessecrets/global.sops.yaml
  • Secret déchiffrégithub_token

Nix Settings

modules/darwin/nix-settings.nix configure :

  • Flakes activésexperimental-features = "nix-command flakes"
  • GC automatique — dimanche 3h, supprime les générations > 14 jours
  • Optimise — dimanche 4h, déduplique le store
  • Parallélismemax-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

  1. Ajouter le cask dans modules/darwin/homebrew.nix.
  2. 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…)

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).