Back to blog

I Built a List of 284+ Modern CLI Tools (and What I Learned)

How I went from bookmarking random GitHub repos to curating a list that hit 150+ stars on day one.

5 min read
Gagan Deep Singh

Gagan Deep Singh

Founder | GLINR Studios


Two years ago I watched someone share their screen and their cat output had syntax highlighting. Colored, with line numbers, git diff markers in the gutter. I asked what it was. "bat."

That was it. One tool. Then I found ripgrep, and grep felt broken. Then fd, and find felt like writing a legal contract. Then eza, and plain ls looked like something from 1993.

Before I knew it, half my shell aliases pointed to Rust binaries and the other half were Go tools I found on random HN threads at 2am.

The bookmark problem

I kept saving individual GitHub repos. Then I'd forget them. Then I'd rediscover them six months later and install them again.

When I searched for a single list that covered everything, the options weren't great:

  • modern-unix (33k stars) had about 30 tools but hasn't been updated since 2024
  • awesome-cli-apps (19k stars) had 500 entries but no way to tell what replaces what
  • awesome-rust (57k stars) had CLI tools buried between web frameworks and game engines

Nobody had organized these by "I use grep, what's better?" So I started building awesome-modern-cli.

What I found

284 tools across 44 categories. Way more than I expected.

The obvious ones everyone knows about: bat for cat, ripgrep for grep, fd for find, eza for ls, dust for du, zoxide for cd. If you're reading this blog, you probably use at least a couple of these already.

The interesting part was the tools nobody talks about. Things like television (an fzf alternative that's noticeably faster on large inputs), scooter (interactive find and replace with live preview across files), and rainfrog (a database TUI for Postgres, MySQL, and SQLite that replaced my psql workflow).

The Rust thing

I wasn't planning to track languages. I added it because I was curious and the numbers got interesting.

146 out of 284 tools are written in Rust. That's 52%. Go comes in second at 16%. I didn't go looking for Rust tools specifically. When you search for "modern X replacement" for any Unix command, the top result just happens to be a Rust project most of the time.

There's something about CLI tools that attracts Rust developers. Maybe it's the single-binary distribution. Maybe it's the performance story. Whatever it is, the result is that the terminal is slowly becoming a Rust runtime.

This connects to another project I've been working on: sslx, a modern alternative to OpenSSL's CLI written in Rust. Same idea as the tools on the list. Take something everyone uses but nobody enjoys (OpenSSL commands), and make it not painful. Generate certs, inspect remote hosts, convert formats, check expiration, all without memorizing cryptic flags.

How I organized it

The organizing principle is: what are you replacing?

If you use grep and want something better, go to the Text Search section. If you use top and want something prettier, go to System Monitoring. Every entry tells you the tool name, where to find it, what it does in one sentence, and what language it's in.

No star counts (they go stale). No per-tool screenshots in the list itself (there's a highlight reel at the top for that). Just the information you need to decide if you want to try something.

Everything is alphabetically sorted within sections so you can scan quickly.

What happened on launch day

I posted it on Reddit and it hit 150+ stars on day one. The community started submitting tools I'd missed through GitHub issues within hours. People were finding tools they didn't know existed and sharing the list in their own channels.

The questions I got the most: "How is this different from modern-unix?" and "Did you copy this from somewhere?"

The answer to both: modern-unix covered 30 tools and stopped being maintained. This covers 284, is organized differently, has CI that checks for broken links weekly, and accepts community contributions. Same space, different approach.

What I'd do differently

I wasted time on ASCII art for the header that didn't render properly on GitHub. Should have just used a clean heading with badges from the start.

I also should have set up the issue templates earlier. The structured "suggest a tool" form with checkboxes (100+ stars? actively maintained? have you used it?) made incoming suggestions much easier to process than free-form issues.

My actual daily setup

12 tools out of 284. That's what I actually use every day:

alias cat="bat"
alias ls="eza --icons"
alias find="fd"
alias grep="rg"
alias du="dust"
alias diff="delta"
alias top="btop"
alias cd="z"

Plus lazygit for git, fzf for fuzzy finding, just as a task runner, and hyperfine when I need to benchmark something.

The other 272 are there for when you need something specific. The list is a reference, not a shopping list.

Check it out

github.com/thegdsks/awesome-modern-cli

If I missed your favorite tool, open an issue or PR.


Contact