The missing coreutils
for the agent era.
zero silent failures • composable by default • one static CLI binary
vrk grab https://api.example.com/docs \
| vrk tok --check 8000 \
| vrk prompt --system "extract the breaking changes" \
| vrk validate --schema changes.json \
| vrk kv set changelogcurl -fsSL vrk.sh/install.sh | sh
Or try it in your browser first. No install, no API key.
Try vrk in your browser
Pick a recipe, or type your own command. It runs on sample files, right in this page.
# Strips the markdown, hides the API key, then checks that the result fits in 200 tokens.
Press RUN. Nothing leaves your browser.files you can cat:
22 of the tools run here. In real use vrk runs in your terminal and agent pipelines, on your own files. Install vrk.
before
import anthropic, tiktoken, json, re, jsonschema
client = anthropic.Anthropic()
with open("article.md") as f:
text = f.read()
# Count tokens - abort if too long
enc = tiktoken.encoding_for_model("gpt-4")
if len(enc.encode(text)) > 8000:
raise ValueError("over token budget")
# Redact secrets before sending
text = re.sub(r"sk-[a-zA-Z0-9]{48}", "[REDACTED]", text)
# Call the API
resp = client.messages.create(
model="claude-sonnet-4-6", max_tokens=1024,
messages=[{"role": "user", "content": text}]
)
result = resp.content[0].text
# Validate the output
schema = json.load(open("schema.json"))
jsonschema.validate(json.loads(result), schema)after
cat article.md \
| vrk tok --check 8000 \
| vrk mask \
| vrk prompt --system 'Summarize' \
| vrk validate --schema schema.jsonevery vrk tool: stdin in, stdout out, exit 0/1/2
| over token limit? | exit 1 | ← pipeline stops |
| bad JSON schema? | exit 1 | ← nothing downstream runs |
| wrong flags? | exit 2 | ← usage error, never silent |
no more pipelines that look like they worked.
batch jobs at scale
find docs/ -name '*.md' -exec cat {} + \
| vrk chunk --size 4000 \
| vrk throttle --rate 60/m \
| vrk prompt --field text --model gpt-4o --jsonchunked. paced. structured output. safe to rerun.
PDFs and CSVs go in the same pipe
Most of what you want an LLM to read is not markdown. Two tools turn it into text the next step can use, with no Python and no database server.
vrk pdf contract.pdf \
| vrk chunk --size 4000 \
| vrk prompt --field text \
--system 'List every termination clause'Prints the text of each page, or JSONL with page numbers. A scanned PDF with no text exits 1, so the model never gets an empty page.
vrk sql 'SELECT u.city, SUM(o.total) AS revenue
FROM orders o JOIN users u ON u.id = o.user_id
GROUP BY u.city' users.csv orders.csv \
| vrk prompt --system 'Explain this revenue split'Each CSV or JSONL file becomes a table you can join and group. The result comes out as CSV or JSONL.
Install
brew tap vrksh/vrksh
brew install vrkgo install github.com/vrksh/vrksh@latestcurl -sSL https://vrk.sh/install.sh | shCore
vrk tok
start hereCount tokens. Gate pipelines before they fail.
cat system-prompt.txt | vrk tok --check 8000vrk promptLLM prompt - Anthropic/OpenAI, --schema, --retry, --explain
cat article.md | vrk prompt --system 'Summarize the key findings in 3 bullet points'vrk chunkToken-aware text splitter - JSONL chunks within a token budget
cat contract.pdf.txt | vrk chunk --size 4000 --overlap 200Pipeline
vrk coaxRetry wrapper - --times, --backoff, --on, --until
vrk grabURL fetcher - clean markdown, plain text, or raw HTML
vrk kvKey-value store - SQLite-backed, namespaces, TTL, atomic counters
vrk maskSecret redactor - entropy + pattern-based, streaming
vrk pdfPDF text extractor - Markdown, --text, JSONL per page
vrk sqlSQL over CSV or JSONL - SQLite in memory, CSV or JSONL out
vrk sseSSE stream parser - text/event-stream to JSONL
vrk throttleRate limiter for pipes - --rate N/s or N/m
vrk validateJSONL schema validator - --schema, --strict, --fix, --json
Lists every vrk tool to Claude Code and Cursor via MCP; the agent runs them in its shell. See agent integration →