High-performance CLI proxy that reduces LLM token consumption by 60-90%
Website • Install • Troubleshooting • Architecture • Discord
English • Francais • 中文 • 日本語 • 한국어 • Espanol
rtk filters and compresses command outputs before they reach your LLM context. Single Rust binary, zero dependencies, <10ms overhead.
| Operation | Frequency | Standard | rtk | Savings |
|---|---|---|---|---|
ls / tree | 10x | 2,000 | 400 | -80% |
cat / read | 20x | 40,000 | 12,000 | -70% |
grep / rg | 8x | 16,000 | 3,200 | -80% |
git status | 10x | 3,000 | 600 | -80% |
git diff | 5x | 10,000 | 2,500 | -75% |
git log | 5x | 2,500 | 500 | -80% |
git add/commit/push | 8x | 1,600 | 120 | -92% |
cargo test / npm test | 5x | 25,000 | 2,500 | -90% |
ruff check | 3x | 3,000 | 600 | -80% |
pytest | 4x | 8,000 | 800 | -90% |
go test | 3x | 6,000 | 600 | -90% |
docker ps | 3x | 900 | 180 | -80% |
| Total | ~118,000 | ~23,900 | -80% |
Estimates based on medium-sized TypeScript/Rust projects. Actual savings vary by project size.
brew install rtkcurl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | shInstalls to
~/.local/bin. Add to PATH if needed:echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc # or ~/.zshrc
cargo install --git https://github.com/rtk-ai/rtkDownload from releases:
- macOS:
rtk-x86_64-apple-darwin.tar.gz/rtk-aarch64-apple-darwin.tar.gz - Linux:
rtk-x86_64-unknown-linux-musl.tar.gz/rtk-aarch64-unknown-linux-gnu.tar.gz - Windows:
rtk-x86_64-pc-windows-msvc.zip
rtk --version # Should show "rtk 0.28.2" rtk gain # Should show token savings statsName collision warning: Another project named "rtk" (Rust Type Kit) exists on crates.io. If
rtk gainfails, you have the wrong package. Usecargo install --gitabove instead.
# 1. Install for your AI tool rtk init -g # Claude Code / Copilot (default) rtk init -g --gemini # Gemini CLI rtk init -g --codex # Codex (OpenAI) rtk init -g --agent cursor # Cursor rtk init --agent windsurf # Windsurf rtk init --agent cline # Cline / Roo Code # 2. Restart your AI tool, then test git status # Automatically rewritten to rtk git statusThe hook transparently rewrites Bash commands (e.g., git status -> rtk git status) before execution. Claude never sees the rewrite, it just gets compressed output.
Important: the hook only runs on Bash tool calls. Claude Code built-in tools like Read, Grep, and Glob do not pass through the Bash hook, so they are not auto-rewritten. To get RTK's compact output for those workflows, use shell commands (cat/head/tail, rg/grep, find) or call rtk read, rtk grep, or rtk find directly.
Without rtk: With rtk: Claude --git status--> shell --> git Claude --git status--> RTK --> git ^ | ^ | | | ~2,000 tokens (raw) | | ~200 tokens | filter | +-----------------------------------+ +------- (filtered) ---+----------+ Four strategies applied per command type:
- Smart Filtering - Removes noise (comments, whitespace, boilerplate)
- Grouping - Aggregates similar items (files by directory, errors by type)
- Truncation - Keeps relevant context, cuts redundancy
- Deduplication - Collapses repeated log lines with counts
rtk ls . # Token-optimized directory tree rtk read file.rs # Smart file reading rtk read file.rs -l aggressive # Signatures only (strips bodies) rtk smart file.rs # 2-line heuristic code summary rtk find "*.rs" . # Compact find results rtk grep "pattern" . # Grouped search results rtk diff file1 file2 # Condensed diffrtk git status # Compact status rtk git log -n 10 # One-line commits rtk git diff # Condensed diff rtk git add # -> "ok" rtk git commit -m "msg" # -> "ok abc1234" rtk git push # -> "ok main" rtk git pull # -> "ok 3 files +10 -2"rtk gh pr list # Compact PR listing rtk gh pr view 42 # PR details + checks rtk gh issue list # Compact issue listing rtk gh run list # Workflow run statusrtk test cargo test # Show failures only (-90%) rtk err npm run build # Errors/warnings only rtk vitest run # Vitest compact (failures only) rtk playwright test # E2E results (failures only) rtk pytest # Python tests (-90%) rtk go test # Go tests (NDJSON, -90%) rtk cargo test # Cargo tests (-90%) rtk rake test # Ruby minitest (-90%) rtk rspec # RSpec tests (JSON, -60%+)rtk lint # ESLint grouped by rule/file rtk lint biome # Supports other linters rtk tsc # TypeScript errors grouped by file rtk next build # Next.js build compact rtk prettier --check . # Files needing formatting rtk cargo build # Cargo build (-80%) rtk cargo clippy # Cargo clippy (-80%) rtk ruff check # Python linting (JSON, -80%) rtk golangci-lint run # Go linting (JSON, -85%) rtk rubocop # Ruby linting (JSON, -60%+)rtk pnpm list # Compact dependency tree rtk pip list # Python packages (auto-detect uv) rtk pip outdated # Outdated packages rtk bundle install # Ruby gems (strip Using lines) rtk prisma generate # Schema generation (no ASCII art)rtk docker ps # Compact container list rtk docker images # Compact image list rtk docker logs <container> # Deduplicated logs rtk docker compose ps # Compose services rtk kubectl pods # Compact pod list rtk kubectl logs <pod> # Deduplicated logs rtk kubectl services # Compact service listrtk json config.json # Structure without values rtk deps # Dependencies summary rtk env -f AWS # Filtered env vars rtk log app.log # Deduplicated logs rtk curl <url> # Auto-detect JSON + schema rtk wget <url> # Download, strip progress bars rtk summary <long command> # Heuristic summary rtk proxy <command> # Raw passthrough + trackingrtk gain # Summary stats rtk gain --graph # ASCII graph (last 30 days) rtk gain --history # Recent command history rtk gain --daily # Day-by-day breakdown rtk gain --all --format json # JSON export for dashboards rtk discover # Find missed savings opportunities rtk discover --all --since 7 # All projects, last 7 days rtk session # Show RTK adoption across recent sessions-u, --ultra-compact # ASCII icons, inline format (extra token savings) -v, --verbose # Increase verbosity (-v, -vv, -vvv)Directory listing:
# ls -la (45 lines, ~800 tokens) # rtk ls (12 lines, ~150 tokens) drwxr-xr-x 15 user staff 480 ... my-project/ -rw-r--r-- 1 user staff 1234 ... +-- src/ (8 files) ... | +-- main.rs +-- Cargo.toml Git operations:
# git push (15 lines, ~200 tokens) # rtk git push (1 line, ~10 tokens) Enumerating objects: 5, done. ok main Counting objects: 100% (5/5), done. Delta compression using up to 8 threads ... Test output:
# cargo test (200+ lines on failure) # rtk test cargo test (~20 lines) running 15 tests FAILED: 2/15 tests test utils::test_parse ... ok test_edge_case: assertion failed test utils::test_format ... ok test_overflow: panic at utils.rs:18 ... The most effective way to use rtk. The hook transparently intercepts Bash commands and rewrites them to rtk equivalents before execution.
Result: 100% rtk adoption across all conversations and subagents, zero token overhead.
Scope note: this only applies to Bash tool calls. Claude Code built-in tools such as Read, Grep, and Glob bypass the hook, so use shell commands or explicit rtk commands when you want RTK filtering there.
rtk init -g # Install hook + RTK.md (recommended) rtk init -g --opencode # OpenCode plugin (instead of Claude Code) rtk init -g --auto-patch # Non-interactive (CI/CD) rtk init -g --hook-only # Hook only, no RTK.md rtk init --show # Verify installationAfter install, restart Claude Code.
RTK supports 9 AI coding tools. Each integration transparently rewrites shell commands to rtk equivalents for 60-90% token savings.
| Tool | Install | Method |
|---|---|---|
| Claude Code | rtk init -g | PreToolUse hook (bash) |
| GitHub Copilot | rtk init -g | PreToolUse hook (rtk hook copilot) |
| Cursor | rtk init -g --agent cursor | preToolUse hook (hooks.json) |
| Gemini CLI | rtk init -g --gemini | BeforeTool hook (rtk hook gemini) |
| Codex | rtk init -g --codex | AGENTS.md + RTK.md instructions |
| Windsurf | rtk init --agent windsurf | .windsurfrules (project-scoped) |
| Cline / Roo Code | rtk init --agent cline | .clinerules (project-scoped) |
| OpenCode | rtk init -g --opencode | Plugin TS (tool.execute.before) |
| OpenClaw | openclaw plugins install ./openclaw | Plugin TS (before_tool_call) |
rtk init -g # Install hook + RTK.md rtk init -g --auto-patch # Non-interactive (CI/CD) rtk init --show # Verify installation rtk init -g --uninstall # Removertk init -g # Same hook as Claude CodeThe hook auto-detects Copilot format (VS Code runTerminalCommand or CLI toolName: bash) and rewrites commands. Works with both Copilot Chat in VS Code and copilot CLI.
rtk init -g --agent cursorCreates ~/.cursor/hooks/rtk-rewrite.sh + patches ~/.cursor/hooks.json with preToolUse matcher. Works with both Cursor editor and cursor-agent CLI.
rtk init -g --gemini rtk init -g --gemini --uninstallCreates ~/.gemini/hooks/rtk-hook-gemini.sh + patches ~/.gemini/settings.json with BeforeTool hook.
rtk init -g --codexCreates ~/.codex/RTK.md + ~/.codex/AGENTS.md with @RTK.md reference. Codex reads these as global instructions.
rtk init --agent windsurfCreates .windsurfrules in the current project. Cascade reads rules and prefixes commands with rtk.
rtk init --agent clineCreates .clinerules in the current project. Cline reads rules and prefixes commands with rtk.
rtk init -g --opencodeCreates ~/.config/opencode/plugins/rtk.ts. Uses tool.execute.before hook.
openclaw plugins install ./openclawPlugin in openclaw/ directory. Uses before_tool_call hook, delegates to rtk rewrite.
| Raw Command | Rewritten To |
|---|---|
git status/diff/log/add/commit/push/pull | rtk git ... |
gh pr/issue/run | rtk gh ... |
cargo test/build/clippy | rtk cargo ... |
cat/head/tail <file> | rtk read <file> |
rg/grep <pattern> | rtk grep <pattern> |
ls | rtk ls |
vitest/jest | rtk vitest run |
tsc | rtk tsc |
eslint/biome | rtk lint |
prettier | rtk prettier |
playwright | rtk playwright |
prisma | rtk prisma |
ruff check/format | rtk ruff ... |
pytest | rtk pytest |
pip list/install | rtk pip ... |
go test/build/vet | rtk go ... |
golangci-lint | rtk golangci-lint |
rake test / rails test | rtk rake test |
rspec / bundle exec rspec | rtk rspec |
rubocop / bundle exec rubocop | rtk rubocop |
bundle install/update | rtk bundle ... |
docker ps/images/logs | rtk docker ... |
kubectl get/logs | rtk kubectl ... |
curl | rtk curl |
pnpm list/outdated | rtk pnpm ... |
Commands already using rtk, heredocs (<<), and unrecognized commands pass through unchanged.
~/.config/rtk/config.toml (macOS: ~/Library/Application Support/rtk/config.toml):
[tracking] database_path = "/path/to/custom.db" # default: ~/.local/share/rtk/history.db [hooks] exclude_commands = ["curl", "playwright"] # skip rewrite for these [tee] enabled = true # save raw output on failure (default: true) mode = "failures" # "failures", "always", or "never" max_files = 20 # rotation limitWhen a command fails, RTK saves the full unfiltered output so the LLM can read it without re-executing:
FAILED: 2/15 tests [full output: ~/.local/share/rtk/tee/1707753600_cargo_test.log] rtk init -g --uninstall # Remove hook, RTK.md, settings.json entry cargo uninstall rtk # Remove binary brew uninstall rtk # If installed via Homebrew- TROUBLESHOOTING.md - Fix common issues
- INSTALL.md - Detailed installation guide
- ARCHITECTURE.md - Technical architecture
- SECURITY.md - Security policy and PR review process
- AUDIT_GUIDE.md - Token savings analytics guide
RTK collects anonymous, aggregate usage metrics once per day to help prioritize development. This is standard practice for open-source CLI tools.
What is collected:
- Device hash (SHA-256 of hostname+username, not reversible)
- RTK version, OS, architecture
- Command count (last 24h) and top command names (e.g. "git", "cargo" — no arguments, no file paths)
- Token savings percentage
What is NOT collected: source code, file paths, command arguments, secrets, environment variables, or any personally identifiable information.
Opt-out (any of these):
# Environment variable export RTK_TELEMETRY_DISABLED=1 # Or in config file (~/.config/rtk/config.toml) [telemetry] enabled = falseContributions welcome! Please open an issue or PR on GitHub.
Join the community on Discord.
MIT License - see LICENSE for details.