Tools
By: . Published: .Tools
This page collects and organizes tools and such that I think might come in handy one day. Some of them I’ve had the pleasure of using. Some of them, I use all the darn time. (Others, I’d do well to remember and start using more.)
Last updated: 2020-10-10 21:37:25 -0400 -0400
Basic Shell Usage
- fish: I ditched zsh for Fish shell after a few years when the sheer complexity of zsh and its inherited functionality through the confluence of csh ksh bash and all the rest got to me. Fish blows all that away in favor of simpler semantics and configuration and mostly just doing the right thing out of the box.
- ShellCheck: You owe it to yourself to use this any time you’re writing a script file. It’s awesome. For interactive use, I switched from Bash to Zsh, and then to Fish, but for scripts? I’m still writing Bash, because ShellCheck supports Bash, and ShellCheck is worth it. Its diagnostics point to a wiki that provide examples and context, so you can learn gradually through your mistakes. (But seriously, way too often, the oopsy is just “you forgot to quote this. and this. and this.” and zsh & fish will save you from that footgun, so please, use them in your interactive sessions.)
- ripgrep (rg): The latest and greatest in the grep -R/ack/ag lineage.
- fd: I ditched
findfor this a bit after I learned of it. It’s smart the same way rg is smart, and wicked fast the same way, too. - bat: This is on my “I should use this more” list. It’s a souped-up cat - it’s clever enough to do syntax highlighting. It also surprised me by proving to include pager functionality, so it might be able to replace
less, too? - zoxide (z): This is a Rust iteration on z/autojump. It tracks your most popular directories, and then lets you jump back to them with just a portion of the name. It can save a lot of typing and remembering where you filed things on disk.
- watchexec: This is a Rust iteration on the “do stuff when files changed” watcher genre that also includes chokidar (NodeJS), reflex (Go), and watchman-make (C++/Python). (The overall Watchman is more daemon-like than the others. It splits “establish a watch” from “subscribe to specific changes” and manages them as long-lived things, not interactive processes. As such, it pops up in stuff like IDE tooling.)
- eza: A better
ls. I aliaslsto runeza -F -G@h $argv. - atuin: A better and more comprehensive Ctrl-r. It can be set up to centralize history for commands across all your shells, machines, and coding agents, in a way that is not just a disaster to sift through, thanks to the metadata it also collects around execution context.
- ghostty: Replaces Terminal.app with less padding than iTerm2. I stuck with Terminal.app till I realized its lack of support for terminal hyperlinks was limiting what
deltaand other CLI tools can do for me to smooth jumping from terminal to editor.
Slicing & Dicing
- jq: A Swiss Army knife for JSON. A good place to start is
jq . < someFile.jsonto pretty-print the file’s contents. - tokei: Generates lines-of-code stats. Can give a quick survey when joining or auditing an existing project.
- xmlstarlet: A Swiss Army knife for XML. I’ve used the selection (XPATH) support in anger at least once.
- qsv: A Swiss Army knife for CSV/TSV data.
- duckdb: Ever wanted to run SQL queries against some CSV data without having to do any sort of importing? Now you can.
Duct Tape
- cfilter is a filter to colorize output based on patterns. You write a syntax file, pipe some other tool’s output through
cfilter, and suddenly, it’s easier to read. I’ve used it to improve the scannability of the Mercury compiler’s error output with mmc.syntax. - rlwrap: Adds in command history and commandline editing support for interactive programs that didn’t pull in libreadline or libedit themselves. If you find up arrow and Ctrl-A just leaving weird characters in your buffer rather than letting you get comfortably work done in some REPL, this is the tool for you.
Git
- Jujutsu (jj): A better way to use git. It’s a new take on VCS that interoperates with git and basically makes workflows with
git add -p,git revise, andgit absorbfirst-class citizens. It’s never been easier to reshape commit history. As of April 2026, it does have some missing interop features that could be an issue for you if you rely on git-lfs, hooks, or submodules. And if you prefer to use a GUI with git, there are limited options. - git-revise is like
git rebase -ibut without all the workdir churn, which is really convenient when you’re running tests and builds on change, doubly so when the worker processes barf on a sequence of rapid changes. The git-revise introductory blogpost provides more context. It’s worth sorting out Python under macOS for. git-cleanupfrom nvie’s git toolbelt is a ready-to-run version of the script everyone eventually winds up writing to delete local branch heads that have already been deleted on the remote. Depending on how you work,delouseandshatter-by-filemight also come in handy, though I haven’t worked them into my process yet.- git-when-merged makes it easy to answer, “Which feature branch merge brought in this commit?”
- git-absorb automates working out which existing commits the tweaks you make in response to code review feedback belong to: Stage your changes, then let your existing commits absorb them.
- delta: Acts as a pager for diffs. Adds syntax highlighting and several other features.