Workflow

Dotfiles in 2026: Why I Finally Stopped Copying Other People's

Terminal with custom prompt

For three years my dotfiles were a graveyard. Aliases for tools I didn't use anymore. Shell functions copied from blog posts I don't remember. A Vim config that grew one plugin at a time until I was afraid to change it. Git configuration I didn't understand but was scared to remove.

Last January I deleted everything and started over. Here's what I learned.

The cargo-culting problem

Most dotfile repos online were written by people with different workflows, different tools, and different opinions than mine. Copying from them gave me configuration that worked for their patterns, not mine. The alias gco for git checkout is fine if you type git checkout fifty times a day. I use git switch and I do it maybe ten times a day. The alias was solving someone else's problem.

The deeper issue: copied configuration I didn't write is configuration I can't debug. When something behaved unexpectedly I had no idea why, because I didn't write the thing that was misbehaving.

Starting over

I moved my existing dotfiles to a backup directory and started with empty configs. Then I waited for friction. When I typed a command and wished I had an alias, I added one. When I hit a workflow problem, I solved it. When I didn't miss something for two weeks, I didn't add it back.

After six months I had about 20% of what I started with. Everything in those files I understand, because I wrote it in response to a specific problem I actually had.

Structure: chezmoi

I use chezmoi for managing and syncing dotfiles across machines. It handles templates (so I can have slightly different config on Linux vs macOS), secrets (via age encryption for the few things that are sensitive), and a clean chezmoi apply workflow for updates.

Before chezmoi I used a bare Git repo approach. It works, but chezmoi's template support for machine-specific differences is worth the additional layer.

What's actually in there now

fish config: ~80 lines. Mostly prompt config and a dozen functions. I switched from zsh two years ago and haven't looked back — fish's autosuggestions alone are worth the incompatible-with-bash syntax.

Neovim config: ~350 lines of Lua across a few files. Seven plugins. Nothing decorative.

git config: The things that are actually mine — my name, my editor, pull.rebase = true, a rerere.enabled = true I keep because merge conflict resolution is annoying enough that I want Git to remember what I did. A few aliases: lg for a compact log view, sw for switch, st for status -s.

SSH config: Host aliases for servers I access regularly. Nothing exotic.

What I didn't add back

A custom prompt with git status indicators — the latency in large repos isn't worth it for me. Tmux — I use terminal tabs. A file manager — I use the shell. A notification system — I look at things when I look at them. Most of the zsh plugins I had — they were solving problems fish either doesn't have or handles natively.

The dotfiles are smaller, faster to apply on a new machine, and easier to explain to someone else. That last part turned out to matter more than I expected.


All posts · SQLite →