<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Chezmoi on recca0120 Tech Notes</title><link>https://recca0120.github.io/en/tags/chezmoi/</link><description>Recent content in Chezmoi on recca0120 Tech Notes</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 13 Apr 2026 15:30:00 +0800</lastBuildDate><atom:link href="https://recca0120.github.io/en/tags/chezmoi/index.xml" rel="self" type="application/rss+xml"/><item><title>chezmoi: One Dotfiles Repo Across macOS, Linux, and Windows</title><link>https://recca0120.github.io/en/2026/04/13/chezmoi-dotfiles-management/</link><pubDate>Mon, 13 Apr 2026 15:30:00 +0800</pubDate><guid>https://recca0120.github.io/en/2026/04/13/chezmoi-dotfiles-management/</guid><description>&lt;img src="https://recca0120.github.io/" alt="Featured image of post chezmoi: One Dotfiles Repo Across macOS, Linux, and Windows" /&gt;&lt;p&gt;My work machine is a MacBook, my home desktop runs Linux, and the company handed me a Windows NUC. All three need synced &lt;code&gt;.gitconfig&lt;/code&gt;, &lt;code&gt;.zshrc&lt;/code&gt;, &lt;code&gt;.tmux.conf&lt;/code&gt; — but each OS has quirks. Windows needs &lt;code&gt;sslCAInfo&lt;/code&gt; pointing at scoop&amp;rsquo;s git cert bundle; macOS uses Homebrew; Linux uses apt.&lt;/p&gt;
&lt;p&gt;I used to hack it with symlinks and shell scripts. Now I use &lt;a class="link" href="https://github.com/twpayne/chezmoi" target="_blank" rel="noopener"
 &gt;chezmoi&lt;/a&gt;. One dotfiles repo, three machines, one-line setup.&lt;/p&gt;
&lt;h2 id="why-not-stow-yadm-or-dotbot"&gt;&lt;a href="#why-not-stow-yadm-or-dotbot" class="header-anchor"&gt;&lt;/a&gt;Why Not stow, yadm, or dotbot
&lt;/h2&gt;&lt;p&gt;Plenty of dotfiles managers exist. chezmoi wins on three fronts:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Go templates&lt;/strong&gt;: the same file renders differently per OS, no need to maintain three &lt;code&gt;.gitconfig&lt;/code&gt; variants&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native encryption&lt;/strong&gt;: age and gpg are first-class, so secrets can live in a public repo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;onchange scripts&lt;/strong&gt;: the Homebrew bootstrap only re-runs when the package list actually changes&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;stow is pure symlinks, no templating. yadm wraps git, templating via plugins. dotbot needs a YAML manifest. chezmoi bundles it all into one binary.&lt;/p&gt;
&lt;h2 id="install-and-init"&gt;&lt;a href="#install-and-init" class="header-anchor"&gt;&lt;/a&gt;Install and Init
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# macOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install chezmoi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sh -c &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -fsLS get.chezmoi.io&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winget install twpayne.chezmoi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Bootstrap a new machine from an existing repo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi init --apply https://github.com/YOUR_USERNAME/dotfiles.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That single line clones the repo, runs the template engine, and writes everything to &lt;code&gt;$HOME&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="filename-attribute-system"&gt;&lt;a href="#filename-attribute-system" class="header-anchor"&gt;&lt;/a&gt;Filename Attribute System
&lt;/h2&gt;&lt;p&gt;chezmoi uses &lt;strong&gt;filename prefixes&lt;/strong&gt; to encode behavior. The repo layout itself is the manifest — no separate config needed.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Prefix&lt;/th&gt;
 &lt;th&gt;Effect&lt;/th&gt;
 &lt;th&gt;Example&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;dot_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Target is a hidden file&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;dot_zshrc&lt;/code&gt; → &lt;code&gt;~/.zshrc&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;private_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;User-only permissions (0600)&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;private_dot_ssh&lt;/code&gt; → &lt;code&gt;~/.ssh&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;executable_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Sets executable bit&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;executable_bin_foo&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;encrypted_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;age/gpg encrypted&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;encrypted_dot_env&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;symlink_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Creates a symlink&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;symlink_dot_bashrc&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;readonly_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Strips write permissions&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;readonly_dot_config.toml&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;.tmpl&lt;/code&gt; suffix&lt;/td&gt;
 &lt;td&gt;Run through template engine&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;dot_gitconfig.tmpl&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Prefixes stack. My repo has combinations like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;private_executable_dot_php-cs-fixer.dist.php → ~/.php-cs-fixer.dist.php (0700)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;private_dot_ssh/ → ~/.ssh (whole dir at 0700)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="templates-for-machine-differences"&gt;&lt;a href="#templates-for-machine-differences" class="header-anchor"&gt;&lt;/a&gt;Templates for Machine Differences
