◆ Post 2026.07.20 · 5 min read #dotfiles #tooling #cli #macos

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+arrow workspace navigation, plus an hnew workspace 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 agents alias 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 ls and 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 of grep and ack.
  • fzf for fuzzy finding. I wire it into a small j() function that combines find and fzf to jump straight into a project directory.
  • zoxide for a smarter cd that 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, and grep.

For anything with a UI in the terminal:

  • k9s for Kubernetes.
  • mc (Midnight Commander) when I want a file manager in the console.

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:

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.