<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
    <title>chukwuanu</title>
    <subtitle>Notes sur la construction de systèmes qui marchent et d&#x27;autres choses... peut-être ?</subtitle>
    <link rel="self" type="application/atom+xml" href="https://chukwuanu.com/fr/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://chukwuanu.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-01-17T00:00:00+00:00</updated>
    <id>https://chukwuanu.com/fr/atom.xml</id>
    <entry xml:lang="fr">
        <title>Un an de Nix sur macOS</title>
        <published>2026-01-17T00:00:00+00:00</published>
        <updated>2026-01-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://chukwuanu.com/fr/p/nix-on-macos/"/>
        <id>https://chukwuanu.com/fr/p/nix-on-macos/</id>
        
        <content type="html" xml:base="https://chukwuanu.com/fr/p/nix-on-macos/">&lt;p&gt;Je me souviens du moment exact où j&#x27;ai décidé d&#x27;essayer Nix. C&#x27;était un jeudi soir, vers 23h, et je fixais un terminal cassé après qu&#x27;une mise à jour macOS avait silencieusement réinitialisé mes préférences de dock, cassé trois liens symboliques Homebrew et, d&#x27;une manière ou d&#x27;une autre, changé mon Python par défaut. Encore une fois. J&#x27;entretenais mes dotfiles depuis janvier 2021 (plugins vim, thèmes zsh, configs git, tout le rituel) et tous les quelques mois, quelque chose arrêtait simplement... de fonctionner. Aucune raison claire. Juste des vibes.&lt;&#x2F;p&gt;