&lt;/h2&gt;&lt;p&gt;This is chezmoi&amp;rsquo;s killer feature. My &lt;code&gt;dot_gitconfig.tmpl&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gotmpl" data-lang="gotmpl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt;[user]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; name = &lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;quote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; email = &lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;quote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt;[http]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; sslBackend = openssl
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.os&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;windows&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-}}&lt;/span&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; sslCAInfo = &lt;/span&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.homeDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\\&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-}}&lt;/span&gt;&lt;span class="x"&gt;/scoop/apps/git/current/mingw64/ssl/certs/ca-bundle.crt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt;[core]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; autocrlf = false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; symlinks = true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;.name&lt;/code&gt; and &lt;code&gt;.email&lt;/code&gt; come from &lt;code&gt;~/.config/chezmoi/chezmoi.toml&lt;/code&gt;, so each machine can have its own values. The &lt;code&gt;{{ if eq .chezmoi.os &amp;quot;windows&amp;quot; }}&lt;/code&gt; block only expands on Windows. On apply, chezmoi strips the &lt;code&gt;.tmpl&lt;/code&gt; and writes a clean &lt;code&gt;.gitconfig&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Built-in variables I reach for constantly:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gotmpl" data-lang="gotmpl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.os&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt; # &amp;#34;darwin&amp;#34; / &amp;#34;linux&amp;#34; / &amp;#34;windows&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.arch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt; # &amp;#34;amd64&amp;#34; / &amp;#34;arm64&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.hostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt; # machine name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt; # login user
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.homeDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt; # home directory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Preview a template without applying:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi execute-template &amp;lt; dot_gitconfig.tmpl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="age-encryption-for-secrets"&gt;&lt;a href="#age-encryption-for-secrets" class="header-anchor"&gt;&lt;/a&gt;Age Encryption for Secrets
&lt;/h2&gt;&lt;p&gt;My repo is public, but it contains an SSH key and database password backups. Those are encrypted with &lt;a class="link" href="https://github.com/FiloSottile/age" target="_blank" rel="noopener"
 &gt;age&lt;/a&gt; before they ever hit a commit.&lt;/p&gt;
