My Dotfiles and the Tools I Use (2026 Edition)
A tour of my dotfiles: how I bootstrap a new Mac, the terminal and shell setup, the CLI tools I have swapped in, and how AI agents fit into the workflow. A living post I update every year with what changed.
I have carried the same dotfiles from machine to machine for years. Every so often it is worth pruning them and writing down what I actually use and why. The whole thing lives in the open at abtris/dotfiles, so if something here looks useful, take it.
This is the 2026 edition. I plan to keep it as a living post and update it once a year, so the “What changed this year” section below is really the interesting part if you have read it before.
What changed this year
Most of this year’s changes were around the terminal and coding agents.
- New terminal: Ghostty. I moved off my previous terminal to Ghostty and cleaned up the config along the way.
- New multiplexer: Herdr, and I dropped cmux. Herdr is
built for driving coding agents across panes and workspaces. I added Ghostty
keybinds for its prefix and
CMD+SHIFT+arrowworkspace navigation, plus anhnewworkspace that opens an agent tab next to a terminal tab. - AI agents became a daily driver. Claude Code
and pi are now part of the loop, with telemetry env and an
agentsalias wired in. Along the way I tried and dropped several other harnesses (Augment came and went) which is exactly the point of keeping the harness swappable. - lsd replaced
lsand jj (Jujutsu) joined the toolbox next to Git for experimentation. - mise took over runtime version management, and I
added Git worktree aliases and reworked my fzf-based
j()jump command. - Installer and Brewfile sync got modernized, including a fix for a pre-commit hook SIGPIPE bug on large staged files. The installer now treats a target that already resolves to the source as linked instead of flagging a false conflict.
Everything below is the current state after those changes.
Bootstrapping a new Mac
Setup is deliberately boring. Install Homebrew and Oh My Zsh, clone the repo, and run the installer:
mkdir -p ~/bin && cd ~/bin
git clone https://github.com/abtris/dotfiles.git
cd dotfiles
[ "$(id -un)" = abtris ] && brewfile=Brewfile || brewfile=Brewfile.work
brew bundle --file "./$brewfile"
./install
Two decisions keep this manageable. First, packages are tracked as full
Brewfile snapshots, one for my home Mac and one for work. Each file is a
complete image of the machine, not a curated wishlist, so a fresh install
reproduces exactly what I had. An update-brewfile script picks the right file
based on the username and I review the diff before committing.
Second, ./install only creates missing symlinks. It reports any existing file
as a conflict instead of overwriting it, so it never clobbers something I forgot
about. Safe to rerun any time.
Terminal and shell
- Terminal: Ghostty. The new terminal written in Zig by Mitchell Hashimoto. Fast, native, sensible defaults.
- Multiplexer: Herdr. A terminal multiplexer built for driving coding agents across panes and workspaces.
- Shell: still Zsh with Oh My Zsh. I keep asking myself whether Fish would buy me anything, and honestly nushell is the more interesting bet if I ever move. For now Zsh stays.
- Prompt: Starship. I switched from a hand-rolled
PS1; the Kubernetes, Azure, and Go segments alone earn their keep. My config is starship.toml.
The CLI tools I have swapped in
Most of these are drop-in replacements for the standard Unix tools, faster and with better defaults:
- lsd instead of
ls. - bat instead of
cat. - ripgrep (
rg) instead ofgrepandack. - fzf for fuzzy finding. I wire it into a
small
j()function that combinesfindandfzfto jump straight into a project directory. - zoxide for a smarter
cdthat learns the directories I actually visit. - atuin for shell history that is searchable and synced.
- dog instead of
dig. - delta as the syntax-highlighting
pager for
git,diff, andgrep.
For anything with a UI in the terminal:
Dev environment
- Runtime versions: mise (formerly rtx). This solved my long-standing annoyance of auto-switching the Python venv per project, the same thing rbenv and nvm do for their ecosystems, but universal across languages.
- Source control: still plain Git with a pile of aliases and a shared config. I keep wanting to try something else, but GitHub keeps removing my reasons to switch. This year I did start experimenting with Jujutsu (jj) alongside Git; the jury is still out.
- Editor: VSCode, nothing exotic. The Go plugin for development, plus FindItFaster to get fzf-style search inside the editor.
AI agents in the workflow
Coding agents are now part of the daily loop. I run Claude Code and pi. I have written before about why I would not bet a whole company on a single closed harness, and my personal setup reflects that: keep the harness something you control, treat the model as swappable.
The piece that makes agents reusable is skills, small packaged capabilities I
add to the harness with npx skills add. For example, Herdr ships
one:
npx skills add ogulcancelik/herdr --skill herdr -g
Everything is Catppuccin
One small thing that makes the whole setup feel coherent: I use Catppuccin as the color scheme everywhere, the terminal, Starship, lsd, k9s, mc, all of it. It is a low-effort way to make a dozen unrelated tools look like they belong together.
Beyond the terminal
A few desktop tools round it out:
- Knowledge base: Logseq, synced over a private repo. I wrote a whole post on how I use Logseq as a personal knowledge base.
- Research and citations: Zotero.
- Passwords: 1Password.
- Launcher: LaunchBar. Raycast is probably the better choice today, but I have not felt enough pain to switch.
- Window management: Magnet. I want to try AeroSpace, an i3-like tiling manager that does not need SIP disabled the way yabai does, but have not made time yet.
Takeaways
- Track your packages as full machine snapshots, not a hand-curated list, so a fresh install actually reproduces your setup.
- Make your installer safe to rerun: create missing links, never overwrite.
- The modern CLI replacements (lsd, bat, ripgrep, fzf, zoxide, atuin, delta) are worth the muscle-memory change.
- Keep the AI harness under your control and the model swappable.
- One color scheme everywhere is a cheap way to make an ad-hoc toolkit feel designed.
The full configuration is at abtris/dotfiles if you want to dig into the details.