<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cli on Prskavec.Net</title><link>https://www.prskavec.net/tags/cli/</link><description>Personal site of Ladislav Prskavec — Software Engineer &amp; Site Reliability Engineer in Prague. Writing, conference talks, an OnCall design guide, and the You Build It You Run It podcast.</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>ladislav@prskavec.net (Prskavec.Net)</managingEditor><webMaster>ladislav@prskavec.net (Prskavec.Net)</webMaster><copyright>&amp;copy; {year} Ladislav Prskavec</copyright><lastBuildDate>Mon, 20 Jul 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.prskavec.net/tags/cli/index.xml" rel="self" type="application/rss+xml"/><item><title>My Dotfiles and the Tools I Use (2026 Edition)</title><link>https://www.prskavec.net/post/my-dotfiles-and-the-tools-i-use/</link><pubDate>Mon, 20 Jul 2026 09:00:00 +0200</pubDate><author>ladislav@prskavec.net (Prskavec.Net)</author><guid>https://www.prskavec.net/post/my-dotfiles-and-the-tools-i-use/</guid><description>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.</description><content:encoded>&lt;p&gt;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 &lt;a href="https://github.com/abtris/dotfiles"&gt;abtris/dotfiles&lt;/a&gt;,
so if something here looks useful, take it.&lt;/p&gt;
&lt;p&gt;This is the 2026 edition. I plan to keep it as a living post and update it once a
year, so the &amp;ldquo;What changed this year&amp;rdquo; section below is really the interesting
part if you have read it before.&lt;/p&gt;
&lt;h2 id="what-changed-this-year"&gt;What changed this year&lt;/h2&gt;
&lt;p&gt;Most of this year&amp;rsquo;s changes were around the terminal and coding agents.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New terminal: &lt;a href="https://ghostty.org/"&gt;Ghostty&lt;/a&gt;.&lt;/strong&gt; I moved off my previous
terminal to Ghostty and cleaned up the config along the way.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New multiplexer: &lt;a href="https://herdr.dev/"&gt;Herdr&lt;/a&gt;, and I dropped cmux.&lt;/strong&gt; Herdr is
built for driving coding agents across panes and workspaces. I added Ghostty
keybinds for its prefix and &lt;code&gt;CMD+SHIFT+arrow&lt;/code&gt; workspace navigation, plus an
&lt;code&gt;hnew&lt;/code&gt; workspace that opens an agent tab next to a terminal tab.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI agents became a daily driver.&lt;/strong&gt; &lt;a href="https://www.anthropic.com/claude-code"&gt;Claude Code&lt;/a&gt;
and &lt;a href="https://pi.dev/"&gt;pi&lt;/a&gt; are now part of the loop, with telemetry env and an
&lt;code&gt;agents&lt;/code&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/lsd-rs/lsd"&gt;lsd&lt;/a&gt; replaced &lt;code&gt;ls&lt;/code&gt;&lt;/strong&gt; and
&lt;strong&gt;&lt;a href="https://github.com/jj-vcs/jj"&gt;jj&lt;/a&gt; (Jujutsu)&lt;/strong&gt; joined the toolbox next to Git
for experimentation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://mise.jdx.dev/"&gt;mise&lt;/a&gt;&lt;/strong&gt; took over runtime version management, and I
added Git worktree aliases and reworked my fzf-based &lt;code&gt;j()&lt;/code&gt; jump command.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Installer and Brewfile sync got modernized,&lt;/strong&gt; including a fix for a
&lt;a href="https://github.com/abtris/dotfiles/blob/master/git/.gittemplate/hooks/pre-commit"&gt;pre-commit hook SIGPIPE bug&lt;/a&gt;
on large staged files. The installer now treats a target that already resolves
to the source as linked instead of flagging a false conflict.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Everything below is the current state after those changes.&lt;/p&gt;
&lt;h2 id="bootstrapping-a-new-mac"&gt;Bootstrapping a new Mac&lt;/h2&gt;
&lt;p&gt;Setup is deliberately boring. Install &lt;a href="https://brew.sh/"&gt;Homebrew&lt;/a&gt; and
&lt;a href="https://ohmyz.sh/"&gt;Oh My Zsh&lt;/a&gt;, clone the repo, and run the installer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir -p ~/bin &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; cd ~/bin
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/abtris/dotfiles.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd dotfiles
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;id -un&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; abtris &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brewfile&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Brewfile &lt;span style="color:#f92672"&gt;||&lt;/span&gt; brewfile&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Brewfile.work
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew bundle --file &lt;span style="color:#e6db74"&gt;&amp;#34;./&lt;/span&gt;$brewfile&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Two decisions keep this manageable. First, packages are tracked as full
&lt;code&gt;Brewfile&lt;/code&gt; 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 &lt;code&gt;update-brewfile&lt;/code&gt; script picks the right file
based on the username and I review the diff before committing.&lt;/p&gt;
&lt;p&gt;Second, &lt;code&gt;./install&lt;/code&gt; 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.&lt;/p&gt;
&lt;h2 id="terminal-and-shell"&gt;Terminal and shell&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Terminal: &lt;a href="https://ghostty.org/"&gt;Ghostty&lt;/a&gt;.&lt;/strong&gt; The new terminal written in
&lt;a href="https://ziglang.org/"&gt;Zig&lt;/a&gt; by &lt;a href="https://mitchellh.com/ghostty"&gt;Mitchell Hashimoto&lt;/a&gt;.
Fast, native, sensible defaults.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiplexer: &lt;a href="https://herdr.dev/"&gt;Herdr&lt;/a&gt;.&lt;/strong&gt; A terminal multiplexer built for
driving coding agents across panes and workspaces.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shell: still Zsh with &lt;a href="https://ohmyz.sh/"&gt;Oh My Zsh&lt;/a&gt;.&lt;/strong&gt; I keep asking myself
whether Fish would buy me anything, and honestly &lt;a href="https://www.nushell.sh/"&gt;nushell&lt;/a&gt;
is the more interesting bet if I ever move. For now Zsh stays.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompt: &lt;a href="https://starship.rs/"&gt;Starship&lt;/a&gt;.&lt;/strong&gt; I switched from a hand-rolled
&lt;code&gt;PS1&lt;/code&gt;; the Kubernetes, Azure, and Go segments alone earn their keep. My config
is &lt;a href="https://github.com/abtris/dotfiles/blob/master/starship.toml"&gt;starship.toml&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-cli-tools-i-have-swapped-in"&gt;The CLI tools I have swapped in&lt;/h2&gt;
&lt;p&gt;Most of these are drop-in replacements for the standard Unix tools, faster and
with better defaults:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/lsd-rs/lsd"&gt;lsd&lt;/a&gt;&lt;/strong&gt; instead of &lt;code&gt;ls&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/sharkdp/bat"&gt;bat&lt;/a&gt;&lt;/strong&gt; instead of &lt;code&gt;cat&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/BurntSushi/ripgrep"&gt;ripgrep&lt;/a&gt;&lt;/strong&gt; (&lt;code&gt;rg&lt;/code&gt;) instead of &lt;code&gt;grep&lt;/code&gt;
and &lt;code&gt;ack&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/junegunn/fzf"&gt;fzf&lt;/a&gt;&lt;/strong&gt; for fuzzy finding. I wire it into a
small &lt;code&gt;j()&lt;/code&gt; function that combines &lt;code&gt;find&lt;/code&gt; and &lt;code&gt;fzf&lt;/code&gt; to jump straight into a
project directory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/ajeetdsouza/zoxide"&gt;zoxide&lt;/a&gt;&lt;/strong&gt; for a smarter &lt;code&gt;cd&lt;/code&gt; that
learns the directories I actually visit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/atuinsh/atuin"&gt;atuin&lt;/a&gt;&lt;/strong&gt; for shell history that is
searchable and synced.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/ogham/dog"&gt;dog&lt;/a&gt;&lt;/strong&gt; instead of &lt;code&gt;dig&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/dandavison/delta"&gt;delta&lt;/a&gt;&lt;/strong&gt; as the syntax-highlighting
pager for &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;diff&lt;/code&gt;, and &lt;code&gt;grep&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For anything with a UI in the terminal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://k9scli.io/"&gt;k9s&lt;/a&gt;&lt;/strong&gt; for Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/MidnightCommander/mc"&gt;mc&lt;/a&gt;&lt;/strong&gt; (Midnight Commander) when I
want a file manager in the console.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dev-environment"&gt;Dev environment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Runtime versions: &lt;a href="https://mise.jdx.dev/"&gt;mise&lt;/a&gt;&lt;/strong&gt; (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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Source control: still plain Git&lt;/strong&gt; with a pile of
&lt;a href="https://github.com/abtris/dotfiles/blob/master/bash/aliases"&gt;aliases&lt;/a&gt; and a
shared &lt;a href="https://github.com/abtris/dotfiles/blob/master/git/.gitconfig"&gt;config&lt;/a&gt;.
I keep wanting to try something else, but GitHub keeps removing my reasons to
switch. This year I did start experimenting with
&lt;a href="https://github.com/jj-vcs/jj"&gt;Jujutsu (jj)&lt;/a&gt; alongside Git; the jury is still
out.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Editor: &lt;a href="https://code.visualstudio.com/"&gt;VSCode&lt;/a&gt;,&lt;/strong&gt; nothing exotic. The Go
plugin for development, plus
&lt;a href="https://marketplace.visualstudio.com/items?itemName=TomRijndorp.find-it-faster"&gt;FindItFaster&lt;/a&gt;
to get fzf-style search inside the editor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ai-agents-in-the-workflow"&gt;AI agents in the workflow&lt;/h2&gt;
&lt;p&gt;Coding agents are now part of the daily loop. I run &lt;a href="https://www.anthropic.com/claude-code"&gt;Claude Code&lt;/a&gt;
and &lt;a href="https://pi.dev/"&gt;pi&lt;/a&gt;. I have &lt;a href="https://www.prskavec.net/post/agent-harnesses/"&gt;written before&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;The piece that makes agents reusable is skills, small packaged capabilities I
add to the harness with &lt;code&gt;npx skills add&lt;/code&gt;. For example, Herdr ships
one:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx skills add ogulcancelik/herdr --skill herdr -g
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="everything-is-catppuccin"&gt;Everything is Catppuccin&lt;/h2&gt;
&lt;p&gt;One small thing that makes the whole setup feel coherent: I use
&lt;a href="https://github.com/catppuccin/catppuccin"&gt;Catppuccin&lt;/a&gt; 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.&lt;/p&gt;
&lt;h2 id="beyond-the-terminal"&gt;Beyond the terminal&lt;/h2&gt;
&lt;p&gt;A few desktop tools round it out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Knowledge base: &lt;a href="https://logseq.com/"&gt;Logseq&lt;/a&gt;,&lt;/strong&gt; synced over a private repo.
I wrote a whole post on &lt;a href="https://www.prskavec.net/post/how-i-use-logseq-as-a-personal-knowledge-base/"&gt;how I use Logseq as a personal knowledge base&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Research and citations: &lt;a href="https://www.zotero.org/"&gt;Zotero&lt;/a&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Passwords: &lt;a href="https://1password.com/"&gt;1Password&lt;/a&gt;.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Launcher: &lt;a href="https://www.obdev.at/products/launchbar/index.html"&gt;LaunchBar&lt;/a&gt;.&lt;/strong&gt;
&lt;a href="https://www.raycast.com/"&gt;Raycast&lt;/a&gt; is probably the better choice today, but I
have not felt enough pain to switch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Window management: &lt;a href="https://magnet.crowdcafe.com/"&gt;Magnet&lt;/a&gt;.&lt;/strong&gt; I want to try
&lt;a href="https://github.com/nikitabobko/AeroSpace"&gt;AeroSpace&lt;/a&gt;, an i3-like tiling
manager that does not need SIP disabled the way yabai does, but have not made
time yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="takeaways"&gt;Takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Track your packages as full machine snapshots, not a hand-curated list, so a
fresh install actually reproduces your setup.&lt;/li&gt;
&lt;li&gt;Make your installer safe to rerun: create missing links, never overwrite.&lt;/li&gt;
&lt;li&gt;The modern CLI replacements (lsd, bat, ripgrep, fzf, zoxide, atuin, delta) are
worth the muscle-memory change.&lt;/li&gt;
&lt;li&gt;Keep the AI harness under your control and the model swappable.&lt;/li&gt;
&lt;li&gt;One color scheme everywhere is a cheap way to make an ad-hoc toolkit feel
designed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full configuration is at &lt;a href="https://github.com/abtris/dotfiles"&gt;abtris/dotfiles&lt;/a&gt;
if you want to dig into the details.&lt;/p&gt;</content:encoded></item></channel></rss>