&lt;p&gt;Generate an age key:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;age-keygen -o ~/key.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Public key: age1examplepublickeyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Configure &lt;code&gt;~/.config/chezmoi/chezmoi.toml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;encryption&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;age&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;identity&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;~/key.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;age1examplepublickeyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Add files with &lt;code&gt;--encrypt&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi add --encrypt ~/.ssh/id_ed25519
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The repo only ever stores &lt;code&gt;private_dot_ssh/encrypted_private_id_ed25519.age&lt;/code&gt; — opaque ciphertext. On apply, chezmoi decrypts using &lt;code&gt;~/key.txt&lt;/code&gt; and writes the plaintext to the target.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The one catastrophic footgun&lt;/strong&gt;: &lt;code&gt;key.txt&lt;/code&gt; itself &lt;strong&gt;must never land in the repo&lt;/strong&gt;. My workflow: GPG-encrypt it and stash it in a password manager. New machines must restore &lt;code&gt;key.txt&lt;/code&gt; manually before running &lt;code&gt;chezmoi init --apply&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="run_onchange-reinstall-only-when-lists-change"&gt;&lt;a href="#run_onchange-reinstall-only-when-lists-change" class="header-anchor"&gt;&lt;/a&gt;run_onchange: Reinstall Only When Lists Change
&lt;/h2&gt;&lt;p&gt;My &lt;code&gt;.chezmoiscripts/darwin/run_onchange_00_install-packages.sh.tmpl&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; eq .chezmoi.os &lt;span class="s2"&gt;&amp;#34;darwin&amp;#34;&lt;/span&gt; -&lt;span class="o"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install mas
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install asdf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;asdf plugin add nodejs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;asdf install nodejs latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; nodejs latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ... many more asdf installs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{{&lt;/span&gt; end -&lt;span class="o"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The &lt;code&gt;run_onchange_&lt;/code&gt; prefix is the key: chezmoi only runs this script when its &lt;strong&gt;content hash changes&lt;/strong&gt;. Unchanged package list means no re-run — no more five-minute &lt;code&gt;brew install&lt;/code&gt; cycles through already-installed tools on every &lt;code&gt;chezmoi apply&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Script naming variants:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Prefix&lt;/th&gt;
 &lt;th&gt;When It Runs&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;run_once_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Once per machine, ever, for given content&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;run_onchange_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Whenever the contents change&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;run_onchange_before_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;Before&lt;/strong&gt; file application (install package manager first)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;run_onchange_after_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;After&lt;/strong&gt; file application (enable fish plugins last)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The numeric prefix (&lt;code&gt;00_&lt;/code&gt;, &lt;code&gt;01_&lt;/code&gt;, &lt;code&gt;02_&lt;/code&gt;) controls execution order.&lt;/p&gt;
&lt;h2 id="chezmoiroot-source-lives-in-a-subdirectory"&gt;&lt;a href="#chezmoiroot-source-lives-in-a-subdirectory" class="header-anchor"&gt;&lt;/a&gt;.chezmoiroot: Source Lives in a Subdirectory
&lt;/h2&gt;&lt;p&gt;All my files live under &lt;code&gt;home/&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotfiles/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .chezmoiroot # contains just &amp;#34;home&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── Readme.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── install.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── install.ps1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── home/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── dot_zshrc.tmpl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── dot_gitconfig.tmpl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── .chezmoiscripts/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;.chezmoiroot&lt;/code&gt; tells chezmoi &amp;ldquo;source files are under &lt;code&gt;home/&lt;/code&gt;&amp;rdquo;. Now the repo root can host a README, install scripts, and other project artifacts without chezmoi trying to apply them as dotfiles.&lt;/p&gt;
&lt;p&gt;Great for treating your dotfiles repo like a normal project.&lt;/p&gt;
&lt;h2 id="chezmoiignore-skip-certain-files"&gt;&lt;a href="#chezmoiignore-skip-certain-files" class="header-anchor"&gt;&lt;/a&gt;.chezmoiignore: Skip Certain Files
&lt;/h2&gt;&lt;p&gt;Same syntax as &lt;code&gt;.gitignore&lt;/code&gt;, but it supports templates:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;README.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LICENSE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ if ne .chezmoi.os &amp;#34;darwin&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.aerospace.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Library/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Non-macOS machines skip the aerospace window manager config and the Library folder.&lt;/p&gt;
&lt;h2 id="command-cheat-sheet"&gt;&lt;a href="#command-cheat-sheet" class="header-anchor"&gt;&lt;/a&gt;Command Cheat Sheet
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi add ~/.vimrc &lt;span class="c1"&gt;# track an existing file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi add --encrypt ~/.env &lt;span class="c1"&gt;# track encrypted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi edit ~/.zshrc &lt;span class="c1"&gt;# edit the source file directly&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi diff &lt;span class="c1"&gt;# show pending changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi apply &lt;span class="c1"&gt;# write to $HOME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi apply --dry-run -v &lt;span class="c1"&gt;# preview without writing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="c1"&gt;# jump to source directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi update &lt;span class="c1"&gt;# git pull + apply&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi doctor &lt;span class="c1"&gt;# check environment health&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;chezmoi doctor&lt;/code&gt; reports the status of encryption tools, template engine, git, and friends. First thing to run when a new machine misbehaves.&lt;/p&gt;
&lt;h2 id="combined-with-zoxide-fish-and-more"&gt;&lt;a href="#combined-with-zoxide-fish-and-more" class="header-anchor"&gt;&lt;/a&gt;Combined with &lt;a class="link" href="https://recca0120.github.io/en/2026/04/13/zoxide-smarter-cd/" &gt;zoxide&lt;/a&gt;, fish, and More
&lt;/h2&gt;&lt;p&gt;My fish config, zoxide init, tmux plugins — all managed by chezmoi. New machine ritual:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Restore the age key&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sh -c &amp;quot;$(curl -fsLS get.chezmoi.io)&amp;quot; -- init --apply recca0120&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;run_onchange scripts install CLI tools via brew / apt / scoop&lt;/li&gt;
&lt;li&gt;All configs land in place&lt;/li&gt;
&lt;li&gt;Open fish — zoxide, starship, fzf are already wired up&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;About 20 minutes end to end, most of it waiting on &lt;code&gt;brew install&lt;/code&gt; downloads.&lt;/p&gt;
&lt;h2 id="downsides-and-gotchas"&gt;&lt;a href="#downsides-and-gotchas" class="header-anchor"&gt;&lt;/a&gt;Downsides and Gotchas
&lt;/h2&gt;&lt;p&gt;chezmoi isn&amp;rsquo;t free of friction:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Template learning curve&lt;/strong&gt;: Go template syntax isn&amp;rsquo;t beginner-friendly. Whitespace handling with &lt;code&gt;{{- }}&lt;/code&gt; vs. &lt;code&gt;{{ }}&lt;/code&gt; takes practice&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Painful debugging&lt;/strong&gt;: template expansion errors are terse — I lean on &lt;code&gt;chezmoi execute-template&lt;/code&gt; to isolate problems&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Age key stewardship&lt;/strong&gt;: lose the key, lose every encrypted file forever. Back it up separately (I GPG-encrypt and park it in a password manager)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;First apply is destructive&lt;/strong&gt;: if &lt;code&gt;$HOME&lt;/code&gt; already has hand-edited dotfiles, apply overwrites them. Always &lt;code&gt;chezmoi diff&lt;/code&gt; first&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="references"&gt;&lt;a href="#references" class="header-anchor"&gt;&lt;/a&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/twpayne/chezmoi" target="_blank" rel="noopener"
 &gt;chezmoi GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.chezmoi.io/" target="_blank" rel="noopener"
 &gt;chezmoi Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.chezmoi.io/quick-start/" target="_blank" rel="noopener"
 &gt;chezmoi Quick Start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/FiloSottile/age" target="_blank" rel="noopener"
 &gt;age — Simple File Encryption&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://natelandau.com/managing-dotfiles-with-chezmoi/" target="_blank" rel="noopener"
 &gt;Managing Dotfiles With Chezmoi — Nathaniel Landau&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>