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