One recent observation I saw about AI tools is that as much as they enable you to do things you already do faster (or maybe better), perhaps more importantly, they enable you to do things that you wouldn’t have otherwise done.

I think my dotfiles project is a good example. I always wanted to have dotfiles that set up my environment in a way that maximizes my productivity, but was held back by my willingness to really dig deep into the settings of the highly configurable tools that I use. I think this was a rational decision, perhaps made more so by the fact that my job for the past 10 or 15 years has basically been thinking and going to meetings.

As a result, I hadn’t made any commits to my dotfiles since 2015, which was roughly the time I ran out of really good reasons to write code at work.

A few weeks ago, though, I turned to Claude Code to help me update my dotfiles. The motivation was that I started experimenting with dev containers on GitHub and I wanted them to spin up with the same shell environment that I have on my laptop.

I also wanted my dotfiles to be platform neutral and roughly shell neutral (I use zsh on Mac OS and bash everywhere else, at some point maybe the differences will bother me but not right now). Claude Code will happily create some pretty decent dotfiles that check all of these boxes.

The fun part, though, is iterating and learning. I had previously asked Claude Code to add color support where it’s available. A couple of days ago I noticed that ls wasn’t working right, in that it was ignoring all of the arguments after the command name. ls *.py just listed everything in the directory. It had created this alias for ls:

alias ls='ls --color=auto 2>/dev/null || ls -G'

The intent was to try to use the GNU version of ls and if that failed, use the Mac OS version instead. The problem is that when the first ls fails, the || operator executes the second command but doesn’t pass along the original arguments like *.py. I learned a little bit from that (it’s fairly clever), and Claude Code proposed a fix that made sure the arguments flow through properly, but I also knew that was the wrong solution. I thought the better solution for me was to make sure that the Homebrew coreutils package is installed on the machine if it’s a Mac, and to insert it into your path ahead of the default versions of those commands. Then everything works more or less the GNU/Linux way. Of course Claude Code made short work of that, resulting in this commit.

The other day I updated my shell config to make it really easy to switch between GitHub accounts, which is a really nice quality of life improvement I probably wouldn’t have bothered to implement if I had to figure it out on my own.

My dotfiles now have good docs, a one-line install command, and they work well across platforms – luxuries I could not previously afford.