26 Unix tools. One binary. Zero dependencies. · the missing coreutils for AI pipelines · vrk mcp - expose all 26 tools to any AI agent · brew install vrk - ready in 5 seconds · 26 Unix tools. One binary. Zero dependencies. · the missing coreutils for AI pipelines · vrk mcp - expose all 26 tools to any AI agent · brew install vrk - ready in 5 seconds

About

Philosophy

Agents need deterministic tools. The standard Unix toolkit was designed for humans who handle ambiguity well. vrk fills the gap: small tools that do one thing, fail loudly, and compose predictably. Not smart. Not magical. Reliable.

What it is

vrksh (वृक्ष) is the Sanskrit word for tree. The command is vrk. The project is vrksh. The domain is vrk.sh.

vrk is pronounced “vruk” - rhymes with truck, not with “work” or “V-R-K.”

A single static binary with 26 Unix-style tools for AI pipelines. Every tool reads stdin, writes stdout, exits 0/1/2. Nothing else.

The contract

Every vrk tool follows these rules:

stdin   ->  data in
stdout  ->  data out
stderr  ->  errors only
exit 0  ->  success
exit 1  ->  failure (bad input, API error, condition not met)
exit 2  ->  usage error (bad flags, missing input)
--json  ->  errors go to stdout as {"error":"...","code":N}
--help  ->  always works, always explains the tool

This contract is what makes vrk tools composable with each other and callable by agents without special handling. An agent does not need to parse stderr to know if a tool failed - it checks the exit code. It does not need to guess the output format - stdout is always the data.

How the binary works

vrk uses multicall dispatch - the same binary handles every tool. The first argument selects which tool runs:

vrk tok              # runs the tok tool
vrk prompt           # runs the prompt tool
vrk --manifest       # shows all tools as JSON
vrk --skills tok     # shows tok's agent skill reference
vrk --help           # top-level usage

To see every tool available:

vrk --manifest

This prints the embedded JSON tool manifest - the same manifest that agents use for discovery.

Bare mode

By default, every tool is accessed through the vrk prefix: vrk tok, vrk jwt, vrk epoch. Bare mode creates symlinks so you can call tools directly by name - tok, jwt, epoch - without the prefix.

The symlinks are created in the same directory as the vrk binary. Nothing is copied. Each symlink points back to vrk, which detects the name it was called as and dispatches accordingly.

vrk --bare                     # link all tools
vrk --bare tok jwt epoch       # link only these three
vrk --bare --dry-run           # preview what would happen
vrk --bare --list              # show active symlinks
vrk --bare --remove            # remove all vrk-created symlinks
vrk --bare --remove tok        # remove a specific symlink

Collisions are handled safely. If a file already exists at a symlink path, bare mode skips it and tells you. Use --force to overwrite:

vrk --bare --force             # overwrite all collisions
vrk --bare --force uuid base   # overwrite only these two

Running bare mode twice is safe - it recognizes existing symlinks and reports them as already linked. --remove only deletes symlinks that point to vrk. It will never touch a file it did not create.

If the binary directory requires elevated permissions:

sudo vrk --bare

Shell completions

vrk ships with tab completion for bash, zsh, and fish. The completions tool generates the appropriate script for your shell:

vrk completions bash > ~/.bash_completion.d/vrk
vrk completions zsh > ~/.zsh/completions/_vrk
vrk completions fish > ~/.config/fish/completions/vrk.fish

After sourcing the script, vrk <tab> completes tool names and vrk tok --<tab> completes flags.