[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-591":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":25,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":36,"readmeContent":37,"aiSummary":38,"trendingCount":16,"starSnapshotCount":16,"syncStatus":39,"lastSyncTime":40,"discoverSource":41},591,"caveman","JuliusBrussee\u002Fcaveman","JuliusBrussee","🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman","https:\u002F\u002Fgetcaveman.dev\u002F",null,"JavaScript",71436,4021,163,125,0,455,2661,13074,2240,45,"MIT License",false,"main",true,[27,28,5,29,30,31,32,33,34,35],"ai","anthropic","claude","claude-code","llm","meme","prompt-engineering","skill","tokens","2026-06-12 02:00:15","\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fem-content.zobj.net\u002Fsource\u002Fapple\u002F391\u002Frock_1faa8.png\" width=\"120\" \u002F>\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">caveman\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>why use many token when few do trick\u003C\u002Fstrong>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FJuliusBrussee\u002Fcaveman\u002Fstargazers\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002FJuliusBrussee\u002Fcaveman?style=flat&color=yellow\" alt=\"Stars\">\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FJuliusBrussee\u002Fcaveman\u002Fcommits\u002Fmain\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flast-commit\u002FJuliusBrussee\u002Fcaveman?style=flat\" alt=\"Last Commit\">\u003C\u002Fa>\n  \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002FJuliusBrussee\u002Fcaveman?style=flat\" alt=\"License\">\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"#before--after\">Before\u002FAfter\u003C\u002Fa> •\n  \u003Ca href=\"#install\">Install\u003C\u002Fa> •\n  \u003Ca href=\"#intensity-levels\">Levels\u003C\u002Fa> •\n  \u003Ca href=\"#caveman-skills\">Skills\u003C\u002Fa> •\n  \u003Ca href=\"#benchmarks\">Benchmarks\u003C\u002Fa> •\n  \u003Ca href=\"#evals\">Evals\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>🪨 Caveman Ecosystem\u003C\u002Fstrong> &nbsp;·&nbsp;\n  \u003Cstrong>caveman\u003C\u002Fstrong> \u003Cem>talk less\u003C\u002Fem> \u003Csub>(you are here)\u003C\u002Fsub> &nbsp;·&nbsp;\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FJuliusBrussee\u002Fcavemem\">cavemem\u003C\u002Fa> \u003Cem>remember more\u003C\u002Fem> &nbsp;·&nbsp;\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FJuliusBrussee\u002Fcavekit\">cavekit\u003C\u002Fa> \u003Cem>build better\u003C\u002Fem>\n\u003C\u002Fp>\n\n---\n\nA [Claude Code](https:\u002F\u002Fdocs.anthropic.com\u002Fen\u002Fdocs\u002Fclaude-code) skill\u002Fplugin and Codex plugin that makes agent talk like caveman — cutting **~75% of output tokens** while keeping full technical accuracy. Now with [文言文 mode](#文言文-wenyan-mode), [terse commits \u002F one-line reviews \u002F lifetime stats](#caveman-skills), and a [compression tool](#caveman-compress-receipts) that cuts **~46% of input tokens** every session.\n\nBased on the viral observation that caveman-speak dramatically reduces LLM token usage without losing technical substance. So we made it a one-line install.\n\n## Before \u002F After\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"50%\">\n\n### 🗣️ Normal Claude (69 tokens)\n\n> \"The reason your React component is re-rendering is likely because you're creating a new object reference on each render cycle. When you pass an inline object as a prop, React's shallow comparison sees it as a different object every time, which triggers a re-render. I'd recommend using useMemo to memoize the object.\"\n\n\u003C\u002Ftd>\n\u003Ctd width=\"50%\">\n\n### 🪨 Caveman Claude (19 tokens)\n\n> \"New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`.\"\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\n\n### 🗣️ Normal Claude\n\n> \"Sure! I'd be happy to help you with that. The issue you're experiencing is most likely caused by your authentication middleware not properly validating the token expiry. Let me take a look and suggest a fix.\"\n\n\u003C\u002Ftd>\n\u003Ctd>\n\n### 🪨 Caveman Claude\n\n> \"Bug in auth middleware. Token expiry check use `\u003C` not `\u003C=`. Fix:\"\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n**Same fix. 75% less word. Brain still big.**\n\n**Pick your level of grunt:**\n\n\u003Ctable>\n\u003Ctr>\n\u003Ctd width=\"25%\">\n\n#### 🪶 Lite\n\n> \"Your component re-renders because you create a new object reference each render. Inline object props fail shallow comparison every time. Wrap it in `useMemo`.\"\n\n\u003C\u002Ftd>\n\u003Ctd width=\"25%\">\n\n#### 🪨 Full\n\n> \"New object ref each render. Inline object prop = new ref = re-render. Wrap in `useMemo`.\"\n\n\u003C\u002Ftd>\n\u003Ctd width=\"25%\">\n\n#### 🔥 Ultra\n\n> \"Inline obj prop → new ref → re-render. `useMemo`.\"\n\n\u003C\u002Ftd>\n\u003Ctd width=\"25%\">\n\n#### 📜 文言文\n\n> \"物出新參照，致重繪。useMemo Wrap之。\"\n\n\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftable>\n\n**Same answer. You pick how many word.**\n\n```\n┌─────────────────────────────────────┐\n│  TOKENS SAVED          ████████ 75% │\n│  TECHNICAL ACCURACY    ████████ 100%│\n│  SPEED INCREASE        ████████ ~3x │\n│  VIBES                 ████████ OOG │\n└─────────────────────────────────────┘\n```\n\n- **Faster response** — less token to generate = speed go brrr\n- **Easier to read** — no wall of text, just answer\n- **Same accuracy** — all technical info kept, only fluff dropped ([science say so](https:\u002F\u002Farxiv.org\u002Fabs\u002F2604.00025))\n- **Save money** — 65% mean output reduction across [our benchmarks](#benchmarks) (range 22-87%)\n- **Fun** — every code review become comedy\n\n## Install\n\n**One line. Detect every agent. Install for each.**\n\n```bash\n# macOS \u002F Linux \u002F WSL \u002F Git Bash\ncurl -fsSL https:\u002F\u002Fraw.githubusercontent.com\u002FJuliusBrussee\u002Fcaveman\u002Fmain\u002Finstall.sh | bash\n\n# Windows (PowerShell)\nirm https:\u002F\u002Fraw.githubusercontent.com\u002FJuliusBrussee\u002Fcaveman\u002Fmain\u002Finstall.ps1 | iex\n```\n\nDetects 30+ agents (Claude Code, Gemini CLI, Codex, Cursor, Windsurf, Cline, Copilot, Continue, Kilo, Roo, Augment, Aider Desk, Amp, Bob, Crush, Devin, Droid, ForgeCode, Goose, iFlow, JetBrains Junie, Kiro CLI, Mistral Vibe, OpenHands, opencode, Qwen Code, Qoder, Rovo Dev, Tabnine, Trae, Warp, Replit Agent, Antigravity, …). Runs each one's native install. Skips what you not have. Safe to re-run.\n\nBy default the installer wires Claude Code's hooks + statusline + stats badge and registers the [`caveman-shrink`](#caveman-shrink-mcp-middleware) MCP proxy on top of the plugin install. Pass `--minimal` to skip the extras and just install the plugin\u002Fextension. Pass `--all` to also drop per-repo rule files into the current directory.\n\n| Flag | What |\n|---|---|\n| `--all` | Plugin + hooks + statusline + MCP shrink + per-repo rule files in `$PWD`. The full ride. |\n| `--minimal` | Plugin\u002Fextension only. No hooks, no MCP shrink, no per-repo rules. |\n| `--dry-run` | Preview, write nothing |\n| `--only \u003Cagent>` | One target only (repeatable) |\n| `--with-hooks` | Claude Code: also wire standalone hooks + statusline + stats badge. **On by default.** |\n| `--with-mcp-shrink` | Claude Code: register the [caveman-shrink](#caveman-shrink-mcp-middleware) MCP proxy via `npx caveman-shrink`. **On by default.** |\n| `--with-init` | Drop always-on rule files into the current repo (Cursor \u002F Windsurf \u002F Cline \u002F Copilot \u002F AGENTS.md). Off by default; turned on by `--all`. |\n| `--list` | Print full agent matrix and exit |\n| `--force` | Re-run even if already installed |\n\n`install.sh --help` for full reference.\n\n**Manual install per agent:**\n\n| Agent | Command |\n|---|---|\n| **Claude Code** | `claude plugin marketplace add JuliusBrussee\u002Fcaveman && claude plugin install caveman@caveman` |\n| **Gemini CLI** | `gemini extensions install https:\u002F\u002Fgithub.com\u002FJuliusBrussee\u002Fcaveman` |\n| **Cursor \u002F Windsurf \u002F Cline \u002F Copilot** | `npx skills add JuliusBrussee\u002Fcaveman -a \u003Ccursor\\|windsurf\\|cline\\|github-copilot>` |\n| **Codex \u002F opencode \u002F Roo \u002F Amp \u002F Goose \u002F Kiro \u002F Augment \u002F Aider Desk \u002F Continue \u002F Kilo \u002F Junie \u002F Trae \u002F Warp \u002F Tabnine \u002F Mistral \u002F Qwen \u002F Devin \u002F Droid \u002F ForgeCode \u002F Bob \u002F Crush \u002F iFlow \u002F OpenHands \u002F Qoder \u002F Rovo Dev \u002F Replit \u002F Antigravity** | `npx skills add JuliusBrussee\u002Fcaveman -a \u003Cprofile>` (see `install.sh --list` for the full slug list) |\n| **Anything else (40+ agents)** | `npx skills add JuliusBrussee\u002Fcaveman` (auto-detect) |\n\nStandalone Claude Code hooks (without plugin): `bash \u003C(curl -s https:\u002F\u002Fraw.githubusercontent.com\u002FJuliusBrussee\u002Fcaveman\u002Fmain\u002Fhooks\u002Finstall.sh)`. Windows: `irm https:\u002F\u002Fraw.githubusercontent.com\u002FJuliusBrussee\u002Fcaveman\u002Fmain\u002Fhooks\u002Finstall.ps1 | iex`. Manual fallback for stubborn Windows envs lives in [`docs\u002Finstall-windows.md`](docs\u002Finstall-windows.md).\n\nUninstall: disable the Claude plugin, `gemini extensions uninstall caveman`, or `npx skills remove caveman`.\n\n### What You Get\n\n| Feature | Claude Code | Codex | Gemini CLI | Cursor \u002F Windsurf | Cline \u002F Copilot | Others* |\n|---|:-:|:-:|:-:|:-:|:-:|:-:|\n| Caveman mode | Y | Y | Y | Y | Y | Y |\n| Auto-activate every session | Y | Y¹ | Y | with `--with-init` | with `--with-init` | with `--with-init` |\n| `\u002Fcaveman` command | Y | Y¹ | Y | — | — | — |\n| Mode switching (lite\u002Ffull\u002Fultra) | Y | Y¹ | Y | Y² | — | — |\n| Statusline badge | Y | — | — | — | — | — |\n| caveman-commit \u002F caveman-review | Y | — | Y | Y | Y | Y |\n| caveman-compress \u002F caveman-help | Y | Y³ | Y | Y | Y | Y |\n| caveman-stats | Y | — | — | — | — | — |\n| cavecrew (subagents) | Y | — | — | — | — | — |\n\n\\* opencode, Roo, Amp, Goose, Kiro CLI, Augment, Aider Desk, Continue, Kilo, Junie (JetBrains), Trae, Warp, Tabnine, Mistral, Qwen, Devin, Droid, ForgeCode, Bob, Crush, iFlow, OpenHands, Qoder, Rovo Dev, Replit, Antigravity, and more via `npx skills`. AGENTS.md \u002F IDE rule files reach Zed, generic agents, etc. via `--with-init`.\n¹ Codex uses `$caveman` instead of `\u002Fcaveman`. Auto-start ships when you run Codex inside this repo (via `.codex\u002Fhooks.json`); for other repos, copy the hook or use `$caveman` manually. ² Mode switching is on-demand via the skill, no slash command. ³ Compress only.\n\n`--with-init` writes `.cursor\u002Frules\u002Fcaveman.mdc`, `.windsurf\u002Frules\u002Fcaveman.md`, `.clinerules\u002Fcaveman.md`, `.github\u002Fcopilot-instructions.md`, and `AGENTS.md` into the current repo so caveman auto-starts there.\n\n## Usage\n\nTrigger with:\n- `\u002Fcaveman` or Codex `$caveman`\n- \"talk like caveman\"\n- \"caveman mode\"\n- \"less tokens please\"\n\nStop with: \"stop caveman\" or \"normal mode\"\n\n### Intensity Levels\n\n| Level | Trigger | What it do |\n|-------|---------|------------|\n| **Lite** | `\u002Fcaveman lite` | Drop filler, keep grammar. Professional but no fluff |\n| **Full** | `\u002Fcaveman full` | Default caveman. Drop articles, fragments, full grunt |\n| **Ultra** | `\u002Fcaveman ultra` | Maximum compression. Telegraphic. Abbreviate everything |\n\n### 文言文 (Wenyan) Mode\n\nClassical Chinese literary compression — same technical accuracy, but in the most token-efficient written language humans ever invented.\n\n| Level | Trigger | What it do |\n|-------|---------|------------|\n| **Wenyan-Lite** | `\u002Fcaveman wenyan-lite` | Semi-classical. Grammar intact, filler gone |\n| **Wenyan-Full** | `\u002Fcaveman wenyan` | Full 文言文. Maximum classical terseness |\n| **Wenyan-Ultra** | `\u002Fcaveman wenyan-ultra` | Extreme. Ancient scholar on a budget |\n\nLevel stick until you change it or session end.\n\n## Caveman Skills\n\n| Skill | What |\n|---|---|\n| `\u002Fcaveman-commit` | Terse commit messages. Conventional Commits, ≤50 char subject. Why over what. |\n| `\u002Fcaveman-review` | One-line PR comments: `L42: 🔴 bug: user null. Add guard.` No throat-clearing. |\n| `\u002Fcaveman-help` | Quick-reference card. All modes, skills, commands. |\n| `\u002Fcaveman-stats` | Real session token usage + estimated savings + USD. Lifetime aggregation via `--all`, time window via `--since 7d`, tweetable line via `--share`. Reads the Claude Code session JSONL directly, no model-side guessing. Claude Code only. |\n| `\u002Fcaveman:compress \u003Cfile>` | Rewrites a memory file (e.g. `CLAUDE.md`) into caveman-speak. Saves backup as `\u003Cfile>.original.md`. Cuts ~46% of *input* tokens every session start. Code\u002FURLs\u002Fpaths preserved byte-for-byte. |\n| `cavecrew-investigator\u002Fbuilder\u002Freviewer` | Caveman subagents for Claude Code. Subagent tool-output gets injected back into main context — these emit ~60% fewer tokens than vanilla `Explore` \u002F reviewer agents, so main context lasts longer across long sessions. Investigator (read-only locator, haiku), builder (1-2 file surgical edit, refuses 3+), reviewer (one-line findings, haiku). |\n\n**Statusline savings badge** — on by default. After your first `\u002Fcaveman-stats` run the statusline appends `[CAVEMAN] ⛏ 12.4k` (lifetime tokens saved) and updates every time `\u002Fcaveman-stats` runs. Don't want it? Set `CAVEMAN_STATUSLINE_SAVINGS=0` to silence.\n\n### caveman-compress receipts\n\n| File | Original | Compressed | Saved |\n|---|---:|---:|---:|\n| `claude-md-preferences.md` | 706 | 285 | **59.6%** |\n| `project-notes.md` | 1145 | 535 | **53.3%** |\n| `claude-md-project.md` | 1122 | 636 | **43.3%** |\n| `todo-list.md` | 627 | 388 | **38.1%** |\n| `mixed-with-code.md` | 888 | 560 | **36.9%** |\n| **Average** | **898** | **481** | **46%** |\n\nFull docs: [caveman-compress README](caveman-compress\u002FREADME.md). [Snyk false-positive note](.\u002Fcaveman-compress\u002FSECURITY.md).\n\n## caveman-shrink (MCP middleware)\n\nStdio proxy that wraps any MCP server, intercepts `tools\u002Flist` \u002F `prompts\u002Flist` \u002F `resources\u002Flist` responses, and compresses the `description` fields. Code, URLs, paths, identifiers stay byte-for-byte identical.\n\n```jsonc\n{\n  \"mcpServers\": {\n    \"fs-shrunk\": {\n      \"command\": \"npx\",\n      \"args\": [\"caveman-shrink\", \"npx\", \"@modelcontextprotocol\u002Fserver-filesystem\", \"\u002Fpath\u002Fto\u002Fdir\"]\n    }\n  }\n}\n```\n\nPublished on npm as [`caveman-shrink`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcaveman-shrink). V1 does not touch tool-call response bodies or request payloads. Auto-registered by `install.sh` (use `--minimal` to skip). Full docs: [`mcp-servers\u002Fcaveman-shrink\u002F`](mcp-servers\u002Fcaveman-shrink).\n\n## Benchmarks\n\nReal token counts from the Claude API ([reproduce it yourself](benchmarks\u002F)):\n\n\u003C!-- BENCHMARK-TABLE-START -->\n| Task | Normal (tokens) | Caveman (tokens) | Saved |\n|------|---------------:|----------------:|------:|\n| Explain React re-render bug | 1180 | 159 | 87% |\n| Fix auth middleware token expiry | 704 | 121 | 83% |\n| Set up PostgreSQL connection pool | 2347 | 380 | 84% |\n| Explain git rebase vs merge | 702 | 292 | 58% |\n| Refactor callback to async\u002Fawait | 387 | 301 | 22% |\n| Architecture: microservices vs monolith | 446 | 310 | 30% |\n| Review PR for security issues | 678 | 398 | 41% |\n| Docker multi-stage build | 1042 | 290 | 72% |\n| Debug PostgreSQL race condition | 1200 | 232 | 81% |\n| Implement React error boundary | 3454 | 456 | 87% |\n| **Average** | **1214** | **294** | **65%** |\n\n*Range: 22%–87% savings across prompts.*\n\u003C!-- BENCHMARK-TABLE-END -->\n\n> [!IMPORTANT]\n> Caveman only affects output tokens — thinking\u002Freasoning tokens are untouched. Caveman no make brain smaller. Caveman make *mouth* smaller. Biggest win is **readability and speed**, cost savings are a bonus.\n\nA March 2026 paper [\"Brevity Constraints Reverse Performance Hierarchies in Language Models\"](https:\u002F\u002Farxiv.org\u002Fabs\u002F2604.00025) found that constraining large models to brief responses **improved accuracy by 26 percentage points** on certain benchmarks and completely reversed performance hierarchies. Verbose not always better. Sometimes less word = more correct.\n\n## Evals\n\nCaveman not just claim 75%. Caveman **prove** it.\n\nThe `evals\u002F` directory has a three-arm eval harness that measures real token compression against a proper control — not just \"verbose vs skill\" but \"terse vs skill\". Because comparing caveman to verbose Claude conflate the skill with generic terseness. That cheating. Caveman not cheat.\n\n```bash\n# Run the eval (needs claude CLI)\nuv run python evals\u002Fllm_run.py\n\n# Read results (no API key, runs offline)\nuv run --with tiktoken python evals\u002Fmeasure.py\n```\n\n## Star This Repo\n\nIf caveman save you mass token, mass money — leave mass star. ⭐\n\n[![Star History Chart](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=JuliusBrussee\u002Fcaveman&type=Date)](https:\u002F\u002Fstar-history.com\u002F#JuliusBrussee\u002Fcaveman&Date)\n\n## 🪨 The Caveman Ecosystem\n\nThree tools. One philosophy: **agent do more with less**.\n\n| Repo | What | One-liner |\n|------|------|-----------|\n| [**caveman**](https:\u002F\u002Fgithub.com\u002FJuliusBrussee\u002Fcaveman) *(you are here)* | Output compression skill | *why use many token when few do trick* — ~75% fewer output tokens across Claude Code, Cursor, Gemini, Codex |\n| [**cavemem**](https:\u002F\u002Fgithub.com\u002FJuliusBrussee\u002Fcavemem) | Cross-agent persistent memory | *why agent forget when agent can remember* — compressed SQLite + MCP, local by default |\n| [**cavekit**](https:\u002F\u002Fgithub.com\u002FJuliusBrussee\u002Fcavekit) | Spec-driven autonomous build loop | *why agent guess when agent can know* — natural language → kits → parallel build → verified |\n\nThey compose: **cavekit** orchestrates the build, **caveman** compresses what the agent *says*, **cavemem** compresses what the agent *remembers*. Install one, some, or all — each stands alone.\n\n## Also by Julius Brussee\n\n- **[Revu](https:\u002F\u002Fgithub.com\u002FJuliusBrussee\u002Frevu-swift)** — local-first macOS study app with FSRS spaced repetition, decks, exams, and study guides. [revu.cards](https:\u002F\u002Frevu.cards)\n\n## License\n\nMIT — free like mass mammoth on open plain.\n","caveman 是一个旨在通过简化语言表达来减少大型语言模型（LLM）输出令牌数量的项目，特别适用于Anthropic的Claude Code。它能够将输出令牌减少约75%，同时保持技术准确性不变。该项目使用Python编写，支持多种强度级别的“原始人”模式，并引入了文言文模式、简洁提交\u002F单行评审等功能。此外，还提供了一个压缩工具，可以在每次会话中减少约46%的输入令牌。caveman非常适合需要高效利用LLM资源但又希望保持信息准确性的开发者或团队，在优化API调用成本的同时提高沟通效率。",2,"2026-06-11 02:37:52","top_all"]