4 miljoen tokens minder in één ochtend: zo laat ik Claude Code en Codex minder lezen
Claude Code en Codex draaien bij mij op een abonnement. Geld is dus niet het probleem, de limiet wel. Vier dingen die ik ertussen heb gezet, en wat het na één dag opleverde.

Ik draai Claude Code en Codex op een abonnement. Vast bedrag per maand, klaar. Geen API-sleutel, geen meter die tikt. Klinkt ideaal.
Totdat je een hele dag zit te bouwen. Ergens halverwege de middag zegt Claude: even wachten tot je limiet reset. Codex vijf minuten later hetzelfde. En ik zat nog vol energie.
Dus ik ben gaan kijken wat die twee nou eigenlijk de hele dag lezen.
Spoiler: niet mijn vragen. Die zijn kort. Wat ze lezen is de uitvoer van git status. De complete testrun, inclusief de paar honderd tests die gewoon slagen. Een mappenlijst. Een bestand dat ze twintig beurten geleden al hadden gezien. En wat ze terugschrijven? Drie alinea's waar één zin genoeg was.
Dus wat doe je, als programmeur die z'n limiet zat is?
Juist. Je zet er iets tussen.
Vier dingen, om precies te zijn.
1. Headroom, de portier

Headroom is een lokale proxy tussen de CLI en de API. Claude Code wijst ernaar via ANTHROPIC_BASE_URL, Codex via een eigen model provider in config.toml. Hij luistert alleen op 127.0.0.1:8787, draait als launchd-service en staat dus al aan voordat ik een terminal open.
Twee instellingen doen ertoe. Cache mode: Headroom stuurt alleen het verschil per verzoek door, zodat de prompt cache van de provider blijft raken. Er zijn agressievere standen. Die besparen meer per verzoek en slopen de cache. Netto kost dat meer. Code-aware: met de tree-sitter extra erbij begrijpt-ie broncode structureel, niet als platte tekst.
Memory uit, telemetrie uit, Kompress uit. Nergens een API-sleutel toegevoegd. Beide tools loggen gewoon in met hun abonnement, Headroom geeft het verkeer alleen door.
2. RTK, de samenvatter

RTK is een CLI-wrapper. rtk git status geeft precies hetzelfde als git status, minus de randjes, lege regels en herhaling. Kent git, gh, pnpm, docker, kubectl, testrunners en nog een paar dozijn andere. In Claude Code haakt-ie in op elke shellaanroep, ik typ 'm nooit. In Codex is het één regel in de globale instructies: zet rtk voor elk commando. Homebrew, vijf minuten, klaar.
3. Caveman, de korte versie

Caveman is een gedragsplugin. Lidwoorden weg, opvulling weg, slagen om de arm weg. Technische termen, paden en foutmeldingen blijven exact. Code en commitberichten blijven gewoon normaal. Een statusupdate leest ineens als een briefje van een collega die het druk heeft, niet als een persbericht. Ik vind dat prettig. Niet iedereen.
Full mode op beide tools. De proxy die Caveman ook meelevert heb ik níet geïnstalleerd. Headroom heeft die laag al, en van twee proxy's die om hetzelfde verzoek vechten word je niet blij.
4. Ponytail, de luie senior

Ponytail laat de agent zich gedragen als een luie senior developer. Lui in de goede zin: voordat-ie iets schrijft, loopt-ie een lijstje af. Moet dit überhaupt bestaan? Heeft de codebase dit al? Doet de standaardbibliotheek het? Kan het in één regel? Pas daarna komt er code.
Minder bestanden, minder abstracties, minder om te reviewen. En dus ook minder om de volgende beurt weer in te lezen. Daar draait het om.