&lt;p&gt;Alors le 17 janvier 2025, j&#x27;ai ajouté un &lt;code&gt;flake.nix&lt;&#x2F;code&gt; à mon repo dotfiles. Je n&#x27;avais aucune idée de ce que je faisais.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;l-avant&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#l-avant&quot; aria-label=&quot;Anchor link for: l-avant&quot;&gt;L&#x27;avant&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Laisse-moi te décrire ce que j&#x27;avais. Un &lt;code&gt;.zshrc&lt;&#x2F;code&gt; qui avait grandi de façon organique pendant quatre ans. Un Brewfile à peu près exact. Un &lt;code&gt;install.sh&lt;&#x2F;code&gt; que j&#x27;avais écrit une fois, exécuté une fois, et plus jamais touché parce que j&#x27;avais peur de ce qu&#x27;il ferait. Des fichiers de config éparpillés dans &lt;code&gt;~&#x2F;.config&#x2F;&lt;&#x2F;code&gt; sans aucune trace claire de ceux que j&#x27;avais modifiés manuellement et de ceux qui venaient du repo.&lt;&#x2F;p&gt;
&lt;p&gt;Le setup &lt;em&gt;marchait&lt;&#x2F;em&gt;. Je pouvais écrire du code, pousser des commits, déployer des services. Mais à chaque fois que je devais configurer une nouvelle machine ou déboguer un chemin cassé, je passais une demi-journée à lire mon propre historique shell pour comprendre ce que j&#x27;avais fait six mois plus tôt.&lt;&#x2F;p&gt;
&lt;p&gt;Le pire, c&#x27;était la situation des émulateurs de terminal. J&#x27;étais passé d&#x27;Alacritty à Kitty puis à Ghostty, et chaque migration laissait derrière elle des fichiers de config, des entrées PATH et des caches de polices que j&#x27;oubliais jusqu&#x27;à ce qu&#x27;ils causent un conflit bizarre.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;decouvrir-nix&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#decouvrir-nix&quot; aria-label=&quot;Anchor link for: decouvrir-nix&quot;&gt;Découvrir Nix&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Nix est un de ces outils que tout le monde décrit différemment. « C&#x27;est un gestionnaire de paquets. » « C&#x27;est un système de build. » « C&#x27;est un langage de programmation fonctionnel pour la configuration système. » Tout ça est techniquement vrai et rien de tout ça ne m&#x27;a aidé à comprendre pourquoi ça devrait m&#x27;intéresser.&lt;&#x2F;p&gt;
&lt;p&gt;Ce qui a finalement cliqué, c&#x27;est ça : Nix te permet de décrire à quoi ton système devrait ressembler, puis il le rend conforme. Tu changes la description, il calcule le diff. Tu casses quelque chose, tu fais un rollback. Rien de plus.&lt;&#x2F;p&gt;
&lt;p&gt;Sur macOS, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;LnL7&#x2F;nix-darwin&quot;&gt;nix-darwin&lt;&#x2F;a&gt; étend ça au niveau système (paquets Homebrew, paramètres macOS, mapping clavier, règles de pare-feu) et &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nix-community&#x2F;home-manager&quot;&gt;Home Manager&lt;&#x2F;a&gt; gère le niveau utilisateur (dotfiles, alias shell, variables d&#x27;environnement).&lt;&#x2F;p&gt;
&lt;p&gt;Mon système, c&#x27;est maintenant deux fichiers et un Makefile. &lt;code&gt;flake.nix&lt;&#x2F;code&gt; pour le système. &lt;code&gt;home.nix&lt;&#x2F;code&gt; pour mon environnement utilisateur. &lt;code&gt;make rebuild&lt;&#x2F;code&gt; pour tout appliquer. Pas de script d&#x27;installation. Pas d&#x27;étapes manuelles. Pas de « est-ce que j&#x27;ai pensé à lancer cette commande ».&lt;&#x2F;p&gt;
&lt;h2 id=&quot;comment-ca-s-est-vraiment-passe&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#comment-ca-s-est-vraiment-passe&quot; aria-label=&quot;Anchor link for: comment-ca-s-est-vraiment-passe&quot;&gt;Comment ça s&#x27;est vraiment passé&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Ça n&#x27;a pas été instantané. En regardant mon historique git, je peux tracer exactement comment ça s&#x27;est déroulé.&lt;&#x2F;p&gt;
&lt;p&gt;Le premier &lt;code&gt;flake.nix&lt;&#x2F;code&gt; en janvier 2025 était prudent. J&#x27;ai juste déplacé quelques paquets : &lt;code&gt;neovim&lt;&#x2F;code&gt;, &lt;code&gt;ripgrep&lt;&#x2F;code&gt;, &lt;code&gt;jq&lt;&#x2F;code&gt;, &lt;code&gt;rustup&lt;&#x2F;code&gt;. J&#x27;ai aussi ajouté &lt;code&gt;nil&lt;&#x2F;code&gt; (le serveur de langage Nix) et &lt;code&gt;nixfmt&lt;&#x2F;code&gt; parce qu&#x27;éditer des fichiers Nix sans outillage, c&#x27;est comme écrire du Rust sans rust-analyzer. Techniquement possible, pratiquement misérable.&lt;&#x2F;p&gt;
&lt;p&gt;Deux mois plus tard j&#x27;ai ajouté Home Manager, et c&#x27;est là que tout a changé. Avant, je créais des liens symboliques avec un script shell en croisant les doigts. Maintenant je pouvais juste les déclarer :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#E1E4E8, #E1E4E8); background-color: light-dark(#24292E, #24292E);&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;home&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;.config&#x2F;ghostty&#x2F;config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; .&#x2F;config&#x2F;ghostty&#x2F;config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;home&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;.config&#x2F;git&#x2F;config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; .&#x2F;config&#x2F;git&#x2F;config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;home&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;.config&#x2F;zed&#x2F;settings.json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;source&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; .&#x2F;config&#x2F;zed&#x2F;settings.json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Tu modifies le fichier source, tu lances &lt;code&gt;make rebuild&lt;&#x2F;code&gt;, le lien symbolique se met à jour. Pas de &lt;code&gt;ln -sf&lt;&#x2F;code&gt;. Pas besoin de vérifier si la cible existe. Pas de nettoyage de vieux liens de trois émulateurs de terminal.&lt;&#x2F;p&gt;
&lt;p&gt;Puis en mai j&#x27;ai fait une erreur. J&#x27;ai essayé de gérer Homebrew entièrement via Nix avec un truc appelé &lt;code&gt;nix-homebrew&lt;&#x2F;code&gt;. L&#x27;idée était belle : un seul système pour tout gouverner. La réalité était fragile. Homebrew veut vraiment posséder son propre état. Les taps, les tokens de cask, les cycles de mise à jour. Il a des opinions là-dessus, et se battre contre ces opinions causait plus de problèmes qu&#x27;il n&#x27;en résolvait.&lt;&#x2F;p&gt;
&lt;p&gt;Alors j&#x27;ai tout viré. À la place, j&#x27;ai laissé nix-darwin gérer Homebrew &lt;em&gt;déclarativement&lt;&#x2F;em&gt; sans essayer de le &lt;em&gt;remplacer&lt;&#x2F;em&gt; :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#E1E4E8, #E1E4E8); background-color: light-dark(#24292E, #24292E);&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;homebrew&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;  enable&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;  onActivation&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;cleanup&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;zap&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;  onActivation&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;autoUpdate&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;  onActivation&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;upgrade&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;  brews&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;go&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;gh&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;lazygit&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;grpcurl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;  casks&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;ghostty&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;zed&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;docker-desktop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Cette ligne &lt;code&gt;onActivation.cleanup = &quot;zap&quot;&lt;&#x2F;code&gt; est la plus importante. Elle signifie : si un paquet n&#x27;est pas dans cette liste, supprime-le. Le flake devient la source de vérité. Si tu fais un &lt;code&gt;brew install&lt;&#x2F;code&gt; manuellement, ça sera supprimé au prochain rebuild. Ça te force à tout déclarer. Au début c&#x27;était agaçant. Puis c&#x27;est devenu libérateur.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;le-weekend-du-path&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#le-weekend-du-path&quot; aria-label=&quot;Anchor link for: le-weekend-du-path&quot;&gt;Le weekend du PATH&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Celui-ci mérite sa propre section parce qu&#x27;il m&#x27;a coûté deux jours et j&#x27;en suis encore un peu agacé.&lt;&#x2F;p&gt;
&lt;p&gt;Nix et Homebrew veulent tous les deux contrôler ce qui est dans ton PATH. Le daemon Nix doit être sourcé avant tout le reste, mais le &lt;code&gt;shellenv&lt;&#x2F;code&gt; de Homebrew modifie aussi le PATH. Si tu te trompes dans l&#x27;ordre, tu te retrouves à exécuter le &lt;code&gt;git&lt;&#x2F;code&gt; système au lieu de celui de Homebrew, ou le &lt;code&gt;python&lt;&#x2F;code&gt; de Homebrew au lieu de celui de &lt;code&gt;pyenv&lt;&#x2F;code&gt;. J&#x27;ai passé beaucoup de temps à fixer la sortie de &lt;code&gt;echo $PATH&lt;&#x2F;code&gt; avant d&#x27;arriver à ça :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#E1E4E8, #E1E4E8); background-color: light-dark(#24292E, #24292E);&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;programs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;zsh&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;shellInit&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;  if [ -e &amp;#39;&#x2F;nix&#x2F;var&#x2F;nix&#x2F;profiles&#x2F;default&#x2F;etc&#x2F;profile.d&#x2F;nix-daemon.sh&amp;#39; ]; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;    . &amp;#39;&#x2F;nix&#x2F;var&#x2F;nix&#x2F;profiles&#x2F;default&#x2F;etc&#x2F;profile.d&#x2F;nix-daemon.sh&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;  fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;  export PATH=&amp;quot;&#x2F;run&#x2F;current-system&#x2F;sw&#x2F;bin:&#x2F;nix&#x2F;var&#x2F;nix&#x2F;profiles&#x2F;default&#x2F;bin:$PATH&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;#39;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Les chemins Nix d&#x27;abord, puis Homebrew via &lt;code&gt;shellenv&lt;&#x2F;code&gt;, puis les chemins utilisateur. Simple avec le recul. Pas simple à 2h du matin.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;la-ou-c-est-devenu-fun&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#la-ou-c-est-devenu-fun&quot; aria-label=&quot;Anchor link for: la-ou-c-est-devenu-fun&quot;&gt;Là où c&#x27;est devenu fun&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Une fois les fondations solides, vers octobre 2025, j&#x27;ai commencé à intégrer tout ce que je configurais manuellement avant. Les associations de fichiers (Zed comme éditeur par défaut pour 38 types de fichiers, avec &lt;code&gt;duti&lt;&#x2F;code&gt;). Le remapping clavier (Caps Lock en Escape, parce que la vie est trop courte pour Caps Lock). Et celui qui m&#x27;a rendu irrationnellement heureux : les paramètres macOS.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#E1E4E8, #E1E4E8); background-color: light-dark(#24292E, #24292E);&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;system&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;defaults&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;  dock&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    autohide&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    autohide-delay&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    autohide-time-modifier&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt;15&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    show-recents&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    tilesize&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; 60&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;  NSGlobalDomain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    AppleInterfaceStyle&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;Dark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    InitialKeyRepeat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; 14&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    KeyRepeat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    ApplePressAndHoldEnabled&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    NSAutomaticCapitalizationEnabled&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    NSAutomaticSpellingCorrectionEnabled&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;La vitesse d&#x27;animation de mon dock se réinitialisait à chaque mise à jour macOS. J&#x27;oubliais, je le remarquais trois jours après, je googlais la commande &lt;code&gt;defaults write&lt;&#x2F;code&gt;, je la lançais, je l&#x27;oubliais à nouveau. Maintenant &lt;code&gt;make rebuild&lt;&#x2F;code&gt; gère ça. Pour toujours.&lt;&#x2F;p&gt;
&lt;p&gt;La sécurité aussi est déclarative. Pare-feu en mode furtif, Touch ID pour sudo, signature GPG sur tous les commits. Tout dans le flake, tout reproductible.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#E1E4E8, #E1E4E8); background-color: light-dark(#24292E, #24292E);&quot;&gt;&lt;code data-lang=&quot;nix&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;networking&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;applicationFirewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;  enable&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;  enableStealthMode&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;security&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;pam&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;services&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;sudo_local&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FFAB70, #FFAB70);&quot;&gt;touchIdAuth&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#79B8FF, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#FDAEB7, #FDAEB7);font-style: italic;&quot;&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;le-probleme-du-daemon&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#le-probleme-du-daemon&quot; aria-label=&quot;Anchor link for: le-probleme-du-daemon&quot;&gt;Le problème du daemon&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Je dois être honnête là-dessus parce que personne d&#x27;autre ne semble en parler : le daemon Nix sur macOS est capricieux. Après des mises à jour système, des cycles veille&#x2F;réveil, ou parfois sans aucune raison apparente, il arrête simplement de répondre. &lt;code&gt;nix-store --version&lt;&#x2F;code&gt; se bloque. Tout casse.&lt;&#x2F;p&gt;
&lt;p&gt;J&#x27;en ai eu marre de déboguer ça manuellement, alors j&#x27;ai écrit un script qui gère à la fois les installations Determinate Systems et les installations standard :&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#E1E4E8, #E1E4E8); background-color: light-dark(#24292E, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; -f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&#x2F;Library&#x2F;LaunchDaemons&#x2F;systems.determinate.nix-store.plist&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; launchctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; bootout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; system&#x2F;systems.determinate.nix-store&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; launchctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; bootstrap&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; system&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &#x2F;Library&#x2F;LaunchDaemons&#x2F;systems.determinate.nix-store.plist&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B392F0, #B392F0);&quot;&gt;    sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; launchctl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; bootstrap&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; system&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#9ECBFF, #9ECBFF);&quot;&gt; &#x2F;Library&#x2F;LaunchDaemons&#x2F;systems.determinate.nix-daemon.plist&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#F97583, #F97583);&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Le Makefile lance ça avant chaque rebuild. Ça ajoute environ une seconde. Ça vaut le coup de ne plus jamais penser au daemon.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;la-frontiere-homebrew&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#la-frontiere-homebrew&quot; aria-label=&quot;Anchor link for: la-frontiere-homebrew&quot;&gt;La frontière Homebrew&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Après un an d&#x27;essais et d&#x27;erreurs, j&#x27;ai appris quelque chose que j&#x27;aurais aimé qu&#x27;on me dise dès le départ : n&#x27;essaie pas de remplacer Homebrew. Contrôle-le, c&#x27;est tout.&lt;&#x2F;p&gt;
&lt;p&gt;Nix est parfait pour les binaires purs qui fonctionnent de manière identique sur toutes les plateformes. &lt;code&gt;neovim&lt;&#x2F;code&gt;, &lt;code&gt;ripgrep&lt;&#x2F;code&gt;, &lt;code&gt;jq&lt;&#x2F;code&gt;, &lt;code&gt;tree-sitter&lt;&#x2F;code&gt;. Mais dès que tu as besoin de quelque chose avec une compilation spécifique à macOS (comme &lt;code&gt;postgresql@18&lt;&#x2F;code&gt;) ou d&#x27;une app graphique (comme Ghostty ou Zed), Homebrew est simplement meilleur. Se battre contre cette frontière fait perdre du temps. Le pattern &lt;code&gt;onActivation.cleanup = &quot;zap&quot;&lt;&#x2F;code&gt; est la bonne réponse. Laisse Homebrew être Homebrew. Assure-toi juste que le flake décide de ce qu&#x27;il installe.&lt;&#x2F;p&gt;
&lt;p&gt;J&#x27;ai perdu des semaines à apprendre ça à la dure. Toi, tu n&#x27;es pas obligé.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;un-an-plus-tard&quot;&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#un-an-plus-tard&quot; aria-label=&quot;Anchor link for: un-an-plus-tard&quot;&gt;Un an plus tard&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Mon repo dotfiles a commencé en janvier 2021 avec des plugins vim et un zshrc. Cinq ans plus tard, c&#x27;est une spécification système complète et déclarative. J&#x27;ai configuré deux Macs à partir de zéro avec &lt;code&gt;make rebuild&lt;&#x2F;code&gt;. Les deux ont pris moins de 20 minutes, la plupart du temps juste à attendre les téléchargements.&lt;&#x2F;p&gt;
&lt;p&gt;Mais honnêtement, le scénario de la nouvelle installation n&#x27;arrive presque jamais. Le vrai gain est plus petit et plus fréquent. Une mise à jour macOS casse quelque chose ? Rebuild. Un nouveau projet a besoin d&#x27;un outil ? Une ligne, rebuild. Tu regrettes ? Rollback. Chaque changement est un commit. Chaque état est récupérable.&lt;&#x2F;p&gt;
&lt;p&gt;C&#x27;est ce que Nix t&#x27;offre. Pas de la magie. Juste un système qui se souvient de ce à quoi il est censé ressembler, même quand toi tu ne t&#x27;en souviens plus.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
