Blog

New CLI Tools

July 07, 2025

A bunch of people have been writing replacements for CLI tools. Here are some I've investigated.

Also, a script for installing them all.

fzf

fzf is in a category of its own. I feel naked when I ctrl+r in my shell and I don't have it. Everyone I've shown it to uses it now, most of them just for ctrl+r. I've written several zsh line editor widgets

television — write toml instead of passing 86 flags to fzf/skim/pick/selecta. Manipulate items using string-pipeline instead of shell shenanigans

grep

ripgrep — faster, -r by default; --glob and --type are handy

ast-grep — tree-sitter is very fast but you have to write rust to use it. It's easier to write a pylint/flake8 plugin but ast/libcst/astroid are slow. ast-grep provides a reasonably ergonomic frontend to tree-sitter. You still have to express what you're looking for as a tree-sitter object, but you can express it in YAML instead of rust. Also the playground is very well-built

find

fd — just easier to use. You don't have to type -name

cat

bat — "a cat(1) clone with wings". And colors. Excellent manpager:

export MANPAGER='sh -c "col -bx | batcat --language man --paging always --style plain"'
export MANROFFOPT='-c'

ls/cd/file managers

eza — ls replacement, exa fork. Nerdfonts, hyperlinks. Also replaces tree

lsd — I'd probably use this if I discovered it before exa, but not compelled to switch

walk and broot — seem cool but kinda jank

fzf alt+c — playing with walk and broot made me realize what I wanted was fzf's ctrl+t but for directories only. Which the default keymaps already had 🤦

yazi — file manager

host/dig/nslookup

doggo — not compelled to switch from host, though doggo.mrkaran.dev could be useful

curl

curlie — colors, reliable HTTP/3 support. Has the same flags as curl

jq

jless — it's ok, but I found fx

fx — folds/colorizes json

gron — cool idea: flatten json to 1 element per line so you can grep it. I don't use it

git/diff

jujutsu — sits atop git. No index/stage. Bookmarks instead of branches. Detached HEAD by default. Lots of ink has been spilled about it already

git-branchless — detached HEAD by default. I used this before jj despite it being unmaintained

git-machete — the most flexible stacked PR management tool I found. Many alternatives exist

git-whence — interactive reblame tool I wrote. Drill through history to find the commit that actually made the change you care about

lazygit — like tig or gitk or many others. I just use it for adding lines to the stage/index

diff

delta — lexical highlighting, side-by-side (instead of unified) diffs, git/jj integration

diff-so-fancy — I used this until I found delta

du

dua has a helpful list of alternatives. dua itself has a nice interactive mode, but it doesn't feel meaningfully better than ncdu

dust — shows you the actual big files. The reason you use a tool in this category is because you want to find what's eating your space. ls/du only show you a single directory at a time and are slow. ncdu and dua interactive actually also only show you one directory at a time; they're just faster. dust jumps to the answer for you

shells

nushell — pipe objects instead of text. I just use it on windows so I don't have to learn tasklist

fish — I don't use it

zsh fast-syntax-highlighting — colors for your line editor

prompts

oh-my-posh — more configurable than starship

starship — I used it until I found oh-my-posh

time

hyperfine — benchmark processes with a little statistical rigor

ps

procs — colors, much more understandable help text

hardcore mode

uutils — a painstaking rust rewrite of coreutils. Do not install the .debs from the GitHub releases page as it "upgrades" your coreutils package but doesn't provide links for the individual binaries (cat, rm, etc.), leaving you with a broken system. Instead, install rust-coreutils and add /usr/lib/cargo/bin/coreutils to your PATH

sudo-rs — the important parts of sudo. Same installation procedure as uutils