{
  "version": "https://jsonfeed.org/version/1",
  "title": "Dotfiles on LLBBL Blog",
  "icon": "https://avatars.micro.blog/avatars/2023/40/125738.jpg",
  "home_page_url": "https://llbbl.blog/",
  "feed_url": "https://llbbl.blog/feed.json",
  "items": [
      {
        "id": "http://llbbl.micro.blog/2026/05/19/a-dotfiles-manager-that-snapshots.html",
        "title": "A Dotfiles Manager That Snapshots Every Change",
        "content_html": "<p>Managing dotfiles in 2026 is a solved problem in the same way that managing your own backups is a solved problem: there are five tools for it, all of them work, all of them require you to set up some plumbing first, and once you&rsquo;re set up you still don&rsquo;t have a great answer to &ldquo;I just broke my shell config, get me back to yesterday.&rdquo;</p>\n<p>The conventional answer is some combination of: a git repo for your <code>~/.zshrc</code> and friends, a symlink script (or <code>stow</code>, or <code>chezmoi</code>, or <code>yadm</code>), and the discipline to remember to commit after every change. The setup is a one-time hassle. The &ldquo;wait, what did I change?&rdquo; recovery story is not great. And if you want to sync across machines, you&rsquo;ve now got opinions about remote repos, SSH keys on a fresh box, and which order things have to happen in.</p>\n<p>I wanted something different, so not a configuration framework, but a record of every change to the files I care about, in a place I can roll back from, with the lowest possible setup cost.</p>\n<p>That&rsquo;s what <a href=\"https://github.com/llbbl/dotfiles-manager\">dfm</a> is.</p>\n<h2 id=\"what-it-does\">What It Does</h2>\n<p><code>dfm</code> is a single static Go binary. You point it at the files you want to track (<code>~/.zshrc</code>, anything under <code>~/.config/</code>, whatever), and every time one of them changes it takes a content-addressed snapshot. The snapshots live on disk in <code>~/.local/share/dotfiles/backups/</code>. A small state database (SQLite locally, or libSQL via Turso if you want cross-machine sync) records which file maps to which snapshot at which point in time.</p>\n<p>You can roll back. You can diff against an old snapshot. You can see when you last touched a file. And because every snapshot is content-addressed, you never re-store the same bytes twice — switching themes in <code>~/.zshrc</code> ten times costs the size of two configs, not ten.</p>\n<p>The other half is the backup story. <code>dfm init</code> walks you through cloning (or creating, via <code>gh</code>) a private GitHub repo that mirrors your tracked files plus their history. The point isn&rsquo;t to make you adopt a new git workflow. It&rsquo;s that pulling your config onto a fresh machine should be one command, and recovering from <code>rm -rf</code> should never have a &ldquo;well, hopefully my last commit was recent&rdquo; caveat.</p>\n<h2 id=\"why-setup-is-the-hard-part\">Why Setup Is the Hard Part</h2>\n<p>The reason people don&rsquo;t audit their dotfiles is the same reason people don&rsquo;t back up their laptops: the setup is annoying, and the payoff is theoretical until it isn&rsquo;t.</p>\n<p><code>dfm init</code> is a six-step interactive wizard. It detects a <code>TURSO_DATABASE_URL</code> env var if you&rsquo;ve got one, offers sensible defaults for everything else, lets you opt in to tracking <code>~/.zshrc</code> immediately, and writes a single config file with the right permissions. Re-run it on an existing config and it pre-fills every prompt with your current value, so the cost of changing your mind later is also low. <code>--yes</code> accepts every default for scripted setup.</p>\n<p>If that sounds boring, that&rsquo;s the point. Boring is what makes a tool actually get used.</p>\n<h2 id=\"the-ai-bit\">The AI Bit</h2>\n<p>There&rsquo;s an optional AI integration. <code>dfm suggest &lt;file&gt;</code> asks a local AI CLI (Claude Code by default, configurable) to propose an improvement to one of your tracked files, returns the proposal as a unified diff, and stores it as a pending suggestion. <code>dfm apply &lt;id&gt;</code> reviews the diff and applies it, with a fresh snapshot first, so you can roll back if the suggestion turns out to be wrong.</p>\n<p>I&rsquo;m exited to try this feature out, because I&rsquo;m sure there is something i&quot;m doing wrong. The &ldquo;Look at my <code>~/.zshrc</code> and tell me what I could clean up&rdquo; is useful feature that doesn&rsquo;t require me copy and pasting or granting read or write access to my entire home directory.</p>\n<h2 id=\"where-to-get-it\">Where to Get It</h2>\n<p><a href=\"https://github.com/llbbl/dotfiles-manager\">github.com/llbbl/dotfiles-manager</a>. Pre-built binaries for darwin and linux on arm64/amd64. Current version, as of writing, is v1.4.0.</p>\n<p>If you&rsquo;ve been meaning to actually back up your dotfiles and the friction has stopped you, this is the post where I tell you the friction is solvable.</p>\n<p>I&rsquo;d appreciate a follow. You can subscribe with your email below. The emails go out once a week, or you can find me on Mastodon at <a href=\"https://micro.blog/llbbl?remote_follow=1\">@logan@llbbl.blog</a>.</p>\n",
        "date_published": "2026-05-19T10:00:00-05:00",
        "url": "https://llbbl.blog/2026/05/19/a-dotfiles-manager-that-snapshots.html",
        "tags": ["DevOps","AI","Programming","Go","Dotfiles"]
      }
  ]
}