En, werkt het?
Stand van de eerste dag, om half twaalf 's ochtends. Gemeten door de tools zelf, en ze meten verschillende dingen, dus even opletten.
- Headroom: 3,9 miljoen van 59,9 miljoen input-tokens weggehaald. 6,6%, over 667 aanroepen. Codex 6,7%, Claude Code 6,1%.
- RTK: 265K van 2,4 miljoen tokens tool-uitvoer weg. 10,9%, over 1.436 commando's.
- Caveman en Ponytail: niet gemeten. Kan ik lokaal niet.
Drie dingen die ik er eerlijk bij moet zeggen.
Tel die twee percentages niet op. Headroom rekent over elk verzoek, RTK alleen over de shell-uitvoer die-ie aanraakte. Die overlappen.
Geen euro's. Ik had ze eerst wel in mijn dashboard staan, geschat. Weggehaald. Op een abonnement is dat bedrag fictie, en ik laat liever tokens zien die ik kan tellen dan geld dat ik heb gegokt.
Caveman en Ponytail kósten ook wat. Allebei plakken ze instructies aan elk verzoek. Of dat netto positief uitpakt, hangt van de taak af. Bij lange sessies met veel heen-en-weer: ja, is mijn gevoel. Bewijzen kan ik het nog niet.
Meten dan maar
Headroom heeft een eigen savings-commando. Stopt bij 30 dagen. Leuk om even te kijken, waardeloos voor een trend. Dus een klein Python-script kopieert elk uur via launchd de metadata van elke besparing naar een lokaal archief: tijdstip, client, model, aantallen tokens, bron. Prompts, antwoorden en credentials komen er niet in.
Daarbovenop een usage --savings shellfunctie: Headroom vandaag, Headroom 30 dagen, archieftotalen per client, RTK all-time, en welke gedragsmodi aanstaan. Dezelfde cijfers staan als extra regels onder mijn dag-, week- en maandrapport.
Wat het bewust níet doet: sessies aan elkaar knopen. Headroom en RTK hebben geen gedeeld sessie-id. Er een verzinnen levert een getal op dat heel precies lijkt, en dat niet is.
Waar ik tegenaan liep
headroom install restartkan op macOS in de knoop raken met launchd dat de service weghaalt.headroom install start --profile defaultlost het op. Check daarna/readyz. Het staat beschreven in issue #1289, inmiddels gesloten, maar ik liep er op 0.37.0 nog tegenaan.- Controleer of de tools écht via de proxy lopen. Een proxy die werkt, met een client die er stiekem langs praat, bespaart niks en meldt niks. En dat ziet er precies zo uit als een kapot dashboard.
- Pin je pluginversies. Caveman en Ponytail leveren allebei hooks mee. Lees die voordat je ze vertrouwt.
De prompt
Zelf doen? Plak dit in Claude Code of Codex op de machine die je wilt inrichten. Gaat uit van macOS met Homebrew en uv. Andere setup: paden aanpassen.
Set up a token-saving stack for my Claude Code and Codex CLI installs. Both log in with a subscription. Do not add, request or store an API key anywhere. Change only global config on this Mac, never a project repository. Show me every config diff before you apply it.
1. Headroom (request compression proxy)
- Install: uv tool install "headroom-ai[proxy,code]"
- Deploy as a persistent local service on 127.0.0.1:8787 for both clients:
headroom install apply --preset persistent-service --scope provider --providers manual --target claude --target codex --mode cache --backend anthropic --no-telemetry --code-aware
- Do not enable memory or telemetry. Set HEADROOM_DISABLE_KOMPRESS=1 on the service.
- Expected result: ~/.claude/settings.json has env ANTHROPIC_BASE_URL=http://127.0.0.1:8787; ~/.codex/config.toml has model_provider = "headroom" with base_url http://127.0.0.1:8787/v1 and requires_openai_auth = true.
- Verify with headroom install status and curl http://127.0.0.1:8787/readyz, then send one real request through each client and confirm it appears in headroom savings.
- If restart races launchd on macOS, use headroom install start --profile default.
2. RTK (tool output compression)
- brew install rtk, then rtk init.
- Claude: ensure a PreToolUse hook runs "rtk hook claude".
- Codex: add the RTK instruction file to my global AGENTS.md so every shell command is prefixed with rtk.
- Verify: rtk gain shows at least one command after a test call.
3. Caveman (shorter replies, behaviour only)
- Claude: claude plugin marketplace add JuliusBrussee/caveman, then claude plugin install caveman@caveman. Enable full mode.
- Codex: copy SKILL.md from that repo at tag v2.6.0 into ~/.codex/skills/caveman and include it from my global AGENTS.md.
- Do NOT install the Caveman proxy. Headroom owns the proxy layer.
4. Ponytail (less code, behaviour only)
- Claude: claude plugin marketplace add DietrichGebert/ponytail, then claude plugin install ponytail@ponytail. Full mode.
- Codex: add the ponytail marketplace to config.toml pinned to v4.9.0 and enable the plugin. List the hooks it installs and let me review them before trusting.
5. Measurement
- Add a usage --savings shell function that prints: Headroom today and 30 days (headroom savings --json), a durable per-client archive total, RTK all-time (rtk gain --format json), and which Caveman/Ponytail modes are active.
- Write ~/.local/bin/llm-compression-usage: copy new events from ~/.headroom/savings_events.jsonl into ~/.local/share/llm-usage/headroom-events.jsonl with mode 0600, deduplicated, keeping only timestamp, client, model, token counts, cost field and source. Never store prompts or responses. Run it hourly and at login through a launchd agent.
- Add the same savings as extra rows to my daily, weekly and monthly ccusage reports, using Europe/Amsterdam day and week boundaries.
- Rules: tokens only, no estimated dollar or euro savings for any tool. Keep Headroom and RTK totals separate and label why. Do not invent session attribution between tools. Add a small test file for the helper covering timezone boundaries, deduplication and field filtering.
6. Finish by running usage --savings in a fresh login shell and reporting exactly what passed, what failed and what you could not verify.Te vroeg om iets te roepen
Eén ochtend data. Daar trek je geen conclusies uit. Maar wat ik zie, ziet er goed uit: elke prompt gaat kleiner de deur uit, elke tool-uitvoer komt kleiner terug, en bij honderden aanroepen per dag tikt dat hard aan.
Zelf beginnen? Doe RTK en Headroom in cache mode eerst. Die twee zijn mechanisch, meetbaar, en je merkt er niks van. Caveman en Ponytail zijn smaak. Probeer ze een week. Te kortaf? Zet ze op lite. Eén regel.
Over een maand het vervolg, met een archief dat dan wel iets zegt.