[{"data":1,"prerenderedAt":1084},["ShallowReactive",2],{"reviews:list":3},[4],{"id":5,"title":6,"accent":7,"body":8,"description":1035,"estReadTime":1036,"extension":1037,"eyebrow":1038,"icon":1039,"intro":1040,"lastUpdated":1041,"meta":1042,"navigation":1043,"next":1044,"path":1047,"prev":1048,"review":1051,"seo":1061,"stem":1073,"tocItems":1074,"__hash__":1083},"docs\u002Freviews\u002Fcaveman.md","Caveman plugin","reviews",{"type":9,"value":10,"toc":1030},"minimark",[11,48,150,319,464,537,655,971,1026],[12,13,16,28,40],"docs-section",{"id":14,"title":15},"verdict","Verdict",[17,18,19,23,24,27],"p",{},[20,21,22],"strong",{},"Caveman is a useful output-side compression trick that pays for itself on prose-heavy work and quietly underdelivers on code."," In our four-prompt benchmark on Opus (high effort), output tokens dropped 31–37% on the code and mixed prompts but went ",[20,25,26],{},"up"," ~30% on the explanation prompt — Caveman didn't shrink the answer, it rewrote it tersely and used the saved budget to add more sub-points. End-to-end the session ran ~34% cheaper.",[17,29,30,31,34,35,39],{},"The interesting finding isn't the savings number — it's the ",[20,32,33],{},"workflow regression",": the same \"write me a utility + tests\" prompt that produced two files on disk in baseline produced an inline code dump (no ",[36,37,38],"code",{},"Write"," tool call) under Caveman. Same code quality, different behavior. That's the kind of trade-off the README doesn't surface.",[41,42,45],"docs-callout",{"title":43,"variant":44},"Recommend it for","info",[17,46,47],{},"Solo, explanation-heavy sessions where you want denser output — debugging walkthroughs, architecture write-ups, \"explain this\" prompts. Skip it (or toggle off) for hands-on coding sessions where you want Claude to actually create files, and for any pairing or onboarding context where readability matters more than cost.",[12,49,52,90,106],{"id":50,"title":51},"what-it-is","What it is",[17,53,54,61,62,65,66,69,70,69,73,76,77,69,80,69,83,69,86,89],{},[55,56,60],"a",{"href":57,"rel":58},"https:\u002F\u002Fgithub.com\u002FJuliusBrussee\u002Fcaveman",[59],"nofollow","Caveman"," is a Claude Code plugin (and skill bundle) by Julius Brussee. It registers a ",[36,63,64],{},"SessionStart"," hook that injects a terse \"caveman\" output style — short fragments, dropped articles, no preamble — and ships intensity levels (",[36,67,68],{},"lite",", ",[36,71,72],{},"full",[36,74,75],{},"ultra",", plus a 文言文 wenyan variant), a statusline badge, and four sub-skills: ",[36,78,79],{},"caveman-commit",[36,81,82],{},"caveman-review",[36,84,85],{},"caveman-compress",[36,87,88],{},"caveman-help",".",[17,91,92,93,96,97,100,101,105],{},"It's a ",[20,94,95],{},"style-only"," plugin — it doesn't reduce input tokens, only the model's prose output. Your ",[36,98,99],{},"CLAUDE.md",", file reads, and tool outputs still cost what they cost. That makes it a complement to the input-side hygiene we cover in ",[55,102,104],{"href":103},"\u002Ftokens","Token Mastery",", not a replacement.",[107,108,113],"pre",{"className":109,"code":110,"language":111,"meta":112,"style":112},"language-bash shiki shiki-themes github-light","claude plugin marketplace add JuliusBrussee\u002Fcaveman\nclaude plugin install caveman@caveman\n","bash","",[36,114,115,137],{"__ignoreMap":112},[116,117,120,124,128,131,134],"span",{"class":118,"line":119},"line",1,[116,121,123],{"class":122},"s7eDp","claude",[116,125,127],{"class":126},"sYBdl"," plugin",[116,129,130],{"class":126}," marketplace",[116,132,133],{"class":126}," add",[116,135,136],{"class":126}," JuliusBrussee\u002Fcaveman\n",[116,138,140,142,144,147],{"class":118,"line":139},2,[116,141,123],{"class":122},[116,143,127],{"class":126},[116,145,146],{"class":126}," install",[116,148,149],{"class":126}," caveman@caveman\n",[12,151,154,160,199,210,213,279,290,312],{"id":152,"title":153},"how-we-tested","How we tested",[17,155,156,157,159],{},"The bench lives in a scratch folder, not Claudeverse — testing inside this repo would let our ",[36,158,99],{}," and file reads dominate the input side and wash out output deltas.",[107,161,163],{"className":109,"code":162,"language":111,"meta":112,"style":112},"mkdir ~\u002Fcaveman-bench && cd ~\u002Fcaveman-bench\necho \"Scratch folder for benchmarking Claude Code output styles.\" > CLAUDE.md\n",[36,164,165,184],{"__ignoreMap":112},[116,166,167,170,173,177,181],{"class":118,"line":119},[116,168,169],{"class":122},"mkdir",[116,171,172],{"class":126}," ~\u002Fcaveman-bench",[116,174,176],{"class":175},"sgsFI"," && ",[116,178,180],{"class":179},"sYu0t","cd",[116,182,183],{"class":126}," ~\u002Fcaveman-bench\n",[116,185,186,189,192,196],{"class":118,"line":139},[116,187,188],{"class":179},"echo",[116,190,191],{"class":126}," \"Scratch folder for benchmarking Claude Code output styles.\"",[116,193,195],{"class":194},"sD7c4"," >",[116,197,198],{"class":126}," CLAUDE.md\n",[17,200,201,202,205,206,209],{},"Two sessions, same model (Opus), same effort level (high), three prompts each, fresh ",[36,203,204],{},"\u002Fclear"," between. Baseline first, then ",[36,207,208],{},"claude plugin install caveman@caveman"," and re-run.",[17,211,212],{},"The three prompts span the variance:",[214,215,216,232],"table",{},[217,218,219],"thead",{},[220,221,222,226,229],"tr",{},[223,224,225],"th",{},"Prompt",[223,227,228],{},"Shape",[223,230,231],{},"Why",[233,234,235,249,266],"tbody",{},[220,236,237,243,246],{},[238,239,240],"td",{},[20,241,242],{},"A — debug",[238,244,245],{},"React 15 child re-render walkthrough",[238,247,248],{},"Prose-heavy, no code generation",[220,250,251,256,263],{},[238,252,253],{},[20,254,255],{},"B — code",[238,257,258,259,262],{},"TS ",[36,260,261],{},"chunk\u003CT>"," utility + 6 Vitest cases",[238,264,265],{},"Code-heavy, control case",[220,267,268,273,276],{},[238,269,270],{},[20,271,272],{},"C — mixed",[238,274,275],{},"Cmd\u002FCtrl+K dialog in Nuxt 4 (files + a11y + manual tests)",[238,277,278],{},"Realistic mixed workload",[17,280,281,282,285,286,289],{},"For each, we captured: the full response verbatim, ",[36,283,284],{},"\u002Fcost"," output, and one statusline screenshot to confirm the ",[36,287,288],{},"[CAVEMAN]"," badge was active.",[41,291,294],{"title":292,"variant":293},"The statusline merge","tip",[17,295,296,297,300,301,303,304,307,308,311],{},"If you already use ",[36,298,299],{},"ccusage"," (or any custom statusline), Caveman's ",[36,302,64],{}," hook ",[20,305,306],{},"does not overwrite it"," — it just writes a flag file at ",[36,309,310],{},"~\u002F.claude\u002F.caveman-active",". Wrap both in a script that reads the flag and prepends the badge to your existing statusline output. Otherwise the plugin runs invisibly and you can't tell which mode is active.",[17,313,314],{},[315,316],"img",{"alt":317,"src":318},"Statusline showing the CAVEMAN badge to the left of the ccusage usage strip","\u002Fimages\u002Freviews\u002Fcaveman\u002Fstatusline-badge.png",[12,320,323,328,394,401,408,415,420,426,432,436,442,448,452,458],{"id":321,"title":322},"results","What we found",[324,325,327],"h3",{"id":326},"token-deltas-per-prompt-opus-output","Token deltas per prompt (Opus output)",[214,329,330,346],{},[217,331,332],{},[220,333,334,336,340,343],{},[223,335,225],{},[223,337,339],{"align":338},"right","Baseline output",[223,341,342],{"align":338},"Caveman output",[223,344,345],{"align":338},"Delta",[233,347,348,364,379],{},[220,349,350,353,356,359],{},[238,351,352],{},"A — explanation",[238,354,355],{"align":338},"~1.0k tokens",[238,357,358],{"align":338},"~1.3k tokens",[238,360,361],{"align":338},[20,362,363],{},"+30%",[220,365,366,368,371,374],{},[238,367,255],{},[238,369,370],{"align":338},"~2.6k tokens",[238,372,373],{"align":338},"~1.8k tokens",[238,375,376],{"align":338},[20,377,378],{},"−31%",[220,380,381,383,386,389],{},[238,382,272],{},[238,384,385],{"align":338},"~6.3k tokens",[238,387,388],{"align":338},"~4.0k tokens",[238,390,391],{"align":338},[20,392,393],{},"−37%",[17,395,396,397,400],{},"Session totals: ",[20,398,399],{},"$0.34 baseline → $0.22 Caveman"," (~34% cheaper end-to-end).",[17,402,403,404,407],{},"The Prompt A reversal was the surprise. We expected the biggest savings on the most prose-heavy task. What actually happened: Caveman covered more causes (7 vs. 6) with denser sentences, then used the saved budget to add more confirm\u002Ffix sub-points. Caveman didn't shrink the answer — it rewrote it tersely and ",[20,405,406],{},"expanded the scope"," with the saved tokens. That's a useful finding on its own: \"denser per token\" doesn't always mean \"fewer tokens.\"",[324,409,411,412,414],{"id":410},"side-by-side-cost-output","Side-by-side ",[36,413,284],{}," output",[416,417,419],"h4",{"id":418},"prompt-a-explanation","Prompt A — explanation",[17,421,422],{},[315,423],{"alt":424,"src":425},"Baseline \u002Fcost output for Prompt A — explanation walkthrough","\u002Fimages\u002Freviews\u002Fcaveman\u002Fbaseline-A-cost.png",[17,427,428],{},[315,429],{"alt":430,"src":431},"Caveman \u002Fcost output for Prompt A — denser per token but ~30% larger","\u002Fimages\u002Freviews\u002Fcaveman\u002Fcaveman-A-cost.png",[416,433,435],{"id":434},"prompt-b-code","Prompt B — code",[17,437,438],{},[315,439],{"alt":440,"src":441},"Baseline \u002Fcost output for Prompt B — utility + tests, files written to disk","\u002Fimages\u002Freviews\u002Fcaveman\u002Fbaseline-B-cost.png",[17,443,444],{},[315,445],{"alt":446,"src":447},"Caveman \u002Fcost output for Prompt B — same code, dumped inline, no Write tool call","\u002Fimages\u002Freviews\u002Fcaveman\u002Fcaveman-B-cost.png",[416,449,451],{"id":450},"prompt-c-mixed","Prompt C — mixed",[17,453,454],{},[315,455],{"alt":456,"src":457},"Baseline \u002Fcost output for Prompt C — full Nuxt search-dialog walkthrough","\u002Fimages\u002Freviews\u002Fcaveman\u002Fbaseline-C-cost.png",[17,459,460],{},[315,461],{"alt":462,"src":463},"Caveman \u002Fcost output for Prompt C — same coverage, ~37% fewer output tokens","\u002Fimages\u002Freviews\u002Fcaveman\u002Fcaveman-C-cost.png",[12,465,468,471,488,494,507,534],{"id":466,"title":467},"regression","The file-write regression",[17,469,470],{},"Prompt B is where the headline finding lives, and it isn't a token-count problem.",[17,472,473,476,477,479,480,483,484,487],{},[20,474,475],{},"Baseline behavior."," Claude used the ",[36,478,38],{}," tool, created ",[36,481,482],{},"chunk.ts"," and ",[36,485,486],{},"chunk.test.ts"," on disk, then confirmed in chat:",[489,490,491],"blockquote",{},[17,492,493],{},"Created chunk.ts and chunk.test.ts. The implementation uses slice in a stride loop (O(n), no mutation of input), and the test for the throw case covers both 0 and a negative value since \"size \u003C 1\" includes both.",[17,495,496,499,500,506],{},[20,497,498],{},"Caveman behavior."," Same prompt, same model, same folder. Claude printed the full code in chat and ",[20,501,502,503,505],{},"did not call the ",[36,504,38],{}," tool"," — no files appeared on disk. The code itself was equivalent (the throw test even covered more cases), but the workflow shifted: a \"write me a utility\" prompt produced a code dump in the terminal instead of files in the repo.",[41,508,511],{"title":509,"variant":510},"Why this happens (best guess)","warning",[17,512,513,514,518,519,522,523,526,527,530,531,533],{},"Caveman's style instruction nudges Claude toward \"answer first, terse, no preamble.\" That style cue appears to compete with the model's tool-use bias — when the answer is \"here is the code,\" terse Claude leans toward ",[515,516,517],"em",{},"printing"," rather than ",[515,520,521],{},"doing",". We did not test whether ",[36,524,525],{},"\u002Fcaveman lite"," or ",[36,528,529],{},":ultra"," change this; if you adopt Caveman for coding work, verify your file-creation prompts still trigger ",[36,532,38],{}," calls before you trust it.",[17,535,536],{},"This is the kind of caveat the README doesn't surface, and it's the headline reason Caveman shouldn't be a default in coding sessions.",[12,538,541,652],{"id":539,"title":540},"when","When it helps \u002F when it hurts",[214,542,543,555],{},[217,544,545],{},[220,546,547,550,553],{},[223,548,549],{},"Scenario",[223,551,15],{"align":552},"center",[223,554,231],{},[233,556,557,570,582,594,607,620,639],{},[220,558,559,562,567],{},[238,560,561],{},"Solo debugging walkthroughs",[238,563,564],{"align":552},[20,565,566],{},"Helps",[238,568,569],{},"Denser per token, easy to skim",[220,571,572,575,579],{},[238,573,574],{},"Architecture \u002F \"explain X\" prompts",[238,576,577],{"align":552},[20,578,566],{},[238,580,581],{},"Same coverage, less verbose",[220,583,584,587,591],{},[238,585,586],{},"Mixed plan + code prompts",[238,588,589],{"align":552},[20,590,566],{},[238,592,593],{},"Saw the largest absolute savings (37%)",[220,595,596,599,604],{},[238,597,598],{},"Pure code generation",[238,600,601],{"align":552},[20,602,603],{},"Mixed",[238,605,606],{},"Real token savings, but file-write regression",[220,608,609,612,617],{},[238,610,611],{},"Pairing \u002F teaching \u002F onboarding",[238,613,614],{"align":552},[20,615,616],{},"Hurts",[238,618,619],{},"Caveman prose reads great solo and terribly when someone else has to act on it",[220,621,622,625,629],{},[238,623,624],{},"Any session relying on tool calls",[238,626,627],{"align":552},[20,628,616],{},[238,630,631,632,634,635,638],{},"Style cue can suppress ",[36,633,38],{},"\u002F",[36,636,637],{},"Edit"," usage",[220,640,641,644,649],{},[238,642,643],{},"Junior devs learning Claude Code",[238,645,646],{"align":552},[20,647,648],{},"Skip",[238,650,651],{},"Readability matters more than cost at this stage",[17,653,654],{},"Re-readability is the gut check. Run a Caveman response past a teammate who didn't write the prompt: if they can act on it, great. If they have to ask \"wait, what does this mean?\", you're trading clarity for cost — and clarity usually wins long-term.",[12,656,659,685,691,710,713,925,953],{"id":657,"title":658},"install","Try it yourself",[107,660,661],{"className":109,"code":110,"language":111,"meta":112,"style":112},[36,662,663,675],{"__ignoreMap":112},[116,664,665,667,669,671,673],{"class":118,"line":119},[116,666,123],{"class":122},[116,668,127],{"class":126},[116,670,130],{"class":126},[116,672,133],{"class":126},[116,674,136],{"class":126},[116,676,677,679,681,683],{"class":118,"line":139},[116,678,123],{"class":122},[116,680,127],{"class":126},[116,682,146],{"class":126},[116,684,149],{"class":126},[17,686,687,688,690],{},"Confirm the plugin is active by checking the flag file the ",[36,689,64],{}," hook writes:",[107,692,694],{"className":109,"code":693,"language":111,"meta":112,"style":112},"cat ~\u002F.claude\u002F.caveman-active\n# expected: full   (or whatever mode is active)\n",[36,695,696,704],{"__ignoreMap":112},[116,697,698,701],{"class":118,"line":119},[116,699,700],{"class":122},"cat",[116,702,703],{"class":126}," ~\u002F.claude\u002F.caveman-active\n",[116,705,706],{"class":118,"line":139},[116,707,709],{"class":708},"sAwPA","# expected: full   (or whatever mode is active)\n",[17,711,712],{},"If you already have a custom statusline, Caveman won't overwrite it — wrap your existing script and prepend the badge yourself:",[107,714,717],{"className":109,"code":715,"filename":716,"language":111,"meta":112,"style":112},"#!\u002Fusr\u002Fbin\u002Fenv bash\n# Read the active caveman mode (if any) and prepend a colored badge\n# to whatever your existing statusline command emits.\nmode_file=\"$HOME\u002F.claude\u002F.caveman-active\"\nbadge=\"\"\nif [ -f \"$mode_file\" ]; then\n  mode=$(tr '[:lower:]' '[:upper:]' \u003C \"$mode_file\" | tr -d '[:space:]')\n  if [ -n \"$mode\" ]; then\n    badge=$'\\033[38;5;208m['\"CAVEMAN${mode:+:$mode}\"$']\\033[0m '\n  fi\nfi\nprintf \"%s%s\" \"$badge\" \"$(npx ccusage statusline 2>\u002Fdev\u002Fnull)\"\n","~\u002F.claude\u002Fstatusline.sh",[36,718,719,724,729,735,753,764,790,833,855,882,888,894],{"__ignoreMap":112},[116,720,721],{"class":118,"line":119},[116,722,723],{"class":708},"#!\u002Fusr\u002Fbin\u002Fenv bash\n",[116,725,726],{"class":118,"line":139},[116,727,728],{"class":708},"# Read the active caveman mode (if any) and prepend a colored badge\n",[116,730,732],{"class":118,"line":731},3,[116,733,734],{"class":708},"# to whatever your existing statusline command emits.\n",[116,736,738,741,744,747,750],{"class":118,"line":737},4,[116,739,740],{"class":175},"mode_file",[116,742,743],{"class":194},"=",[116,745,746],{"class":126},"\"",[116,748,749],{"class":175},"$HOME",[116,751,752],{"class":126},"\u002F.claude\u002F.caveman-active\"\n",[116,754,756,759,761],{"class":118,"line":755},5,[116,757,758],{"class":175},"badge",[116,760,743],{"class":194},[116,762,763],{"class":126},"\"\"\n",[116,765,767,770,773,776,779,782,784,787],{"class":118,"line":766},6,[116,768,769],{"class":194},"if",[116,771,772],{"class":175}," [ ",[116,774,775],{"class":194},"-f",[116,777,778],{"class":126}," \"",[116,780,781],{"class":175},"$mode_file",[116,783,746],{"class":126},[116,785,786],{"class":175}," ]; ",[116,788,789],{"class":194},"then\n",[116,791,793,796,798,801,803,806,809,812,814,816,818,821,824,827,830],{"class":118,"line":792},7,[116,794,795],{"class":175},"  mode",[116,797,743],{"class":194},[116,799,800],{"class":175},"$(",[116,802,220],{"class":122},[116,804,805],{"class":126}," '[:lower:]'",[116,807,808],{"class":126}," '[:upper:]'",[116,810,811],{"class":194}," \u003C",[116,813,778],{"class":126},[116,815,781],{"class":175},[116,817,746],{"class":126},[116,819,820],{"class":194}," |",[116,822,823],{"class":122}," tr",[116,825,826],{"class":179}," -d",[116,828,829],{"class":126}," '[:space:]'",[116,831,832],{"class":175},")\n",[116,834,836,839,841,844,846,849,851,853],{"class":118,"line":835},8,[116,837,838],{"class":194},"  if",[116,840,772],{"class":175},[116,842,843],{"class":194},"-n",[116,845,778],{"class":126},[116,847,848],{"class":175},"$mode",[116,850,746],{"class":126},[116,852,786],{"class":175},[116,854,789],{"class":194},[116,856,858,861,863,866,869,872,875,877,879],{"class":118,"line":857},9,[116,859,860],{"class":175},"    badge",[116,862,743],{"class":194},[116,864,865],{"class":126},"$'\\033[38;5;208m['\"CAVEMAN${",[116,867,868],{"class":175},"mode",[116,870,871],{"class":194},":",[116,873,874],{"class":126},"+",[116,876,871],{"class":194},[116,878,848],{"class":175},[116,880,881],{"class":126},"}\"$']\\033[0m '\n",[116,883,885],{"class":118,"line":884},10,[116,886,887],{"class":194},"  fi\n",[116,889,891],{"class":118,"line":890},11,[116,892,893],{"class":194},"fi\n",[116,895,897,900,903,905,908,910,913,916,919,922],{"class":118,"line":896},12,[116,898,899],{"class":179},"printf",[116,901,902],{"class":126}," \"%s%s\"",[116,904,778],{"class":126},[116,906,907],{"class":175},"$badge",[116,909,746],{"class":126},[116,911,912],{"class":126}," \"$(",[116,914,915],{"class":122},"npx",[116,917,918],{"class":126}," ccusage statusline ",[116,920,921],{"class":194},"2>",[116,923,924],{"class":126},"\u002Fdev\u002Fnull)\"\n",[107,926,931],{"className":927,"code":928,"filename":929,"language":930,"meta":112,"style":112},"language-jsonc shiki shiki-themes github-light","\"statusLine\": {\n  \"type\": \"command\",\n  \"command\": \"bash ~\u002F.claude\u002Fstatusline.sh\"\n}\n","~\u002F.claude\u002Fsettings.json","jsonc",[36,932,933,938,943,948],{"__ignoreMap":112},[116,934,935],{"class":118,"line":119},[116,936,937],{},"\"statusLine\": {\n",[116,939,940],{"class":118,"line":139},[116,941,942],{},"  \"type\": \"command\",\n",[116,944,945],{"class":118,"line":731},[116,946,947],{},"  \"command\": \"bash ~\u002F.claude\u002Fstatusline.sh\"\n",[116,949,950],{"class":118,"line":737},[116,951,952],{},"}\n",[17,954,955,956,959,960,962,963,966,967,970],{},"Switch intensity with ",[36,957,958],{},"\u002Fcaveman ultra"," (or ",[36,961,68],{},") and the badge updates accordingly. If the ",[36,964,965],{},".caveman-active"," file isn't there after a fresh session, run ",[36,968,969],{},"\u002Fcaveman"," once manually to force-write it.",[12,972,975],{"id":973,"title":974},"caveats","Caveats",[976,977,978,997,1009,1020],"ul",{},[979,980,981,984,985,988,989,992,993,996],"li",{},[20,982,983],{},"The 30–37% savings are a floor, not a ceiling."," Our bench ran with ",[36,986,987],{},"effortLevel: high",", which generates lots of extended-thinking tokens that Caveman doesn't compress. At ",[36,990,991],{},"medium"," or default effort — where most users live — prose makes up a larger share of total output, so deltas should be ",[515,994,995],{},"larger"," than what we measured here.",[979,998,999,1002,1003,1005,1006,1008],{},[20,1000,1001],{},"Style hooks aren't a tokens-mastery substitute."," Caveman touches output only. Your ",[36,1004,99],{}," diet, file-read hygiene, and model routing (covered in ",[55,1007,104],{"href":103},") are still the bigger lever.",[979,1010,1011,1014,1015,1019],{},[20,1012,1013],{},"Plugin freshness matters."," Community projects come and go. Verify the ",[55,1016,1018],{"href":57,"rel":1017},[59],"GitHub repo"," is still maintained before adopting on a team.",[979,1021,1022,1025],{},[20,1023,1024],{},"One-data-point caveat."," This bench is one user, one model, three prompts. Your workload — especially if it skews toward generation, search, or long tool-call chains — may differ. The methodology section is here so you can re-run it on your own setup.",[1027,1028,1029],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":112,"searchDepth":139,"depth":139,"links":1031},[1032,1033],{"id":326,"depth":731,"text":327},{"id":410,"depth":731,"text":1034},"Side-by-side \u002Fcost output","A Claude Code plugin that rewrites Claude's output style into terse, \"caveman\" prose. We benchmarked it across explanation-heavy, code-heavy, and mixed prompts — here's where it actually pays off and where it quietly breaks your workflow.","8 min","md","Field review","LucideMicroscope","Caveman compresses Claude Code's output style. The README claims 65–75% token savings. Our four-prompt benchmark on Opus shows real savings on prose and mixed work, ~zero on pure code, and one workflow regression worth knowing about.","2026-04-25",{},true,{"title":1045,"path":1046},"Workshops","\u002Fworkshops","\u002Freviews\u002Fcaveman",{"title":1049,"path":1050},"Resources","\u002Fresources",{"subject":60,"subjectLink":57,"category":1052,"version":1053,"lastTested":1041,"verdictTone":1054,"verdict":1055,"tags":1056},"Claude Code plugin","caveman@caveman (Apr 2026)","mixed","Cuts output tokens 30–37% on prose and mixed prompts, but suppressed `Write`-tool calls on a \"build me a utility\" prompt — solo explanatory sessions only, not hands-on coding workflows.",[1057,1058,1059,1060],"plugin","tokens","output-style","statusline",{"title":1062,"description":1063,"keywords":1064,"proficiencyLevel":1071,"timeRequired":1072},"Caveman plugin review — real benchmarks for Claude Code's terse output mode","We tested Caveman across explanation, code, and mixed prompts on Claude Opus. Output-token deltas, a workflow regression, and an honest \"when to use it\" verdict.",[1065,1066,1067,1068,1069,1070],"claude code plugin","caveman plugin","claude code output style","token savings","julius brussee caveman","claude code plugin review","Intermediate","PT8M","reviews\u002Fcaveman",[1075,1076,1077,1078,1079,1080,1081,1082],{"id":14,"title":15,"level":139},{"id":50,"title":51,"level":139},{"id":152,"title":153,"level":139},{"id":321,"title":322,"level":139},{"id":466,"title":467,"level":139},{"id":539,"title":540,"level":139},{"id":657,"title":658,"level":139},{"id":973,"title":974,"level":139},"uZfq2dosLsq5x4-ZWOkrxvUkNAL1z5fgeSYEiyw3a4o",1777109529340]