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

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

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

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

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

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

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

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!