token-optimizer
Token Optimizer
Reduce tokens in prompts, docs, and prose while preserving meaning.
When to Use
- Prompt >1500 tokens or contains redundant phrasing
- Docs/markdown need compression for LLM context
- Writing prose for humans (docs, commits, PRs, error messages)
- Converting JSON/YAML/XML data for LLM input (TOON)
Quick Routing
| Input Type | Go To |
|---|---|
| User prompt / chat message | Section 1: Prompt Compression |
| Docs / markdown / README | Section 2: Doc Formatting |
| Commits / PRs / error messages | Section 3: Prose Clarity |
| JSON / YAML / XML data | Section 4: TOON Format |
Compression Levels
| Level | Reduction | Use When |
|---|---|---|
| Light | 20-30% | Keep readability, human-facing prose |
| Medium | 40-50% | Default for LLM context |
| Heavy | 60-70% | Max compression, symbols over words |
1. Prompt Compression
Process
- Identify core intent
- Extract essential context only
- Remove filler phrases
- Apply abbreviations & symbols
- Output compressed version w/ token savings %
Remove Phrases
| Remove | Transform To |
|---|---|
| "Please help me with" | (delete) |
| "I need you to" | (delete) |
| "Could you please" | (delete) |
| "I would like to" | (delete) |
| "I think", "Maybe", "Perhaps" | (delete) |
| "This might be a dumb question" | (delete) |
| "For your reference" | (delete) |
| "As I mentioned before" | (delete) |
Transform Patterns
| Verbose | Compressed |
|---|---|
| "I want to create a fn that takes X and returns Y" | fn(X) -> Y |
| "The error message says..." | Error: ... |
| "In the file located at..." | File: ... |
| "I'm trying to..." | Goal: ... |
| "Here is my code..." | Code: |
| "The problem is that..." | Issue: ... |
Example
Before (847 tokens):
Hello! I hope you're doing well. I was wondering if you could help me.
I'm trying to build a React app and I need a custom hook that fetches
user data from /api/users. It returns JSON. I'd like loading, error
states, and caching. I think useEffect and useState but not sure...
After (156 tokens):
Goal: React hook for user data fetching
- Endpoint: /api/users -> JSON user obj
- Handle: loading, error states
- Cache response
Stack: React (useEffect, useState)
2. Doc Formatting
Remove Filler Words
Remove when possible: "basically", "essentially", "actually", "really"
| Verbose | Compressed |
|---|---|
| "in order to" | "to" |
| "due to the fact that" | "because" |
| "at this point in time" | "now" |
| "in the event that" | "if" |
| "has the ability to" | "can" |
| "it is important to note that" | (remove) |
Compress Lists
Before:
The following features are included:
- User authentication with JWT tokens
- Role-based access control for authorization
- Password hashing using bcrypt algorithm
After:
Features:
- JWT auth
- RBAC authz
- bcrypt passwords
Structured Data Over Prose
Before:
The API accepts three parameters. The first is "userId" which is a
required string. The second is "limit", optional number, defaults to 10.
After:
Params:
- userId: str (req) - user ID
- limit: num (opt, def=10)
Heading Compression
Before: # Comprehensive Guide to User Authentication and Authorization
After: # Auth Guide
Table Compression
Shorten column headers, use abbreviations in cells:
| Param | Type | Req | Def | Desc |
|---|---|---|---|---|
| userId | str | Y | - | user ID |
| limit | num | N | 10 | max results |
Code Block Compression
Remove comments that restate the code. Collapse trivial logic:
Before:
// Check if email is valid
const isEmailValid = emailRegex.test(email);
// Check if password is at least 8 characters
const isPasswordValid = password.length >= 8;
// Return true if both are valid
return isEmailValid && isPasswordValid;
After:
return emailRegex.test(email) && password.length >= 8;
URL & Path Compression
Replace full home paths: /Users/username/Documents/Projects/MyApp/config/settings.json -> ~/Projects/MyApp/config/settings.json
Error Message Compression
Keep error codes and stack traces exact. Compress surrounding prose:
Err: Invalid/expired token. Re-authenticate at /auth/login
3. Prose Clarity (Strunk's Rules)
Apply when writing prose for humans (docs, commits, PRs, errors).
Grammar Essentials
- Form possessive singular by adding 's
- Use comma after each term in series except last
- Don't join independent clauses by comma (use semicolon or period)
- Participial phrase at beginning refers to grammatical subject
Composition Essentials
- One paragraph per topic
- Begin paragraph with topic sentence
- Express coordinate ideas in similar form
- Keep related words together
- Place emphatic words at end of sentence
Limited Context Strategy
When context is tight: write draft, dispatch subagent with draft + these rules, have subagent copyedit and return revision.
Core Principles
Omit needless words:
| Wordy | Concise |
|---|---|
| the question as to whether | whether |
| there is no doubt but that | no doubt |
| he is a man who | he |
| the reason why is that | because |
Use active voice:
| Passive | Active |
|---|---|
| The file was deleted by the user | The user deleted the file |
| Errors are logged by the system | The system logs errors |
Positive form over negative:
| Negative | Positive |
|---|---|
| did not remember | forgot |
| not important | trifling |
| not honest | dishonest |
Specific over vague:
| Vague | Specific |
|---|---|
| A period of unfavorable weather set in | It rained every day for a week |
| The data was processed | The server parsed 10,000 records |
Technical Writing
# Commit: Bad
Made some changes to fix the bug that was causing issues
# Commit: Good
Fix null pointer in user authentication
# Error: Bad
An error occurred while processing your request
# Error: Good
Database connection failed: timeout after 30s
# Doc: Bad
This function is used for the purpose of validating user input
# Doc: Good
Validates user input
Editing Checklist
- Unnecessary words (especially "that", "very", "really", "just")
- Passive voice -> convert to active
- Negative statements -> make positive
- Vague language -> make specific
- Long sentences -> break up or simplify
4. TOON Format (Data Serialization)
TOON replaces JSON/YAML/XML data serialization when sending to LLMs. ~40% fewer tokens.
Convert to TOON: JSON, YAML, XML (data objects/arrays only) Keep as-is: Markdown, plain text, code files, CSV
Precedence note: TOON converts the data format structure (braces, quotes, colons). The "Never Compress" rules protect values inside data (API keys, URLs, version numbers). Both apply: convert structure to TOON, but preserve exact values.
JSON:
{"users":[{"id":1,"name":"John","role":"admin"},{"id":2,"name":"Jane","role":"user"}]}
TOON:
users[2]{id,name,role}:
1,John,admin
2,Jane,user
See: .claude/skills/document-skills/toon/SKILL.md
Never Compress
See references/never_compress.md for full list:
- Auth tokens, API keys, credentials, secrets
- Error stack traces (keep full)
- Code blocks, inline code, regex
- URLs, UUIDs, version numbers
- SQL queries, shell commands
- JSON keys, config values, date formats
- Legal text, mathematical formulas
Abbreviations
fn=function ret=return str=string num=number
bool=boolean arr=array obj=object param=parameter
config=configuration env=environment
auth=authentication authz=authorization
db=database repo=repository dir=directory
req=required opt=optional def=default
max=maximum min=minimum ex=example
impl=implementation docs=documentation
app=application info=information
Symbols
-> = returns/produces & = and
| = or w/ = with
w/o = without ~ = approximately
=> = therefore bc = because
Y = yes N = no
- = none/null
Output Format
## Compressed
[Content]
---
Original: X tokens | Compressed: Y tokens | Saved: Z%
Scripts
# Compress text
python scripts/compress.py input.md > compressed.md
python scripts/compress.py input.md --stats
python scripts/compress.py --level 2 < input.md
# Count tokens
python scripts/count_tokens.py document.md
# Compress prompt
python scripts/compress_prompt.py "your prompt text"
python scripts/compress_prompt.py --file prompt.txt --level heavy
Integration
Called by: brainstorm (Phase 5 docs), any skill producing documentation
Pairs with: document-skills/toon (data serialization)
More from georgekhananaev/claude-skills-vault
system-architect
System architecture skill for designing scalable, maintainable software systems. Covers microservices/monolith decisions, API design, DB selection, caching, security, and scalability planning.
21skill-creator
Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.
12code-quality
Multi-language code quality standards and review for TypeScript, Python, Go, and Rust. Enforces type safety, security, performance, and maintainability. Use when writing, reviewing, or refactoring code. Includes review process, checklist, and Python PEP 8 deep-dive.
12file-converter
Convert & transform files - images (resize, format, HEIC), markdown (PDF/HTML), data (CSV/JSON/YAML/TOML/XML), SVG, base64, text encoding. Cross-platform, single & batch mode. This skill should be used when converting file formats, resizing images, generating PDFs from markdown, or transforming data between formats.
12brainstorm
Transform ideas into fully-formed designs through collaborative dialogue. This skill should be used when brainstorming features, exploring implementation approaches, designing system architecture, or when the user has a vague idea that needs refinement. Uses incremental validation with 200-300 word sections.
11nextjs-senior-dev
Senior Next.js 15+/16 Engineer skill for App Router. Use when scaffolding production apps, enforcing RSC patterns, auditing codebases, or optimizing performance.
11