Do not fake smallness
I found an old gist from my BAM consulting days. It shows csvq — a one-line alias that turns any CSV stream into a queryable in-memory SQLite database with JSON output:
alias csvq="sqlite3 :memory: -cmd '.mode csv' -cmd '.import /dev/stdin s3' '.mode json'"
Pipe a CSV into it, write SQL, get JSON. I wrote it for a colleague I was initiating into my ways. The gist is polite. It shows the output being piped into jq '.[]', which is perfectly respectable Unix.
In real life I write:
aws s3 cp s3://$bucket/$key - | csvq "select * from s3 where status='failed'" unwrap -c H
No jq. No visible pipe between the query and the unwrap. unwrap is a global alias that carries its own | — the command reads as prose, not plumbing. csvq queries, unwrap peels off the array ceremony, -c compresses to one JSON object per line, H pipes to head. Four words, each one a verb.
That difference matters to me. jq '.[]' is generic technique. unwrap -c is local language. It names the move the way I experience it: the data I want is already there, wrapped in one layer of machine ceremony, and I want to peel that away cleanly.
I held back because I thought the full sauce was too much for someone I was just introducing to this world. I gave them the beginner version. The respectable, interoperable, lowest-common-denominator version. And I’ve been thinking about whether that was kind or dishonest.
Nobody protected me from Unix
When I discovered Unix, nobody said “let’s start with the easy stuff.” They handed me pipes, filters, awk, sed, grep, make, ssh, screen, manpages, mailing-list prose written by people who assumed I could keep up. Elegance and ugliness in equal measure. Accidental poetry in the way xargs reads from stdin and the way tee splits a stream.
For the right kind of mind, it was not overwhelming. It was intoxicating. I loved it before I understood it. I learned sysadmin by rescuing my own projects from shared hosting — becoming a root user on a VPS so I could install what I needed and stop depending on providers who didn’t care about my stuff. That love of taking care of my own creations scaled up at Hostgator, where I watched thousands of other people’s processes crash and learned what breaks at hyper-hosting scale.
Nobody thought it was too much. Nobody curated a “gentle introduction to Unix philosophy.” The whole thing was the introduction — here is a world with internal logic, inhabit it.
Tricks vs. worlds
The gist presents a trick. A neat one-liner. Something you can copy-paste and use immediately. That’s valuable and I don’t regret writing it. But it hides the world the trick lives in.
csvq is not an isolated alias. It exists alongside tsvq for tab-separated files, unwrap for peeling off array ceremony, and dozens of other named moves in a vocabulary I’ve been building for twenty years. The vocabulary has a grammar:
ephemeral substrate → memorable verb → inspectable stream
Take the raw thing. Give it temporary structure. Attach that structure to a reusable command. Return the result to the stream so it can keep moving.
csvq is the memorable verb for “turn this tabular stream into a relational surface.” unwrap is the memorable verb for “remove the structural ceremony around the data I actually want.” Together they read as a sentence: pipe, query, unwrap. Each word is a function. Each function is a decision about how data should move.
People can handle this. They can handle the whole vocabulary if it arrives as a coherent world with internal logic — not as a bag of tricks, not as “here’s 50 aliases I use,” but as a language someone can learn to speak.
The difference between showing off tricks and revealing a world is the difference between “look what I can do” and “here is how I think.” The first is performance. The second is an invitation.
The pedagogy question
I held back because I was practicing dosage. I gave my colleague a move they could absorb, use, and trust. Initiation is an art. There’s a real argument for not dumping a private command language onto someone’s head all at once.
But the counterargument is stronger: the right people are starving for someone to stop giving them “best practices” and show them an actual living tradition. Some people light up when they see a working system. They don’t need protection from its richness — they need to know it exists.
The move is not to withhold, and not to dump. It’s to start with the friendly surface — csvq, a clean one-liner, immediately useful — and then say: “by the way, this lives inside a broader way of working.” Show them that csvq is not a random gist. It’s a named move in a little operational language. Once people see the grammar, the vocabulary becomes exciting rather than intimidating.
Give them the beginner door. But let them see the cathedral behind it.
The table name
The gist names the imported SQLite table s3. Not data, not input, not csv_table. s3, because I use the alias mostly for files streaming from S3 and that’s the mental model of the work.
This is a tiny tell. The name is operationally honest, not academically pure. It’s optimized for repeated real-world use, not for a tutorial. And that’s the heart of CLI vocabulary design: naming things according to the world of use, not the world of abstraction. s3 is not “correct” in some grand universal sense. It reduces cognitive friction when a real person is doing a real task under time pressure.
The same instinct drives unwrap instead of jq '.[]'. The same instinct drives every alias and function in my shell that has a name chosen for how it reads in context rather than what it does in isolation.
Small spells
I’ve been building these little command-line inventions for twenty years. They are not toys. They are compact moral statements about how tools should treat people. They say: you should be able to think in public, inspect what is happening, and keep moving without begging the machine for permission.
Every one of them started the same way: I noticed myself doing a multi-step operation repeatedly, gave it a name, and the name became a new word in my working vocabulary. The vocabulary grows. The operations compound. After twenty years, my shell is a language I speak fluently, and the fluency is the payoff — not cleverness, but speed and clarity under pressure.
I was shy about this for a long time. The gist is evidence of that shyness. I presented a trick when I could have presented a tradition. I used jq '.[]' when I meant unwrap -c. I faked smallness because I thought the full thing was too much.
It wasn’t too much. It was just honest. This is your invitation.