A friend got a MacBook recently and was asking for recommendations. I found myself wishing I had a list of all my default-installed command-line tools, so that’s what this is.

These are the programs and tools I install on every machine capable of running them. I install them with Homebrew on macOS, Pacman on Arch Linux, and, surprisingly, many of them are available via WinGet if you’re brave enough to try using a terminal on Windows.

All my personal configurations for these various tools are available for you to peruse in my dotfiles repo.

Before anyone shouts at me, I’m making the choice not to include various staple tools in a terminal environment, so while I use tools like curl, dig and ns highly regularly I think anyone who needs those already knows about them. This is more of a “hey here’s a cool thing to install”.

On we go.

tmux

A screenshot of tmux running in iTerm2

tmux (short for “terminal multiplexer”) is the first thing I install. At its most basic, it lets you display multiple terminals in a single window of your terminal emulator of choice, but it can do a lot more. You can have multiple windows and even sessions that you can detach and reattach as you please, making it extremely useful for keeping terminal states around; super handy if you find yourself SSHing into servers a lot. There’s also an increasingly rich plugin ecosystem, which is what’s supplying those CPU/memory metrics in the bottom-right.

zsh

The choice of shell is a very subjective decision and I’m not going to try and convince you that zsh is better than fish or any other shell, simply because I haven’t used the others enough. I settled on zsh many years ago and I love its autocompletion, syntax highlighting and rich plugin ecosystem.

I use antigen for managing zsh plugins; there are newer tools available but I’ve never bothered to look at them because antigen works well for me.

There’s a huge plugin bundle called oh-my-zsh that you can install, which is an everything-and-the-kitchen-sink approach to zsh that I don’t actually like very much - I think long-term you’ll have a better time if you start from scratch and just install the things you want as you go. Vanilla zsh can do a lot by itself, it’s worth a go and might already be installed on your system.

bat

A screenshot of bat displaying a Python file from Bridgy

You may already be familiar with cat, which is used for printing the contents of a file to the terminal or piping it into other programs. bat is, essentially, cat with syntax highlighting, along with some other conveniences like automatically displaying the file in a pager if it’s too big for your terminal. I use it every day.

eza

A screenshot of eza showing the files in cool-club webring

eza (a fork of the now-unmaintained exa) is to ls as bat is to cat. It offers better colour support but also a pile of extra features like showing Git statuses and has a built-in tree display. I have ls aliased to eza now and have done for years.

fzf

A screenshot of fzf in the cool-club repo

fzf is a fuzzy-finder. You run it, start typing, and you’ll get a list of matching files along with a little preview. You can pipe the result out to whatever you like, and it’s got really nice integrations with Vim and various shells.

git-branch-i

A screenshot of git-branch-i showing two branches in a repo

This is a bit of a cheeky one. git-branch-i is a tool I made, which lets you switch between or delete Git branches in a more interactive fashion. I use it every day, along with its sister projects kube-context-i and terraform-workspace-i.

jq

A screenshot showing a simple selector in jq

jq (and its YAML equivalent yq) is an extremely flexible and powerful tool for working with JSON files. I use it a lot in both scripts and interactively.

neovim

A screenshot of Neovim

This is another one that ought to be its own post, really, and I don’t want to start a holy war in here, so I will simply say that Neovim is my single favourite piece of software that I use.

I will also add a similar warning to oh-my-zsh here: Neovim is infinitely customisable, and with that flexibility comes an intimidating depth. It can seem really hard to get from the default setup to something that matches the IDE of your dreams, and to that end there are various really cool projects like LazyVim which do this for you. However, I think you’ll be better off in the long run by starting from scratch and finding and configuring the plugins that work best for you. That way you’ll know every bit of your setup and it will work exactly how you like it, and you’ll learn a huge amount in the process.


That’s all of them for now! I confess I’m actually surprised this list is as short as it is given that I essentially live in the terminal given the choice.

Have any suggestions? Comment on Bluesky, Mastodon or Hacker News and I’ll add them to this list!