A new generation of universal tools: unix-like, composable, maintainable, git-aware, cross-platform
A new generation of universal tools
unix-like, composable, maintainable, git-aware, cross-platform
For ages the gold standard for tooling has been the GNU/Linux stack:
Chapter 3. The Unix Tools Philosophy
A tool is a simple program, usually designed for a specific purpose, it is sometimes referred to (at least throughout this document) as a command.The “Unix tools philosophy” emerged during the creation of the UNIX operating system, after the breakthrough invention of the pipe '|' (refer to Chapter 6 for information on using the pipe).
The pipe allowed the output of one program to be sent to the input of another. The tools philosophy was to have small programs to accomplish a particular task instead of trying to develop large monolithic programs to do a large number of tasks. To accomplish more complex tasks, tools would simply be connected together, using pipes.
All the core UNIX system tools were designed so that they could operate together. The original text-based editors (and even TeX and LaTeX) use ASCII (the American text encoding standard; an open standard) and you can use tools such as; sed, awk, vi, grep, cat, more, tr and various other text-based tools in conjunction with these editors.
Using this philosophy programmers avoided writing a program (within their larger program) that had already been written by someone else (this could be considered a form of code recycling). For example, command-line spell checkers are used by a number of different applications instead of having each application create its own own spell checker.
This philosophy lives on today in GNU/Linux and various other UNIX system-based operating systems (FreeBSD, NetBSD, OpenBSD, etc.)
Source: Linux Documentation Project, Tools Summary, Chapter 3
The sheer success of the GNU coreutils, has created a compatibility problem -- any change will break too many dependant systems. This in-turn has created a 2nd-mover opportunity: a modern git-aware, cross platform (unix, windows, mac), implemented usiing modern, safer languages like rust.
These tools are better, cleaner, faster and reduce friction when moving between Windows, Linux, MacOS.
I have tried to organise these utils/tools into groups:
Tier-1: must-have
- git source control
- rg - RipGrep search inside text files (
grep
replacement) - fd search for files
- starship modern prompt
- fzf - fuzzy finder TUI for finding/selecting content
Tier-2: great utility, quality of life, not critical
- pwsh - PowerShell scripting with a strong CodeDom
- Universal modern terminals: alacritty, kitty, wezterm
- lsd / exa file listing (
ls
replacement) - bat better pager (
less
replacement) - Terminal File Manager: yazi, ranger, lf
- Query JSON with jq, Query HTML using CSS with htmlq
Tier-3: a more consistent environment
- Zellij (
tmux
replacement) - lua scripting
- neovim
ex -> vi -> vim -> nvim
Tier-4: Package manager
- Unix: distribution provided, 1st class citizen!
apt, pacman, etc
- Windows: choco, nuget, scoop, winget
- MacOs: brew
General Key Features
- not a gnu tool, 'standard' tool -- which allows innovation without loosing the Gnu coreutils
- not backwards compatible - which, strangely in this case, is a good thing
- modern (rust, threaded, effecient)
- git aware!! (skips .git/, respects .gitignore)
- cross platform (linux, mac, windows, docker)
- fast, really fast
- text configuration XDG standard