packages/cli/README.md
Command-line tool for converting JSON to TOON and back, with token analysis and streaming support.
TOON (Token-Oriented Object Notation) is a compact, human-readable encoding of the JSON data model that minimizes tokens for LLM input. The CLI lets you test conversions, analyze token savings, and integrate TOON into shell pipelines with stdin/stdout support.
# npm
npm install -g @toon-format/cli
# pnpm
pnpm add -g @toon-format/cli
# yarn
yarn global add @toon-format/cli
Or use directly with npx:
npx @toon-format/cli [options] [input]
toon [options] [input]
Standard input: Omit the input argument or use - to read from stdin. This enables piping data directly from other commands.
Auto-detection: The CLI automatically detects the operation based on file extension (.json → encode, .toon → decode). When reading from stdin, use --encode or --decode flags to specify the operation (defaults to encode).
# Encode JSON to TOON (auto-detected)
toon input.json -o output.toon
# Decode TOON to JSON (auto-detected)
toon data.toon -o output.json
# Output to stdout
toon input.json
# Pipe from stdin
cat data.json | toon
echo '{"name": "Ada"}' | toon
# Decode from stdin
cat data.toon | toon --decode
| Option | Description |
|---|---|
-o, --output <file> | Output file path (prints to stdout if omitted) |
-e, --encode | Force encode mode (overrides auto-detection) |
-d, --decode | Force decode mode (overrides auto-detection) |
--delimiter <char> | Array delimiter: , (comma), \t (tab), | (pipe) |
--indent <number> | Indentation size (default: 2) |
--stats | Show token count estimates and savings (encode only) |
--no-strict | Disable strict validation when decoding |
--keyFolding <mode> | Enable key folding: off, safe (default: off) |
--flattenDepth <number> | Maximum folded segment count when key folding is enabled (default: Infinity) |
--expandPaths <mode> | Enable path expansion: off, safe (default: off) |
Show token savings when encoding:
toon data.json --stats -o output.toon
Example output:
✔ Encoded data.json → output.toon
ℹ Token estimates: ~15,145 (JSON) → ~8,745 (TOON)
✔ Saved ~6,400 tokens (-42.3%)
toon data.json --delimiter "\t" -o output.toon
Skip validation for faster processing:
toon data.toon --no-strict -o output.json
# Convert API response to TOON
curl https://api.example.com/data | toon --stats
# Process large dataset
cat large-dataset.json | toon --delimiter "\t" > output.toon
# Chain with other tools
jq '.results' data.json | toon > filtered.toon
The CLI uses streaming output for both encoding and decoding, writing incrementally without building the full output string in memory:
# Encode large JSON file with minimal memory usage
toon huge-dataset.json -o output.toon
# Decode large TOON file with streaming JSON output
toon huge-dataset.toon -o output.json
# Process millions of records efficiently via stdin
cat million-records.json | toon > output.toon
cat million-records.toon | toon --decode > output.json
Memory efficiency:
decodeStream API in @toon-format/toon, streaming JSON tokens to output without full string in memory--expandPaths safe is enabled, decode falls back to non-streaming mode internally to apply deep-merge expansion before writing JSON[!NOTE] When using
--statswith encode, the full output string is kept in memory for token counting. Omit--statsfor maximum memory efficiency with very large datasets.
Collapse nested wrapper chains to reduce tokens:
# Encode with key folding
toon input.json --keyFolding safe -o output.toon
For data like:
{
"data": {
"metadata": {
"items": ["a", "b"]
}
}
}
Output becomes:
data.metadata.items[2]: a,b
Instead of:
data:
metadata:
items[2]: a,b
# Fold maximum 2 levels deep
toon input.json --keyFolding safe --flattenDepth 2 -o output.toon
# Reconstruct nested structure from folded keys
toon data.toon --expandPaths safe -o output.json
# Encode with folding
toon input.json --keyFolding safe -o compressed.toon
# Decode with expansion (restores original structure)
toon compressed.toon --expandPaths safe -o output.json
# Verify round-trip
diff input.json output.json
# Key folding + tab delimiter + stats
toon data.json --keyFolding safe --delimiter "\t" --stats -o output.toon
MIT License © 2025-PRESENT Johann Schopplich