The Modern CLI Toolkit
The Unix command-line toolset that ships with every Linux and macOS system is battle-tested and universally available, but many of its classics were designed in an era of slow terminals and limited memory. A generation of modern replacements has emerged — faster, more ergonomic, and more feature-rich — while remaining composable with the Unix tools they extend. Building a personal CLI toolkit from these tools is one of the highest-leverage investments a developer can make in their daily productivity.
Finding and Searching
fd replaces find with sensible defaults: it respects .gitignore, searches recursively by default, and uses parallel traversal for speed. The syntax is dramatically simpler for common cases. fd -e go finds all Go files; fd -t d node_modules finds node_modules directories. For the cases where you need find's full power, it is still there — but 90% of daily searches become one-liners with fd.
ripgrep (rg) replaces grep with automatic .gitignore awareness, multi-threading for speed, and Unicode-correct pattern matching. On a large codebase, rg is often 10-20x faster than grep for the searches developers run most often. It handles binary file detection, produces color-coded output with line numbers by default, and supports structured output formats for scripting. If you still use grep for code search, switching to rg is the single quickest productivity improvement available at the command line.
fzf is a fuzzy finder that transforms any list of strings into an interactive selector. Pipe it any stream — file paths, git branches, process IDs, log lines, command history — and fzf gives you an interactive fuzzy-search interface with instant preview. Integrated into shell history search, file selection, and git operations, fzf makes the command line feel genuinely interactive rather than purely sequential.
Viewing and Editing
bat replaces cat with syntax highlighting, line numbers, git diff markers, and smart paging. It uses the same syntax definitions as popular editors, so Go code looks like Go code, not undifferentiated text. The --style flag controls how much decoration appears, making bat useful both for interactive browsing and for integration into other tools via piping.
delta is a syntax-highlighting pager for git output. Configured as git's pager, it transforms the default diff output into color-coded, line-numbered, word-level diffs that are dramatically easier to read at a glance. Side-by-side mode shows old and new code next to each other rather than interspersed. For developers who spend significant time reviewing git diffs in the terminal, delta pays for its setup time immediately.
File and Directory Navigation
zoxide replaces cd with a smart directory jumper that learns from your navigation history. After a brief learning period, z myproject jumps directly to your project directory regardless of where you are in the filesystem. zi opens an fzf selector over your frequently visited directories. Navigating between deep project trees goes from muscle-memory path typing to two-character jumps.
eza replaces ls with git status integration, icons, tree view, and better color defaults. eza --tree --level=2 shows a clean project structure without reaching for the find or tree commands. The --git flag adds a column showing the git status of each file, making it easy to see what has changed in a directory at a glance.
HTTP and API Clients
httpie and curl are the two poles of command-line HTTP: httpie prioritizes readability and developer experience with syntax-highlighted output and intuitive request syntax; curl prioritizes universality and scriptability as the lingua franca of HTTP clients. Both belong in a well-stocked toolkit. Use httpie for interactive API exploration and debugging; use curl in scripts and CI pipelines where universality matters.
jq is the essential tool for working with JSON at the command line. Piping API responses through jq allows filtering, transformation, and extraction without writing a script. curl -s api.example.com/users | jq '.[].email' extracts all email addresses from a paginated user list. jq 'select(.status == "active")' filters records by field value. Learning jq's filter language is a one-time investment that eliminates an entire category of data wrangling scripts.
Terminal Multiplexers
tmux is the workhorse of multi-session terminal management. A persistent tmux session survives SSH disconnections, organizes multiple terminal windows and panes within a single connection, and allows seamless switching between active projects. The session model is particularly powerful for remote development: disconnect in the evening, reconnect in the morning, and every pane is exactly where you left it. The learning curve for tmux configuration is real but one-time; the productivity benefit is permanent.
Building Your Toolkit
The best CLI toolkit is one that is committed to a dotfiles repository and reproducible on a new machine in minutes. Tools installed via Homebrew, apt, or a package manager script, configured through dotfiles tracked in git, and available immediately on any machine you work on represent a genuine productivity asset that travels with you. Invest the time to set up your toolkit properly, and the compound interest on that investment accumulates every working day for the rest of your career.