10 terminal tools so good you'll close your GUI (ripgrep 14.7× faster than grep, measured live)
Ten terminal tools that replace a GUI, all free and open source, shown live on one Mac mini. This is the write-up of the video above: the exact commands, what they printed, and how the one benchmark in it was measured. Install everything in one line:
brew install ripgrep fzf bat eza zoxide jq tmux entr gum btop
1. ripgrep: search stops being a coffee break
Same search over a node_modules tree of 19,299 files, grep versus ripgrep, timed with hyperfine (one warm-up run, three timed runs):
$ rg --files node_modules | wc -l 19299 $ hyperfine -w 1 -r 3 'rg -l useState node_modules' 'grep -rl useState node_modules' Benchmark 1: rg -l useState node_modules Time (mean ± σ): 229.6 ms ± 4.2 ms [User: 53.9 ms, System: 1868.6 ms] Range (min … max): 225.7 ms … 234.1 ms 3 runs Benchmark 2: grep -rl useState node_modules Time (mean ± σ): 3.381 s ± 0.036 s [User: 2.807 s, System: 0.572 s] Range (min … max): 3.358 s … 3.423 s 3 runs Summary rg -l useState node_modules ran 14.72 ± 0.31 times faster than grep -rl useState node_modules
3.4 s against 230 ms. ripgrep also respects .gitignore and skips node_modules by default when you search a project, which is usually what you wanted anyway. hyperfine printed a warning that the first grep run was slower than the rest; that is the filesystem cache filling, and the warm-up run exists for exactly that reason.
2. fzf: three letters, any file, instantly
Pipe anything into it and type a few sloppy letters. Here, every path under node_modules collapses to the one meant:
$ fd . node_modules | fzf node_modules/react-dom/client.js
Typing react dom client was enough. Bind fzf to Ctrl+R and your shell history search is fixed too.
3. bat: cat with a brain
Syntax highlighting, line numbers, git changes in the margin.
bat --paging=never --line-range 1:20 src/Root.jsx
The output is the same file cat shows, with a header, numbered lines and colour. Alias cat to bat and reading code stops hurting.
4. eza: ls, redesigned
Icons, git status next to every file, and a tree view. Zero config.
$ eza -la --icons --git src .rw-r--r--@ 4.9k smkim 21 Aug 01:47 Brand.jsx .rw-r--r--@ 11k smkim 23 Aug 23:14 FlexShort.jsx .rw-r--r--@ 104 smkim 20 Aug 22:56 index.js .rw-r--r--@ 12k smkim 28 Aug 13:42 LongForm.jsx .rw-r--r--@ 7.4k smkim 23 Aug 17:02 NewsShort.jsx .rw-r--r--@ 2.9k smkim 28 Aug 12:50 Root.jsx .rw-r--r--@ 8.3k smkim 21 Aug 01:11 Short.jsx
eza --tree replaces opening Finder to see a folder's shape.
5. zoxide: cd with memory
It learns every directory you visit. Type z plus a few letters and you are standing in that deep folder.
$ z music $ pwd /Users/smkim/music $ z src $ pwd /Users/smkim/automoney/remotion-shorts/src
src matched the one you use most, three levels down, without a path.
6. jq: JSON, finally readable
Filter, map and reshape any JSON in one line.
$ jq '.dependencies | keys' package.json [ "@remotion/cli", "@remotion/google-fonts", "react", "react-dom", "remotion" ]
The video pipes cat package.json into jq. A viewer pointed out that jq takes the file as an argument, so the line above is the corrected form.
7. tmux: close the laptop, nothing dies
Split panes are nice. The real feature is detach.
tmux new -s work # start a session ./build.sh # something long-running Ctrl+B % # split, run ./api.sh in the second pane Ctrl+B d # detach: both keep running tmux attach # later, from anywhere: everything is still there
In the video, a 900-module build and an API log run side by side, the session is detached and reattached, and neither process noticed.
8. entr: save, tests run themselves
Pipe in the files to watch, give it one command. Every save runs it.
$ ls app.py | entr -c ./test.sh running 12 tests... ✓ auth_test ✓ api_test ✓ parser_test ✓ cache_test 12 passed in 0.8s
No config, no plugins. -c clears the screen between runs. That is the whole product.
9. gum 2.0: bash scripts that look like real apps
Menus, spinners and inputs drawn in the terminal, scripted from plain bash.
gum choose 'deploy to prod' 'rollback' 'run tests first' 'blame the intern' gum spin --spinner dot --title 'deploying v2.1.0...' -- sleep 2.5 gum style --foreground 212 --border rounded --padding "1 3" "v2.1.0 is live"
Three lines and a deploy script has a menu, a spinner and a framed result. Version 2 had just shipped when the video was recorded.
10. btop: one dashboard for everything
CPU per core with temperatures, memory, swap, disks, network, processes, at full frame rate. On this Mac mini it showed 12 cores, 48 GiB of memory with 11.9 GiB used, and a 509-process list sorted by CPU. Activity Monitor can retire. And yes, it is judging your Chrome tabs.
btop
How the number was measured
The only benchmark in the video is ripgrep versus grep: 19,299 files, hyperfine with one warm-up and three timed runs, on a Mac mini M4 Pro. Everything else is a live capture with no timing claimed. If one of these goes into your setup first, ripgrep and fzf pay for themselves the same day.
Comments