Try Tools · Dev
Headroom: what happened when we tested it
Compresses agent tool outputs and context before they reach the LLM.
Score
6.0/10
claims that held up
Verdict
F · Did not work221
Access needed
L0 Public web onlyTested 2026-10-20
Rule set before testing: the worst of JSON savings, same answers, speed and local-only. JSON savings failed (0–49%, claimed 60–95%), so the verdict is F although most other claims held up.
Compression was lossless and stayed on our machine, the vendor's own proof table reproduced exactly, and two large hosted models gave the same answers from the compressed input (10/10 both ways). But our 4 real JSON payloads saved 0-49% (not 60-95%), two small local models dropped from 9-10 to 4-5 of 10 on the compressed version, and a call took about 7 ms, not 0.21 ms.
0–49%
tokens saved on our 4 real JSON payloads
claimed 60–95%
10/10
answers unchanged on compressed input, 2 large hosted models
small local models: 9→4 and 10→5
7.45 ms
p50 per call at 10K tokens (repeated input)
claimed 0.21 ms; 27 ms on new input
0
network calls during compression
library mode, with and without telemetry opt-outs
Claim by claim
60-95% fewer tokens for JSONFailed
Our 4 real JSON payloads: 0%, 0%, 49.1%, 32.7%; none reached 60%. The vendor's own JSON benchmark on our box: 42-63% on arrays of objects, 77-97% only on plain string or number arrays. The README's caveat (repetitive data compresses, prose does not) is accurate; the 60-95% headline is not typical.
README proof table (21% / 57% / 42% / 30%) and '20% fewer tokens for coding agents'Partly
The proof table reproduced to the token with the vendor's seed, but it is the vendor's own synthetic corpus. We did not run a coding agent, so the 20% agent figure itself is untested.
Same answers, fraction of the tokensWorks
The data survives (20/20 answers present, every row decodes exactly; 44 of 300 snippets only via retrieval), and two large hosted models answered 10/10 from the original and 10/10 from the compressed slices with identical answers (NVIDIA Nemotron 3 Ultra 550B, Dots3-Note 280B), also on the full payloads (no drop). Caveat: two small local models (Qwen2.5 1.5B and 3B) dropped from 9/10 to 4/10 and 10/10 to 5/10, reading values from the wrong rows of the compact table. Questions whose answer sits behind a <<ccr:...>> marker were not tested; plain compress() gives the model no retrieve tool.
0.21 ms p50 at 10K tokens, 1.4 ms at 100KPartly
p50 7.45 ms at 10K and 6.20 ms at 100K on repeated input (the vendor's own script: 5.8 / 6.2 ms); 27 ms and 182 ms when every input is new. Small next to an LLM call, but 28-35x the claimed figure at 10K.
Compression runs on your machine; no content is sent anywhereWorks
0 network system calls during compression, with and without the telemetry opt-outs (library mode). The beacon lives in the proxy/MCP/integration code paths, which we did not run.
Open a claim to see what we measured.
The full report
Full result
Did not work as claimed, with real strengths. Headroom's compression was lossless and local: every fact could be recovered, nothing went over the network, the vendor's own proof table reproduced exactly, and two large hosted models gave the same answers from its output as from the original. But on our own JSON it saved 0-49%, not 60-95% (prose-heavy JSON such as GitHub issues was left untouched), and that claim alone makes the verdict a fail. Small local models answered half as many questions correctly from its compact table format, and a call took about 6-7 ms (27-182 ms on new input), not 0.21 ms. Worth a try on repetitive logs and tables with a large model; check answer quality first if you use a small one.
The test task and exact input
Fixed before installing (plan saved 11:18 UTC+8). C1a: rerun the vendor's proof script with its published seed; pass if within 2 points. C1b: 4 JSON payloads of our own (100 GitHub issues from psf/requests, 100 PyPI package records, 2,000 synthetic log lines with one planted FATAL, 300 Wikipedia search results) passed to compress() as a tool result; JSON claim V2 if all 4 save 60%+, V1 if some do, F if none. C2: 20 questions with answers computed by code (does each answer survive, directly or through Headroom's retrieval?), and a model answering from original vs compressed at temperature 0 (first small local models on CPU, then, at the founder's request, two large hosted models with the same slices, questions and scoring); V2 if accuracy drops by at most 1 and 95%+ survive, V1 for a drop of 2-4, F for more. C3: 50 timed calls after 3 warm-ups at 10K and 100K tokens; V2 if p50 is 1 ms or less at 10K, V1 if 10 ms or less. C4: watch network system calls during compression.
pip install 'headroom-ai[all]' (0.41.0) from headroom import compress result = compress(messages, model="gpt-4o") # messages = system, user, assistant tool call, tool result (our JSON)
What happened, step by step9 steps
- Captured the claims and pricing from the repo and README, wrote the plan and pass marks (11:17-11:18)
Observed: 76,311 stars. The README also says savings 'scale with how repetitive the payload is' and that an anonymous telemetry beacon is on by default. - C1a: ran the vendor's benchmarks/index_proof_table.py --seed 20260902 from tag v0.41.0
Observed: Exact match: 17,199 to 13,597 (21%), 55,957 to 24,340 (57%), 58,801 to 33,895 (42%), 46,067 to 32,429 (30%). 7.5 s, no network, no key. - C1b: compressed our 4 JSON payloads with the default compress() call and counted tokens with tiktoken o200k
Observed: GitHub issues 182,412 to 182,412 (0%), PyPI records 54,741 to 54,741 (0%), logs 110,682 to 56,373 (49.1%), Wikipedia search 35,135 to 23,637 (32.7%). None reached 60%. - Extra (not in the plan): reran with the vendor benchmark's 'full corpus' setting protect_recent=0 and read Headroom's debug log
Observed: Same numbers. The router picked 'passthrough' for the issues and PyPI payloads (it even classified the issue list as text), i.e. JSON whose objects are mostly unique prose is left alone. - C2a: checked 20 code-computed answers (5 per payload) and decoded every compressed row
Observed: 20 of 20 answers present. Logs: all 2,000 rows identical in a compact table format. Wikipedia: all 300 rows identical, but 44 of 300 snippets were replaced by '<<ccr:...>>' markers that a model has to fetch with headroom_retrieve; all 44 came back exactly from Headroom's local store. - C2b: asked 2 local models 10 questions (5 on 180 log lines incl. the FATAL one, 5 on 100 search results) from the original and from Headroom's output (11:31-11:49)
Observed: Slices compressed 11,477 to 5,161 and 12,788 to 7,953 tokens, and decoded losslessly. Qwen2.5-1.5B: 9/10 original, 4/10 compressed. Qwen2.5-3B: 10/10 original, 5/10 compressed (search results 1/5: it even named the second row as the first result). Full payloads were too big for these models on CPU. - C2 rerun with large hosted models (plan and pass mark committed first, 12:04): same Headroom version, same 2 slices, same 10 questions, same prompt and scoring, one question per request, temperature 0, via OpenRouter free models (12:05-12:13)
Observed: NVIDIA Nemotron 3 Ultra (550B): 10/10 original, 10/10 compressed. Dots3-Note Preview (280B): 10/10 original, 10/10 compressed. Both gave identical answers on both inputs. Thinking Machines Inkling refused API use (403), so it was not used. Extra: the full payloads now fit; asking the 5 C2a questions in one request per input, logs 5/5 to 5/5 for both models, search results 4/5 to 4/5 (Nemotron, same counting question missed on both) and 5/5 to 5/5 (Dots). None of the questions needed text behind a <<ccr:...>> marker, and none of the earlier small-model misses did either: they read values from the wrong row or column of the compact table. - C3: timed compress() 50 times after 3 warm-ups on 10K- and 100K-token Wikipedia search JSON (11:40)
Observed: Same input repeated: p50 7.45 ms at 10K, 6.20 ms at 100K. Extra, a different input each call: p50 27.2 ms at 10K, 182 ms at 100K. Extra, the vendor's own bench_latency.py on this box: 5.8 ms (10K search results) and 6.2 ms (100K). - C4: traced connect/sendto/sendmsg system calls while compressing all 4 payloads (11:40)
Observed: 0 network calls with the opt-outs set. Extra: 0 with no opt-outs at all, inside a network-less sandbox. Proxy, MCP and framework modes were not tested.
Failure modes seen6 items
- GitHub issues (182K tokens) and PyPI records (55K tokens) came back unchanged: 0% saved, also with protect_recent=0.
- Small local models (Qwen2.5 1.5B and 3B) were wrong on 5-6 of 10 questions from the compressed table format, against 0-1 of 10 from the original JSON; one named the second row as the first result. Two large hosted models (Nemotron 3 Ultra, Dots3-Note) were 10/10 on both.
- 44 of 300 Wikipedia snippets were replaced by <<ccr:...>> markers; a model only sees them if it calls headroom_retrieve (the proxy/MCP adds this tool; plain compress() does not).
- compress() p50 was about 6-7 ms on repeated input and 27 ms (10K) to 182 ms (100K) on new input, not 0.21 / 1.4 ms.
- The telemetry beacon is on by default (documented); set HEADROOM_BEACON=off or DO_NOT_TRACK=1.
- The install with all extras pulled in about 6.6 GB of Python packages.
Evidence files30 files
- File: Test plan and pass marks, written before installing
- File: Vendor claims, pricing and telemetry note as captured
- Log: C1a: vendor proof script rerun with the published seed
- File: C1b compression script for our 4 payloads
- File: C1b results: tokens before/after, transforms, time
- File: Extra: same with protect_recent=0
- Log: Extra: Headroom's routing decisions for the 0% payloads
- File: C2a retention and row-by-row lossless check (script)
- File: C2a results: 20 answers, rows, retrieval markers
- File: C2b local-model question script
- File: C2b answers: Qwen2.5-1.5B, original vs compressed
- File: C2b answers: Qwen2.5-3B, original vs compressed
- File: C2b check that the compressed slices were lossless (script)
- File: C2b lossless check results
- File: C2 hosted rerun: plan and pass mark, written before running
- File: C2 hosted rerun: question script (same method as C2b)
- File: C2 hosted answers: NVIDIA Nemotron 3 Ultra, original vs compressed
- File: C2 hosted answers: Dots3-Note Preview, original vs compressed
- File: Extra: full-payload script (5 questions per request)
- File: Extra: full-payload answers, Nemotron 3 Ultra
- File: Extra: full-payload answers, Dots3-Note
- File: Do misses trace to <<ccr:...>> markers? (script)
- File: Marker trace results
- File: C2 hosted rerun summary: scores, models, request count
- File: C3 latency script
- File: C3 latency results
- Log: Extra: vendor's bench_latency.py (JSON scenarios) on our box
- File: C4 workload script
- Log: C4 network watch: method and results
- File: Where our payloads came from and output excerpts (full payloads kept in the repo)
Vendor claims, as quoted
- "20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers." (repo description) and the README proof table: code search 21%, SRE incident 57%, codebase exploration 42%, GitHub issue triage 30% (source)
- "Same answers, fraction of the tokens." (source)
- "Compression costs well under a millisecond" ... "0.21 ms p50 on a 10K-token JSON search result, 1.4 ms at 100K tokens" (source)
- "Compression runs on your machine; no prompt or file content is sent anywhere to be compressed." (source)
Lowest-access way to try it
L0. pip install headroom-ai, set HEADROOM_BEACON=off if you do not want the telemetry beacon, and run compress() on a saved tool output (logs or a table-like JSON array work best). Before using it in an agent, ask your own model the same questions from the original and compressed versions, and use the proxy or MCP server if you need headroom_retrieve for <<ccr:...>> markers. In normal use it reads your agent's tool outputs and files (L1).
Details: vendor, pricing, environment, time, cost
Not sponsored. No affiliate links. Vendors do not see results before they are published.
How to cite
TriedAgents, "Headroom: tool test", did not work, tested 2026-10-20, https://triedagents.com/tools/headroom/
Get one re-run case every weekday
One agent use case we actually re-ran, every weekday. Free.
We only store your email address. Every issue has a one-click unsubscribe link. Privacy