DEV Community

Cover image for 15 Command Line Tools which Spark Joy in Your Terminal
Jean-Michel (
Jean-Michel (

Posted on • Updated on • Originally published at

15 Command Line Tools which Spark Joy in Your Terminal

Put joy and productivity inside your Terminal with those cool command line tools.

But before we start, let's cover how you can install and uninstall them.

Table of contents

Quick install

I don't know about you, but I don't enjoy spending lots of time installing stuff.

So here is my executive summary

PROGRAMS="hub httpie ripgrep bat fzf fd fd-find jq autojump direnv tig tmux neovim exa just lazygit jump"
NPM="how-2 tldr"
export INSTALLER="sudo apt-get"    # on Debian/Ubuntu
export INSTALLER="something else"  # on another Linux
export INSTALLER="brew"            # on macOS
for program in $PROGRAMS ; do $INSTALLER install $program ; done
for program in $NPM ; do npm install -g $program ; done
Enter fullscreen mode Exit fullscreen mode

You may want to configure your .profile

## Put in .bash_profile or .zshrc
alias ls=exa
alias cat=bat
Enter fullscreen mode Exit fullscreen mode

Try, adopt or uninstall

Try out the CLI tools. If you don't like them, uninstall them the same way

PROGRAMS="neovim exa"
export INSTALLER="brew"            # on macOS
for program in $PROGRAMS ; do $INSTALLER uninstall $program ; done
Enter fullscreen mode Exit fullscreen mode

This being done, let's move on to the tools!

The 15 Command Line Tools which Spark Joy in Your Terminal

*tldr-pages/tldr: 📚 Collaborative cheatsheets for console commands

A must have

The man page is too long, didn't read.

Replace $ man git-checkout by $ tldr git-checkout

You will find what you need in 5s or less, 80% of the time or more

GitHub logo tldr-pages / tldr

📚 Collaborative cheatsheets for console commands


Build status Matrix chat Merged PRs GitHub contributors license

What is tldr-pages?

The tldr-pages project is a collection of community-maintained help pages for command-line tools, that aims to be a simpler, more approachable complement to traditional man pages.

Maybe you're new to the command-line world? Perhaps you're just a little rusty or can't always recall the arguments for commands like lsof, or tar?

It certainly doesn't help that, in the past, the first option explained in man tar was:

$ man tar
-b blocksize
   Specify the block size, in 512-byte records, for tape drive I/O.
   As a rule, this argument is only needed when reading from or writing to tape drives,
   and usually not even then as the default block size of 20 records (10240 bytes) is very common.
Enter fullscreen mode Exit fullscreen mode

There seems to be room for simpler help pages, focused on practical examples. How about:

Screenshot of the tldr client displaying the tar command in light mode. Screenshot of the tldr client displaying the tar command in dark mode.

This repository is just that: an ever-growing collection of examples…

stedolan/jq: Command-line JSON processor

Unix scripts are based on the idea that you have a stdout with lines of outputs.

How do you autoamte things if you have JSON instead? (and JSON is everywhere)

jq is the answer

GitHub logo jqlang / jq

Command-line JSON processor


jq is a lightweight and flexible command-line JSON processor akin to sed,awk,grep, and friends for JSON data. It's written in portable C and has zero runtime dependencies, allowing you to easily slice, filter, map, and transform structured data.



Prebuilt Binaries

Download the latest releases from the GitHub release page.

Docker Image

Pull the jq image to start quickly with Docker.

Building from source


  • libtool
  • make
  • automake
  • autoconf


git submodule update --init # if building from git to get oniguruma
autoreconf -i               # if building from git
./configure --with-oniguruma=builtin
make -j8
make check
sudo make install
Enter fullscreen mode Exit fullscreen mode

Build a statically linked version:

make LDFLAGS=-all-static
Enter fullscreen mode Exit fullscreen mode

If you're not using the latest git version but instead building a released tarball (available on the release page), skip the autoreconf step, and flex or bison won't…

direnv/direnv: unclutter your .profile

My .profile is horrible so I'm looking forward to try this one

GitHub logo direnv / direnv

unclutter your .profile

direnv -- unclutter your .profile

Built with Nix Packaging status latest packaged version(s) Support room on Matrix

direnv is an extension for your shell. It augments existing shells with a new feature that can load and unload environment variables depending on the current directory.

Use cases

  • Load 12factor apps environment variables
  • Create per-project isolated development environments
  • Load secrets for deployment

How it works

Before each prompt, direnv checks for the existence of a .envrc file (and optionally a .env file) in the current and parent directories. If the file exists (and is authorized), it is loaded into a bash sub-shell and all exported variables are then captured by direnv and then made available to the current shell.

It supports hooks for all the common shells like bash, zsh, tcsh and fish This allows project-specific environment variables without cluttering the ~/.profile file.

Because direnv is compiled into a single static executable, it is fast enough to be unnoticeable on each prompt. It is…

jonas/tig: Text-mode interface for git

GitHub logo jonas / tig

Text-mode interface for git

Tig: text-mode interface for Git

Linux CI macOS CI AppVeyor Build Join Chat

What is Tig?

Tig is an ncurses-based text-mode interface for git. It functions mainly as a Git repository browser, but can also assist in staging changes for commit at chunk level and act as a pager for output from various Git commands.

Bugs and Feature Requests

Bugs and feature requests can be reported using the issue tracker or by mail to either the Git mailing list or directly to the maintainer. Ensure that the word "tig" is in the subject. For other Tig related questions please use Stack Overflow:

Installation and News

Information on how to build and install Tig are found in the installation instructions.

News about releases and latest features and bug fixes are found in the release notes.

tmux/tmux: terminal multiplexer

tmux is a terminal multiplexer: it enables a number of terminals to be created, accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached.

GitHub logo tmux / tmux

tmux source code

Welcome to tmux!

tmux is a terminal multiplexer: it enables a number of terminals to be created accessed, and controlled from a single screen. tmux may be detached from a screen and continue running in the background, then later reattached.

This release runs on OpenBSD, FreeBSD, NetBSD, Linux, macOS and Solaris.


tmux depends on libevent 2.x, available from this page.

It also depends on ncurses, available from this page.

To build tmux, a C compiler (for example gcc or clang), make, pkg-config and a suitable yacc (yacc or bison) are needed.


Binary packages

Some platforms provide binary packages for tmux, although these are sometimes out of date. Examples are listed on this page.

From release tarball

To build and install tmux from a release tarball, use:

./configure && make
sudo make install
Enter fullscreen mode Exit fullscreen mode

tmux can use the utempter library to update utmp(5), if it is…

santinic/how2: stackoverflow from the terminal

StackOverflow being such a massive part of a developer workflow, why not automating it?

GitHub logo santinic / how2

AI for the Command Line

how2: AI for your Terminal

how2 finds the simplest way to do something in a unix shell It's like man, but you can query it in natural language. It uses a mix of AI code-completion and StackOverflow search.

It effectively replaces Chrome => New Tab => Google => Click on StackOverflow => Scroll Down to first answer.

Go to for more info.

how2 AI for the Command-Line

Demo video



MacOSX (via HowBrew):

brew tap how2terminal/how2
brew install how2

With NPM:

sudo npm install -g how2

If you install it without sudo, then you have to run it with npx how2 or alias the command manually.


Download latest .deb and then run:

sudo dpkg -i how2.deb


Go to the latest release and download the binaries.


By default, how2 uses an external AI server to find the best unix command line suggestion If you add the -s

BurntSushi/ripgrep : like grep, but better

ripgrep recursively searches directories for a regex pattern while respecting your gitignore

GitHub logo BurntSushi / ripgrep

ripgrep recursively searches directories for a regex pattern while respecting your gitignore

ripgrep (rg)

ripgrep is a line-oriented search tool that recursively searches the current directory for a regex pattern. By default, ripgrep will respect gitignore rules and automatically skip hidden files/directories and binary files. (To disable all automatic filtering by default, use rg -uuu.) ripgrep has first class support on Windows, macOS and Linux, with binary downloads available for every release. ripgrep is similar to other popular search tools like The Silver Searcher, ack and grep.

Build status Packaging status

Dual-licensed under MIT or the UNLICENSE.


Please see the CHANGELOG for a release history.

Documentation quick links

Screenshot of search results

A screenshot of a sample search with ripgrep

Quick examples comparing tools

This example searches the entire Linux kernel source tree (after running make defconfig && make -j8) for [A-Z]+_SUSPEND, where all matches must be words. Timings were collected on a system…

sharkdp/bat: A cat(1) clone with wings.

Syntax highlighting for a large number of programming and markup languages, because why not?

You can alias it

$ alias cat=bat

GitHub logo sharkdp / bat

A cat(1) clone with wings.

bat - a cat clone with wings
Build Status license Version info
A cat(1) clone with syntax highlighting and Git integration

Key FeaturesHow To UseInstallationCustomizationProject goals, alternatives
[English] [中文] [日本語] [한국어] [Русский]


A special thank you goes to our biggest sponsors:
Your app, enterprise-ready.
Start selling to enterprise customers with just a few lines of code.
Add Single Sign-On (and more) in minutes instead of months.

Warp is a modern, Rust-based terminal with AI built in
so you and your team can build great software, faster.

Feel more productive on the command line with parameterized commands,
autosuggestions, and an IDE-like text editor.

Syntax highlighting

bat supports syntax highlighting for a large number of programming and markup languages:

Syntax highlighting example

Git integration

bat communicates with git to show modifications with respect to the index (see left side bar):

Git integration example

Show non-printable characters

You can use the -A/…

junegunn/fzf: A command-line fuzzy finder

Makes looking for a file as easy as in Visutal Studio Code or IntelliJ

GitHub logo junegunn / fzf

🌸 A command-line fuzzy finder

fzf - a command-line fuzzy finder github-actions

fzf is a general-purpose command-line fuzzy finder.

It's an interactive Unix filter for command-line that can be used with any list; files, command history, processes, hostnames, bookmarks, git commits etc.


  • Portable, no dependencies
  • Blazingly fast
  • The most comprehensive feature set
  • Flexible layout
  • Batteries included
    • Vim/Neovim plugin, key bindings, and fuzzy auto-completion

Sponsors ❤️

I would like to thank all the sponsors of this project who make it possible for me to continue to improve fzf.

If you'd like to sponsor this project, please visit

miyanokomiyaJon GjengsetKyle L. DavisFrederick ZhangMoritz DietzMikkel MalmbergPierre DubouilhRyan Roden-CorrentJordan ArentsenMislav MarohnićAlex ViscreanuDavid BalateroOndrej SynacekMathias Jean JohansenBen ElanJesperNikolay MarinovPaweł DudaSantiago LezicaTimo SulgSean MortonDamien RajonArtBITHovisDarius JondaCristian DominguezChang-Hung LiangBen Lechlitneryashgeorge looshchTakumi KAGIYAMAPaul O'Leary McCannRobert BeegerVEEB ProjectsYeraiKhue DoanYoway BuornJosh ScalisiAlec

Table of Contents

sharkdp/fd: like find, but better

A simple, fast and user-friendly alternative to 'find'

GitHub logo sharkdp / fd

A simple, fast and user-friendly alternative to 'find'


CICD Version info [中文] [한국어]

fd is a program to find entries in your filesystem It is a simple, fast and user-friendly alternative to find While it does not aim to support all of find's powerful functionality, it provides sensible (opinionated) defaults for a majority of use cases.

Quick links:


  • Intuitive syntax: fd PATTERN instead of find -iname '*PATTERN*'.
  • Regular expression (default) and glob-based patterns.
  • Very fast due to parallelized directory traversal.
  • Uses colors to highlight different file types (same as ls).
  • Supports parallel command execution
  • Smart case: the search is case-insensitive by default. It switches to case-sensitive if the pattern contains an uppercase character*.
  • Ignores hidden directories and files, by default.
  • Ignores patterns from your .gitignore, by default.
  • The command name is 50% shorter* than find :-).



How to use

First, to…


A cd command that learns - easily navigate directories from the command line

GitHub logo wting / autojump

A cd command that learns - easily navigate directories from the command line


autojump - a faster way to navigate your filesystem


autojump is a faster way to navigate your filesystem. It works by maintaining a database of the directories you use the most from the command line.

Directories must be visited first before they can be jumped to.


j is a convenience wrapper function around autojump. Any option that can be used with autojump can be used with j and vice versa.

  • Jump To A Directory That Contains foo:

    j foo
  • Jump To A Child Directory:

    Sometimes it's convenient to jump to a child directory (sub-directory of current directory) rather than typing out the full name.

    jc bar
  • Open File Manager To Directories (instead of jumping):

    Instead of jumping to a directory, you can open a file explorer window (Mac Finder, Windows Explorer, GNOME Nautilus, etc.) to the directory instead.

    jo music

    Opening a file manager to…

inconshreveable/ngrok: Introspected tunnels to localhost

You have your web app working on localhost, the CI is broken and you can't share your work with your colleagues.

Except that with ngrok, you can!

GitHub logo inconshreveable / ngrok

Introspected tunnels to localhost

Build status

ngrok - Introspected tunnels to localhost (homepage)

”I want to expose a local server behind a NAT or firewall to the internet.”

What is ngrok?

ngrok is a reverse proxy that creates a secure tunnel from a public endpoint to a locally running web service ngrok captures and analyzes all traffic over the tunnel for later inspection and replay.

ngrok 2.x

ngrok 2.x is the successor to 1.x and the focus of all current development effort. Its source code is not available.

NOTE This repository contains the code for ngrok 1.x.

Status of the ngrok 1.x project

ngrok 1.x is no longer developed, supported or maintained by its author, except to ensure that the project continues to compile. The contribution policy has the following guidelines:

  1. All issues against this repository will be closed unless they demonstrate a crash or other complete failure of ngrok's functionality.
  2. All issues against…


A command-line tool that makes git easier to use with GitHub.

GitHub logo mislav / hub

A command-line tool that makes git easier to use with GitHub.

hub is a command line tool that wraps git in order to extend it with extra features and commands that make working with GitHub easier.

For an official, potentially more user-friendly command-line interface to GitHub see and this comparison.

This repository and its issue tracker is not for reporting problems with web interface. If you have a problem with GitHub itself, please contact Support.


$ hub clone rtomayko/tilt
#=> git clone

# or, if you prefer the SSH protocol:
$ git config --global hub.protocol ssh
$ hub clone rtomayko/tilt
#=> git clone
Enter fullscreen mode Exit fullscreen mode

See usage examples or the full reference documentation to see all available commands and flags.

hub can also be used to make shell scripts that directly interact with the GitHub API.

hub can be safely aliased as git, so you can type $ git <command> in the…

Build your own CLI tools, but maybe not in Bash

Command-line tools are great to automate and simplify your developer workflow.

Tools written by others are good, but why would you not write your own tools?

I have a strong opinion weakly held on this topic:

After 15 years of trying to program in Bash and being stuck at trials and errors, I think it's time to retire Bash.

Why not using your favorite programming language instead?

I found they are 10x time better than Bash.

Python, Go and JavaScript are all good choices to write a CLI tool.

Now my favorite language being Kotlin, I wanted to write a starter project for my own CLI tools using Kotlin multiplatform.

So if you allow me this shameless plug, have a look at the kotlin-cli-starter GitHub template

GitHub logo jmfayard / kotlin-cli-starter

Life is too short for Bash programming

A starter project to build command-line tools in Kotlin Multiplatform

Contains a re-implementation of a real world CLI tool: git-standup



You can install using one of the options listed below

Source Command
Node npm install -g kotlin-cli-starter
Installer curl -L | sudo sh
Tests ./gradlew allTests
Kotlin All Platforms Run ./gradlew allRun
Kotlin JVM Run ./gradlew run
Kotlin Native Run ./gradlew install then $ git standup
Kotlin Node.JS Run ./gradlew jsNodeRun


Being able to write your own command-line tools is a great skill to have. Automate all the things!

You can write the CLI tools in Kotlin and reap the benefits of using

  • a modern programming language
  • modern IDE support
  • modern practices such as unit testing and continuous integration
  • leverage Kotlin multiplatform libraries
  • run your code on the JVM and benefit from a wealth of Java libraries
  • or build a native executable, which starts very fast and…

Any cool tool that I'm missing?

No such list would be ever complete, so please add your recommandation in the comments.

Updates from my readers

jesseduffield/lazygit simple terminal UI for git commands

lazygit is a very cool git client

GitHub logo jesseduffield / lazygit

simple terminal UI for git commands

A simple terminal UI for git commands

GitHub Releases Go Report Card Codacy Badge GolangCI GitHub tag homebrew



Maintenance of this project is made possible by all the contributors and sponsors. If you'd like to sponsor this project and have your avatar or company logo appear below click here. 💙

Mark LussierDean HerbertPeter BjorklundReilly WoodOliver GüntherPawan DhananjayBartłomiej DachDavid KarlssonJesperCarsten GehlingCEUKAkos PutzXeteraHolden LucasCaleb UkleChau TranmatejciktheAverageDev (Luca Tumedei)Zach FullerIvan ZaitsevNicholas CloudLightQuantumAliaksandr StelmachonakPedro PombeiroBurgy BenjaminJoe KlemmerAimi FadhilTobias LütkeBen BeaumontHollyJames SantucciJeff ForciertheshankMaciej T. NowakMichael HuggettFarzad MajidfayyazYuryAndreas KurthBraden SteffaniakJordan GillardSebastianGeorge SpanosBen HuntAlex BradnerFrantisek StankoRobert Clancy (Robbo)Andy SlezakMartin KockChristian RackersederMichal KolasinskiIllarion KoperskiJesse AlamaSteven BerkowitzCodacyRay JamesonKevin EvansBrettJan HeijmansKevin Nowald

Elevator Pitch

Rant time: You've heard it before, git is powerful, but what good is that power when everything is so damn hard to do? Interactive rebasing requires you to edit a goddamn TODO file in your editor? Are you kidding me? To stage part of a file you need to use a command line program to step through each hunk and if a hunk can't be split down any further but contains code you don't want to stage…

See the demo

casey/just: 🤖 Just a command runner

Inspired by make

GitHub logo casey / just

🤖 Just a command runner

↖️ Table of Contents


just is a handy way to save and run project-specific commands.

This readme is also available as a book.

(中文文档在 这里, 快看过来!)

Commands, called recipes, are stored in a file called justfile with syntax inspired by make:


You can then run them with just RECIPE:

$ just test-all
cc *.c -o main
./test --all
Yay, all your tests passed!
Enter fullscreen mode Exit fullscreen mode

just has a ton of useful features, and many improvements over make:

  • just is a command runner, not a build system, so it avoids much of make's complexity and idiosyncrasies. No need for .PHONY recipes!

  • Linux, MacOS, and Windows are supported with no additional dependencies. (Although if your system doesn't have an sh, you'll need to choose a different shell.)

  • Errors are specific and informative, and syntax errors are reported along with their source context.

gsamokovarov/jump: Jump helps you navigate faster by learning your habits. ✌️

An alternative to cd that feels like it can read your mind

GitHub logo gsamokovarov / jump

Jump helps you navigate faster by learning your habits. ✌️


Jump integrates with your shell and learns about your navigational habits by keeping track of the directories you visit. It gives you the most visited directory for the shortest search term you type.



Jump comes in packages for the following platforms.

Platform Command
macOS brew install jump or port install jump
Linux sudo snap install jump
Nix nix-env -iA nixpkgs.jump
Go go install
Linux distribution specific packages
Distribution Command
Void xbps-install -S jump
Ubuntu wget && sudo dpkg -i jump_0.51.0_amd64.deb
Debian wget && sudo dpkg -i jump_0.51.0_amd64.deb
Fedora wget && sudo rpm -i jump-0.51.0-1.x86_64.rpm


You are using Jump through its shell helper function, j. To get it, you have to integrate Jump with your shell.

bash / zsh

Add the line below in ~/.bashrc, ~/bash_profile or ~/.zshrc:

eval "$(jump shell)"
Enter fullscreen mode Exit fullscreen mode


Add the line below in…

Top comments (14)

bravoecho profile image

TUI file managers such as nnn (, minimalistic, my favourite) or lf (, a more interactive one)

delta, more limited than lazygit, focused on just diffs, but it does it really really well, and can be a nice complement (

glow terminal markdown renderer ( some might think this is superfluous, because markdown is supposed to be meaningfully readable as plain text, but I often find poorly formatted files, sometimes "augmented" with a lot of inline HTML, to the point of becoming impossible to parse for the human eye

vonheikemen profile image

Speaking of creating your own cli tools. I would like to share something cool: a scripting language called ABS.

This is why I think is cool.

  • It has a C-like syntax.
  • You can call external commands and handle the result in a convenient way.
  • It has a module system.
  • It has a builtin tool that allows you to create cli tools.

Here is a little snippet.

tz = `cat /etc/timezone`

if !tz.ok {
  echo("Ooops, something went wrong")

continent, city = tz.split("/")

echo("Best city in the world?")

selection = stdin()

if selection == city {
  echo("You might be biased...")
} else {
  echo("Yes, ${selection} is awesome.")
Enter fullscreen mode Exit fullscreen mode

I wrote about this language a few years ago, here is the post if anyone is interested.

I like this a lot because it allows people who are familiar with a languages like javascript or PHP (that would be me) to write shell scripts in a way that feels comfortable.

pieter profile image
Pieter D

If bat looks appealing to you and you happen to be a Vim user, you might want to consider running view /path/to/file instead of bat. It'll open any file as readonly in Vim, with all your favorite plugins like Git integration present. Instead of piping to | less, you could also pipe to | view -. You may have to enter something like :set syntax=json if the syntax isn't autodetected based on content, although there's probably a simple setting or plugin to enable autodetection.

If you're not a Vim user and you want something that works with zero configuration, bat seems like a good choice!

bravoecho profile image

jump ( is in my opinion a better alternative to autojump

I personally prefer jump because it's actively maintained, but especially because – like all modern tools listed here – it's a standalone executable that does not require Python

it works really well, the author says it can "read his mind" and I tend to agree 🙂

jmfayard profile image
Jean-Michel (

Thanks, I've added the suggestion!

dazfuller profile image
Darren Fuller

I’m using ripgrep and bat daily, and they make everything just that much better.

Another tool I’m using a lot is Just. I might have processes which need a number of steps, or building a project with a lot of arguments. I can abstract it all away and use something like “just build” instead.

jmfayard profile image
Jean-Michel (

I started using just in my own project, thanks, it's nice!

jmfayard profile image
Jean-Michel (

thanks, I've added the suggestion

siddharthshyniben profile image

Hey! I made this CLI tool called fcd which replaces the cd command. It basically searches for wherever you are trying to cd and then copies the appropriate cd command to your clipboard.

GitHub logo SiddharthShyniben / fcd

Faster cd-ing.

Contributors Forks Downloads Stargazers Issues MIT License



Better cding for macOS
Explore the docs »

Report Bug · Request Feature

Table of Contents

  1. About The Project
  2. Getting Started
  3. Usage
  4. Documentation
  5. Roadmap
  6. Contributing
  7. License
  8. Contact

About The Project

Please star this repo if you found this tool useful 🌟

fcd Screen Shot

fcd is a utility which helps you cd faster on macOS.

Ever had to type out a long cd ~/Sites/Projects/project, find out the path is wrong, rewrite it to cd ~/Sites/Sandbox/project? You just wasted a minute or two. This inspired me to create this tool: fcd.

fcd automatically reads the dirname and the basename of the input and searches for any folder with basename as the name in the dirname folder (Basically, if you input "some/where/else", the program returns the path to "some/where/**/else"). Once it finishes:

  • If there is more than one folder named basename, it gives you…
siddharthshyniben profile image

I wanted to implement autojump like functionality ever since I made fcd.

eggbean profile image

If you want exa to behave just like ls, so that you do not need to learn any new switches, I have made this wrapper script:

joeklemmer profile image
Joe Klemmer

I've found lazygit to be quite handy, myself.

jmfayard profile image
Jean-Michel ( • Edited

I've tried it and love it, thanks!

klvenky profile image
Venkatesh KL

Z is similar to autojump & works great for me.