What Claude Code rereads on every turn.
Claude Code sends its whole context with every request. tacet, my open source tool, trims what it loads and reads: 40% cheaper in its benchmark, same answers.
7 min read
You ask Claude Code one small question late in the afternoon. Where is this function called? The answer comes back in seconds. The usage bar moves more than the question deserves.
It moves because Claude Code never sends only your question. It sends the whole context with every request: your CLAUDE.md, every tool definition and everything it has read so far. The 28-page PDF you asked about after lunch goes again. So do the grep results from an hour ago. Prompt caching makes the repeats cheap, not free. A long document read once is paid for on every turn after it.
Try it
What Claude Code sends again on every turn
Play one afternoon in a made-up project. Each turn sends the whole context again, everything read so far included. Then switch tacet on and watch the same afternoon get lighter.
The context, turn by turn
Press Next turn to start the afternoon
- Sent this turn
- 0
- Sent so far
- 0
- Change with tacet
- 0%
Prompt caching makes the repeats cheap, not free.
What is in it
Press Next turn to start the afternoon
One command, then it works on its own
tacet is my answer to that. It is a free, open source tool for Claude Code, written in Go. You run tacet init once in a project. From then on it works through Claude Code's own hooks and trims two things: what every session loads before you type and what gets read during the work.
- Long documents open small. A PDF, Word, PowerPoint or Excel file is converted to Markdown once. A long one opens on an outline plus the sections that match your request.
- Code is found by symbol. A code map of the project's symbols and calls answers where a name is defined and who calls it, without a grep through the tree. Go, TypeScript, Python, Rust, PHP, Java and more.
- Search subagents run cheaper. Claude Code hands wide file searches to a subagent that runs on your main model. tacet can run that read-only search agent on Haiku or Sonnet while your main model keeps planning and writing the code.
tacet initasks which. - Secrets stay out. Reads of
.envfiles, keys and credentials are blocked. So are commands likecat .env. Each block comes with a reason Claude Code can act on. - Sessions continue. Before a compact and when a session ends, tacet writes
SESSION.mdfrom the transcript and git. A new session gets it only when you ask to carry on, so other sessions do not pay for it. - Office and audio files work. Claude Code refuses Word, PowerPoint, Excel and audio files outright. tacet converts the document or transcribes the voice note as soon as your prompt names it.
- Instruction files stay lean.
CLAUDE.md,AGENTS.mdand rules files are checked for stale paths, duplicates and procedures that belong in a skill.
A hook call takes about 10 milliseconds. Anything that would change your files waits for a yes and can be undone.
Here is a real run on a made-up sample project in a throwaway folder: a small Go shop whose CLAUDE.md carries a five-step release procedure and a hand-drawn directory tree.
init measured what every session loads, installed the plugin and found five suggestions. Each one waits for a yes in /tacet. The status tab lists them with what they save: the release procedure moves into a skill that loads only when it is needed. The drawn tree goes, since the agent can list the folder itself. One of them says what it costs instead. Importing AGENTS.md makes Claude follow rules it was skipping. It also adds its tokens to every session.
Look at the first line of the status tab too. On this sample the startup context went up, from 177 to 327 tokens, because tacet's own code tools are listed with it. A project this small has little to trim at startup. The last tab applies the release suggestion: the five steps now load as a 17-token skill description.
Measured, not promised
Every tacet feature has to save tokens on real Claude Code runs without making answers worse. Each one is measured on its own with A/B runs through claude -p, with and without tacet, three times each, on Claude Haiku. Every prompt starts with a unique id, so no run reuses another run's prompt cache. Tokens is everything a run processed. Cost is what Claude Code reported, which weighs cache writes high and cache reads low, as your bill and usage limits do. An answer counts as correct only when it holds every expected fact.
- A question about one part of a 28-page PDF: 56% fewer tokens, 65% lower cost.
- Facts from the start, middle and end of that PDF, plus a summary: 69% fewer tokens, 72% lower cost.
- A question about one part of a Word file: 63% fewer tokens, 46% lower cost.
- "Continue where we left off" with a half-done change: 45% fewer tokens, 26% lower cost.
- Where a widely used function is defined and called in a 430-file repo: 57% fewer tokens, 81% lower cost.
- What a voice note says, one run each: without tacet Claude Code cannot do it at all.
Then the harder test. tacet against six of the most popular tools of its kind and Claude Code's own Concise style, on ten tasks: questions about a 43-page PDF and a Word file, finding code in Go, Python and Rust, fixing failing tests, continuing a half-done change and a large search a subagent does. Every tool ran at its defaults on Claude Code 2.1.314, three times per task, with every answer checked.
From the benchmark
Ten tasks against Claude Code alone
Every tool at its defaults, three runs per task, every answer checked. Switch between cost and tokens, then go task by task to see who was cheapest, tacet’s losses included.
Cost per run against Claude Code alone
Claude Code alone0%29/30
tacetHaiku search, the default−40%29/30
tacetmain-model search−6%30/30
caveman4.0.1−21%29/30
rtk1.1.0−15%30/30
serena2.1.0−11%29/30
Concise styleClaude Code−10%28/30
context-mode1.0.169−6%30/30
graphify0.9.97−3%30/30
claude-mem15.6.0+11%29/30
tacet with search subagents on Haiku, the tacet init default, cost 40% less. With search on the main model the saving is 6%.
tacet cost 40% less than Claude Code alone with the same answers: 29 of 30, as without it. Most of that comes from one task. On the large search a subagent does, the cost per run fell from $0.1792 to $0.0905, because the search ran on Haiku. With search left on the main model, tacet's saving is 6%. It is also the only tool in the run that lowers the tokens processed. Every other tool adds some.
Honest limits
- Quick code lookups in small repos. Claude Code alone or serena is a little cheaper there, because tacet's code tools add about 450 tokens to each request. Finding a Go function cost $0.0040 alone and $0.0042 with tacet. In the Rust repo it was $0.0041 against $0.0051. On the two test fixes Concise is a hair cheaper.
- A name grep finds at once. For a function with a distinctive name, the code map used 3% more tokens. Cost still fell 10%, so it stays on.
- Denying lockfiles was removed. Blocking reads of lockfiles and build output was measured and cut. On a 475 KB lockfile it used 12% more tokens and 7% more cost and got none of three answers right, where Claude Code alone got all three. Claude Code already refuses a file that big and greps it.
- Some ideas ship off or were cut. Lint feedback after edits and a test gate before finishing showed no gain, so they ship off. A terse output style cost 1% more and lost two answers, so it was cut.
- Token counts are estimates.
tacet measure,tacet statusand the report count tokens offline. They are close, not exact. The billed figure intacet statusshows only after 20 main-session requests since init. - Savings depend on your setup. A project with a short
CLAUDE.mdand no documents has little to save. The sample above is one. - Office files must be named. Claude Code refuses them before any hook runs, so tacet helps when your prompt names the file or the file is in the repo when the session starts. A scanned PDF with no text layer passes through as usual.
- Claude Code only, for now. Codex and Cursor are on the roadmap (opens in a new tab).
What it will not do
- It never sends anything about your project anywhere. The network is used only for the audio model download you start and a daily check for a newer release, which only asks.
- It never updates itself without a yes.
tacet updatechecks the release signature and checksum before it replaces anything. - It never credits itself in your commits or files.
- It changes your files only after a yes and only in ways it can undo:
tacet undoreverts the last change andtacet uninstallreverts all of them. Its own state lives in.tacet/, kept out of git. - The secret guard is a guard against accidents, not a sandbox. Claude Code's own permission settings are the place for hard rules.
Install
curl -fsSL https://rythm.sh/tacet/install.sh | sh # or: npm i -g @rhythmsh/tacetcd your-project && tacet initWindows, Homebrew, Scoop and Go installs are in the README. Restart Claude Code afterwards and type /tacet to see what it saved. It works the same in the terminal and in the VS Code extension.
tacet is free and open source under the MIT licence. The code, the docs and the benchmark (opens in a new tab) with its raw data are on GitHub (opens in a new tab). My other tools are on the open source page.
Next
Here is what I would do next
- Run
tacet initon the project where your usage climbs fastest. - Pick Haiku for search subagents when it asks. Your main model still writes the code.
- Check
tacet statusafter twenty requests and compare it with the baseline. - Read the benchmark's method before you trust any number, mine included.