etoon
Fast TOON (Token-Oriented Object Notation) encoder for Python, Rust, and CLI.
8× faster than toons, 2.7× faster than the official TS SDK, byte-identical output.
Performance
Measured on a 50-doc payload (7480 bytes JSON → 4012 bytes TOON):
| Encoder | Time | vs etoon |
|---|---|---|
| etoon (Rust, native) | 12.1 μs | 1.00× |
| etoon (Python, PyO3) | 15.4 μs | 1.27× |
| @toon-format/toon (TS SDK) | 35.6 μs | 2.94× |
| py-rtoon | 85.9 μs | 7.10× |
| toons | 106.4 μs | 8.79× |
CLI via stdin pipe (Claude / Bash workflows):
| CLI | Per call | Relative |
|---|---|---|
| etoon | 0.43 ms | 1.00× |
| official toon | 50.7 ms | 118× slower |
Auto-detect mode (v0.2.0+) — handles JSON, mixed log, and plain text:
| Input | Size | Per call |
|---|---|---|
| Pure JSON (1000 objects) | 120KB | 0.73 ms |
| Mixed log (5K JSON + 5K text) | 600KB | 1.93 ms |
| Plain text pass-through | 300KB | 0.56 ms |
Reproduce
# Encoder core benchmark (Rust native, no I/O)
# CLI stdin pipe benchmark
# Time 200 runs
start=
for; do ; done
end=
Install
CLI binary (recommended for LLM workflows)
Pre-built — no Rust required:
Download from GitHub Releases (Linux/macOS/Windows, x86_64/aarch64):
# x86_64
# Apple Silicon / ARM server (aarch64)
# Apple Silicon (M1/M2/M3/M4)
# Intel Mac
# PowerShell
Invoke-WebRequest -Uri "https://github.com/coseto6125/etoon/releases/latest/download/etoon-windows-x86_64.exe" -OutFile "etoon.exe"
# Move to a directory in your PATH, e.g.:
Move-Item etoon.exe "$env:USERPROFILE\.local\bin\etoon.exe"
Each release includes SHA256SUMS.txt and Sigstore cosign signatures to verify the binary was built by GitHub Actions from this repo.
# 1. Verify checksum
# 2. Verify sigstore signature (requires cosign: https://docs.sigstore.dev/cosign/system_config/installation/)
BINARY=etoon-linux-x86_64 # change to your platform
macOS unsigned binary note: xattr -d com.apple.quarantine etoon to bypass Gatekeeper.
From source (requires Rust toolchain):
Python library
This installs the Python binding (
etoon.dumps()), not the CLI binary. For the CLI, use one of the methods above.
Rust library
Usage
Python
=
# [2]{id,name}:
# 1,Alice
# 2,Bob
CLI (Bash pipe)
|
|
|
LLM Agents — Setup Guide
Append | etoon to shell commands so the AI reads TOON instead of raw JSON — 40-60% fewer tokens, lossless, auto-detects input format.
|
|
|
Rules:
| etoongoes at the end of the pipeline —jq/grep/awkbefore it, never after- Auto-detects JSON / mixed log / plain text — safe to append to any command
- Skip only for: byte-exact diff, single-value lookups (1-2 lines)
Claude Code
Add to CLAUDE.md (or .claude/CLAUDE.md) in your project root:
Append `| etoon` as the final pipe segment of any Bash command whose output
reaches the conversation. etoon auto-detects JSON, mixed log, and plain text.
Skip only for byte-exact diff or single-value lookups (1-2 lines).
Cursor
Add to .cursor/rules/etoon.mdc:
description: Compress shell output with etoon
globs:
alwaysApply: true
When running shell/terminal commands, append `| etoon` as the last pipe segment.
etoon auto-detects JSON, mixed log, and plain text — safe for any command.
Skip only for byte-exact diff or single-value lookups (1-2 lines).
OpenAI Codex CLI
Add to AGENTS.md in your project root:
Append `| etoon` as the final pipe segment of any shell command.
etoon auto-detects JSON, mixed log, and plain text (non-JSON passes through unchanged).
Skip only for byte-exact diff or single-value lookups (1-2 lines).
Windsurf / Other AI Editors
Add to .windsurfrules (Windsurf) or the equivalent rules file:
When executing shell commands, always append `| etoon` at the end of the pipeline.
etoon auto-detects input format: JSON → compact TOON, mixed log → JSON blocks encoded + text pass-through, plain text → unchanged.
Skip only for byte-exact diff or single-value lookups (1-2 lines).
Gemini CLI
Add to GEMINI.md in your project root:
Append `| etoon` as the final pipe segment of any shell command.
etoon auto-detects JSON, mixed log, and plain text (non-JSON passes through unchanged).
Skip only for byte-exact diff or single-value lookups (1-2 lines).
ChatGPT / Custom GPTs
Add to system prompt or custom instructions:
When generating shell commands for the user, append `| etoon` as the last pipe segment.
etoon converts JSON to TOON (40-60% fewer tokens). Non-JSON passes through unchanged.
Rust
let json_bytes = to_vec?;
let toon = encode?;
Architecture
Python dict → orjson.dumps → JSON bytes → sonic-rs (SIMD parse) → walk → TOON string
Key optimizations:
- sonic-rs SIMD JSON parser (~7× faster than serde_json)
- orjson bridge — single boundary crossing (vs PyO3-based alternatives)
- uniform-order table fast path — skips 300 key lookups per 50-row table
- itoa specialized integer formatting
Compatibility
Output is byte-identical to the toons Python package (Apache 2.0) and the
official toon-format/toon TypeScript SDK. Passes 111/111 TOON spec
fixtures covering primitives, objects, arrays (primitive/tabular/nested/bulleted),
and whitespace.
Advanced options
These are TOON spec optional parameters, intended for programmatic use in your codebase (Python / Rust library calls). The CLI
| etoonpipe for LLM workflows uses defaults and does not need these.
# Custom delimiter (when values contain commas)
# or "\t"
# Key folding: collapse {a:{b:{c:1}}} → "a.b.c: 1"
# partial fold
Limitations
- Integers > 2⁶³ are lossily coerced via f64 (works for most common big integers that happen to be representable; arbitrary-precision is not supported).
- Custom
indentis hardcoded to 2 spaces (TOON spec default).
License
Apache 2.0. Test fixtures in tests/fixtures/ are sourced from the
toons project (Apache 2.0).