JuliusBrussee/cavemanPublic

🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman

AI summary: A prompt engineering tool that cuts AI coding agent output tokens by 65% by forcing them to speak like a caveman.

Stars
96.7K
+265 today
Forks
5.6K
Watchers
236
Open issues
192
Open PRs
242
Contributors
~34
Commits
252
Branches
12

JavaScriptMITCreated Apr 4, 2026Last push 3d agoLatest release v1.9.1+1.7K stars this week+2.7K this month

Star history

since Mar 29, 2026
025K50K75KMar 2026May 2026Jun 2026Aug 2026
96.7K stars as of Aug 7, 2026, tracked back to Mar 29, 2026. Historical curve reconstructed from public GitHub event archives, calibrated to the current total.

Contribution activity

commits per day, last 52 weeks
AugSepOctNovDecJanFebMarAprMayJunJulMonWedFri2025-08-03: 0 commits2025-08-04: 0 commits2025-08-05: 0 commits2025-08-06: 0 commits2025-08-07: 0 commits2025-08-08: 0 commits2025-08-09: 0 commits2025-08-10: 0 commits2025-08-11: 0 commits2025-08-12: 0 commits2025-08-13: 0 commits2025-08-14: 0 commits2025-08-15: 0 commits2025-08-16: 0 commits2025-08-17: 0 commits2025-08-18: 0 commits2025-08-19: 0 commits2025-08-20: 0 commits2025-08-21: 0 commits2025-08-22: 0 commits2025-08-23: 0 commits2025-08-24: 0 commits2025-08-25: 0 commits2025-08-26: 0 commits2025-08-27: 0 commits2025-08-28: 0 commits2025-08-29: 0 commits2025-08-30: 0 commits2025-08-31: 0 commits2025-09-01: 0 commits2025-09-02: 0 commits2025-09-03: 0 commits2025-09-04: 0 commits2025-09-05: 0 commits2025-09-06: 0 commits2025-09-07: 0 commits2025-09-08: 0 commits2025-09-09: 0 commits2025-09-10: 0 commits2025-09-11: 0 commits2025-09-12: 0 commits2025-09-13: 0 commits2025-09-14: 0 commits2025-09-15: 0 commits2025-09-16: 0 commits2025-09-17: 0 commits2025-09-18: 0 commits2025-09-19: 0 commits2025-09-20: 0 commits2025-09-21: 0 commits2025-09-22: 0 commits2025-09-23: 0 commits2025-09-24: 0 commits2025-09-25: 0 commits2025-09-26: 0 commits2025-09-27: 0 commits2025-09-28: 0 commits2025-09-29: 0 commits2025-09-30: 0 commits2025-10-01: 0 commits2025-10-02: 0 commits2025-10-03: 0 commits2025-10-04: 0 commits2025-10-05: 0 commits2025-10-06: 0 commits2025-10-07: 0 commits2025-10-08: 0 commits2025-10-09: 0 commits2025-10-10: 0 commits2025-10-11: 0 commits2025-10-12: 0 commits2025-10-13: 0 commits2025-10-14: 0 commits2025-10-15: 0 commits2025-10-16: 0 commits2025-10-17: 0 commits2025-10-18: 0 commits2025-10-19: 0 commits2025-10-20: 0 commits2025-10-21: 0 commits2025-10-22: 0 commits2025-10-23: 0 commits2025-10-24: 0 commits2025-10-25: 0 commits2025-10-26: 0 commits2025-10-27: 0 commits2025-10-28: 0 commits2025-10-29: 0 commits2025-10-30: 0 commits2025-10-31: 0 commits2025-11-01: 0 commits2025-11-02: 0 commits2025-11-03: 0 commits2025-11-04: 0 commits2025-11-05: 0 commits2025-11-06: 0 commits2025-11-07: 0 commits2025-11-08: 0 commits2025-11-09: 0 commits2025-11-10: 0 commits2025-11-11: 0 commits2025-11-12: 0 commits2025-11-13: 0 commits2025-11-14: 0 commits2025-11-15: 0 commits2025-11-16: 0 commits2025-11-17: 0 commits2025-11-18: 0 commits2025-11-19: 0 commits2025-11-20: 0 commits2025-11-21: 0 commits2025-11-22: 0 commits2025-11-23: 0 commits2025-11-24: 0 commits2025-11-25: 0 commits2025-11-26: 0 commits2025-11-27: 0 commits2025-11-28: 0 commits2025-11-29: 0 commits2025-11-30: 0 commits2025-12-01: 0 commits2025-12-02: 0 commits2025-12-03: 0 commits2025-12-04: 0 commits2025-12-05: 0 commits2025-12-06: 0 commits2025-12-07: 0 commits2025-12-08: 0 commits2025-12-09: 0 commits2025-12-10: 0 commits2025-12-11: 0 commits2025-12-12: 0 commits2025-12-13: 0 commits2025-12-14: 0 commits2025-12-15: 0 commits2025-12-16: 0 commits2025-12-17: 0 commits2025-12-18: 0 commits2025-12-19: 0 commits2025-12-20: 0 commits2025-12-21: 0 commits2025-12-22: 0 commits2025-12-23: 0 commits2025-12-24: 0 commits2025-12-25: 0 commits2025-12-26: 0 commits2025-12-27: 0 commits2025-12-28: 0 commits2025-12-29: 0 commits2025-12-30: 0 commits2025-12-31: 0 commits2026-01-01: 0 commits2026-01-02: 0 commits2026-01-03: 0 commits2026-01-04: 0 commits2026-01-05: 0 commits2026-01-06: 0 commits2026-01-07: 0 commits2026-01-08: 0 commits2026-01-09: 0 commits2026-01-10: 0 commits2026-01-11: 0 commits2026-01-12: 0 commits2026-01-13: 0 commits2026-01-14: 0 commits2026-01-15: 0 commits2026-01-16: 0 commits2026-01-17: 0 commits2026-01-18: 0 commits2026-01-19: 0 commits2026-01-20: 0 commits2026-01-21: 0 commits2026-01-22: 0 commits2026-01-23: 0 commits2026-01-24: 0 commits2026-01-25: 0 commits2026-01-26: 0 commits2026-01-27: 0 commits2026-01-28: 0 commits2026-01-29: 0 commits2026-01-30: 0 commits2026-01-31: 0 commits2026-02-01: 0 commits2026-02-02: 0 commits2026-02-03: 0 commits2026-02-04: 0 commits2026-02-05: 0 commits2026-02-06: 0 commits2026-02-07: 0 commits2026-02-08: 0 commits2026-02-09: 0 commits2026-02-10: 0 commits2026-02-11: 0 commits2026-02-12: 0 commits2026-02-13: 0 commits2026-02-14: 0 commits2026-02-15: 0 commits2026-02-16: 0 commits2026-02-17: 0 commits2026-02-18: 0 commits2026-02-19: 0 commits2026-02-20: 0 commits2026-02-21: 0 commits2026-02-22: 0 commits2026-02-23: 0 commits2026-02-24: 0 commits2026-02-25: 0 commits2026-02-26: 0 commits2026-02-27: 0 commits2026-02-28: 0 commits2026-03-01: 0 commits2026-03-02: 0 commits2026-03-03: 0 commits2026-03-04: 0 commits2026-03-05: 0 commits2026-03-06: 0 commits2026-03-07: 0 commits2026-03-08: 0 commits2026-03-09: 0 commits2026-03-10: 0 commits2026-03-11: 0 commits2026-03-12: 0 commits2026-03-13: 0 commits2026-03-14: 0 commits2026-03-15: 0 commits2026-03-16: 0 commits2026-03-17: 0 commits2026-03-18: 0 commits2026-03-19: 0 commits2026-03-20: 0 commits2026-03-21: 0 commits2026-03-22: 0 commits2026-03-23: 0 commits2026-03-24: 0 commits2026-03-25: 0 commits2026-03-26: 0 commits2026-03-27: 0 commits2026-03-28: 0 commits2026-03-29: 0 commits2026-03-30: 0 commits2026-03-31: 0 commits2026-04-01: 0 commits2026-04-02: 0 commits2026-04-03: 0 commits2026-04-04: 6 commits2026-04-05: 10 commits2026-04-06: 9 commits2026-04-07: 9 commits2026-04-08: 16 commits2026-04-09: 18 commits2026-04-10: 3 commits2026-04-11: 16 commits2026-04-12: 7 commits2026-04-13: 1 commit2026-04-14: 6 commits2026-04-15: 5 commits2026-04-16: 0 commits2026-04-17: 0 commits2026-04-18: 1 commit2026-04-19: 0 commits2026-04-20: 0 commits2026-04-21: 0 commits2026-04-22: 0 commits2026-04-23: 0 commits2026-04-24: 0 commits2026-04-25: 0 commits2026-04-26: 0 commits2026-04-27: 0 commits2026-04-28: 0 commits2026-04-29: 0 commits2026-04-30: 1 commit2026-05-01: 12 commits2026-05-02: 0 commits2026-05-03: 0 commits2026-05-04: 0 commits2026-05-05: 0 commits2026-05-06: 0 commits2026-05-07: 0 commits2026-05-08: 0 commits2026-05-09: 0 commits2026-05-10: 17 commits2026-05-11: 0 commits2026-05-12: 3 commits2026-05-13: 0 commits2026-05-14: 0 commits2026-05-15: 0 commits2026-05-16: 0 commits2026-05-17: 0 commits2026-05-18: 1 commit2026-05-19: 0 commits2026-05-20: 2 commits2026-05-21: 0 commits2026-05-22: 0 commits2026-05-23: 0 commits2026-05-24: 0 commits2026-05-25: 0 commits2026-05-26: 0 commits2026-05-27: 0 commits2026-05-28: 0 commits2026-05-29: 0 commits2026-05-30: 0 commits2026-05-31: 0 commits2026-06-01: 9 commits2026-06-02: 0 commits2026-06-03: 0 commits2026-06-04: 0 commits2026-06-05: 0 commits2026-06-06: 0 commits2026-06-07: 1 commit2026-06-08: 0 commits2026-06-09: 0 commits2026-06-10: 1 commit2026-06-11: 0 commits2026-06-12: 7 commits2026-06-13: 0 commits2026-06-14: 5 commits2026-06-15: 0 commits2026-06-16: 0 commits2026-06-17: 0 commits2026-06-18: 0 commits2026-06-19: 0 commits2026-06-20: 0 commits2026-06-21: 0 commits2026-06-22: 0 commits2026-06-23: 0 commits2026-06-24: 0 commits2026-06-25: 0 commits2026-06-26: 0 commits2026-06-27: 0 commits2026-06-28: 0 commits2026-06-29: 0 commits2026-06-30: 1 commit2026-07-01: 8 commits2026-07-02: 14 commits2026-07-03: 4 commits2026-07-04: 0 commits2026-07-05: 0 commits2026-07-06: 0 commits2026-07-07: 0 commits2026-07-08: 0 commits2026-07-09: 0 commits2026-07-10: 0 commits2026-07-11: 0 commits2026-07-12: 0 commits2026-07-13: 0 commits2026-07-14: 0 commits2026-07-15: 0 commits2026-07-16: 0 commits2026-07-17: 0 commits2026-07-18: 0 commits2026-07-19: 0 commits2026-07-20: 0 commits2026-07-21: 0 commits2026-07-22: 0 commits2026-07-23: 0 commits2026-07-24: 0 commits2026-07-25: 0 commits2026-07-26: 0 commits2026-07-27: 0 commits2026-07-28: 0 commits2026-07-29: 0 commits2026-07-30: 0 commits2026-07-31: 0 commits2026-08-01: 0 commits
193 commits in the last yearLessMore

Signals and awards

derived from tracked data
  • Landmark project

    96,650 stars

  • Well documented

    High community health score

  • Permissive license

    MIT

  • Continuous integration

    Automated checks passing

  • Repeat trending

    39 trending appearances

  • Top 10% tracked

    Rank 67 of 1058

What caveman does

Caveman addresses the problem of overly verbose, token-heavy responses from AI coding assistants. By injecting a highly specific persona prompt, it forces models like Claude Code to strip out all pleasantries, detailed explanations, and conversational filler. The AI is restricted to outputting only the necessary code and bare-minimum context, drastically reducing token usage and speeding up generation time. It maintains the core reasoning capabilities (the 'big brain') while significantly constraining the output length (the 'small mouth'), saving developers money on API costs.

Developers using API-backed AI coding agents (like Claude Code or custom harnesses) who want to optimize for speed and API cost. Requires basic configuration of your chosen AI agent's system prompt.

  • Massive token reduction: Cuts output token usage by approximately 65%.
  • Broad compatibility: Works with over 30 different AI coding agents and harnesses.
  • Speed improvements: Faster response times due to generating significantly fewer output tokens.
  • Zero boilerplate: Eliminates AI apologies, introductions, and unprompted explanations.
  • Maintains code quality: The AI's reasoning and code output remain accurate despite the terse persona.

Where teams use it

Cost Reduction

Heavy users of API-based coding agents who want to lower their daily token expenditure.

Faster Iteration

Developers who want their AI agents to output code instantly without waiting for a paragraph of explanation.

Automated Pipelines

Running AI agents in CI/CD where conversational output is useless and only the code diff matters.

Vibe Coding

Users who simply prefer a terse, direct interaction style with their AI tools.

Getting started: Copy the prompt from caveman.txt into your agent's custom instructions or rules file.

README

main branch

Caveman

why use many token when few do trick

Make your AI coding agent talk like a caveman.
Same answers, 65% fewer output tokens. Brain still big. Mouth small.

Stars 30+ agents Last commit License

See it · Install · Levels · What you get · Benchmarks · Ecosystem · Caveman 2


Caveman is a skill/plugin for Claude Code, Codex, Gemini, Cursor, Windsurf, Cline, Copilot, and 30+ other agents. Install once. Agent drops the filler and answers in tight caveman-speak, keeping code, commands, and errors byte-for-byte exact. You save output tokens on every reply, forever.

Before / After

🗣️ Normal agent — 69 tokens Caveman agent — 19 tokens

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.

New object ref each render. Inline object prop = new ref = re-render. Wrap in useMemo.

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.

Bug in auth middleware. Token expiry check use < not <=. Fix:

Same fix. Third of the words. Nothing technical lost.

┌────────────────────────────────────────────┐
│   output tokens saved   █████████       65% │
│   input tokens saved    ░░░░░░░░░         0% │
│   technical accuracy    █████████      100% │
│   vibes                 █████████       OOG │
└────────────────────────────────────────────┘

Caveman no make brain smaller. Caveman make mouth smaller. Shrinks what the agent says, not what it knows.

Install

One command. Finds every agent on your machine. Installs for each.

# macOS · Linux · WSL · Git Bash
curl -fsSL https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh | bash
# Windows · PowerShell 5.1+
irm https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.ps1 | iex

~30 seconds. Needs Node ≥18. Skips agents you no have. Safe to re-run.

Tip

Turn it on: type /caveman or say "talk like caveman". Turn it off: say "normal mode". On Claude Code, Codex, and Gemini it's already on from message one. No command needed.

Install for one agent, or any of 30+ others

Every agent has its own path (plugin, extension, rule file, or npx skills add). The full per-agent matrix, all flags, dry-run, and uninstall live in INSTALL.md. A few common ones:

# Claude Code plugin
claude plugin marketplace add JuliusBrussee/caveman && claude plugin install caveman@caveman

# Gemini CLI extension
gemini extensions install https://github.com/JuliusBrussee/caveman

# Cursor / Windsurf / Cline / Codex / 30+ more, via the skills registry
npx skills add JuliusBrussee/caveman -a cursor

Install broke? Open your agent in this repo and say: "Read CLAUDE.md and INSTALL.md, install caveman for me." Agent read repo, agent fix own brain. Snake eat tail.

Pick your grunt

Six levels. Switch anytime with /caveman <level>. Level sticks until you change it or the session ends.

Level Same sentence, shrunk
normal agent You should wrap the object in useMemo, since a new reference is created on every render.
lite Wrap object in useMemo. New ref created every render.
full (default) New ref each render. Wrap object in useMemo.
ultra New ref/render. useMemo it.
wenyan New ref every render, so wrap in useMemo — rendered in classical Chinese, shorter still.

Note

Speak your tongue. Caveman keeps your language. Write Portuguese, caveman grunt Portuguese. Spanish, French, same. It compresses the style, never translates. wenyan mode is the exception on purpose: classical Chinese packs the most meaning per token.

What you get

Command What it does
/caveman [lite|full|ultra|wenyan] Compress every reply. Level sticks for the session.
/caveman-commit Conventional Commit messages, ≤50-char subject. Why over what.
/caveman-review One-line PR comments: L42: 🔴 bug: user null. Add guard.
/caveman-stats Real session token usage, lifetime savings, USD. Tweetable line with --share.
/caveman-compress <file> Rewrite a memory file (like CLAUDE.md) into caveman-speak. Cuts ~46% input tokens every session after. Code, URLs, paths byte-preserved.
caveman-shrink MCP middleware. Wraps any MCP server, compresses its tool descriptions. npm.
cavecrew-* Caveman subagents (investigator, builder, reviewer). ~60% fewer tokens than vanilla, so main context lasts longer.

Tip

On Claude Code the statusline shows [CAVEMAN] ⛏ 12.4k — that's your lifetime tokens saved, updated on every /caveman-stats. Silence it with CAVEMAN_STATUSLINE_SAVINGS=0.

Benchmarks

Real token counts from the Claude API. Average 65% output reduction across 10 prompts (range 22–87%), measured against default verbose replies. Output tokens only, committed and reproducible in benchmarks/ and evals/.

Task Normal Caveman Saved
Explain React re-render bug 1180 159 87%
Fix auth middleware token expiry 704 121 83%
Set up PostgreSQL connection pool 2347 380 84%
Explain git rebase vs merge 702 292 58%
Refactor callback to async/await 387 301 22%
Architecture: microservices vs monolith 446 310 30%
Review PR for security issues 678 398 41%
Docker multi-stage build 1042 290 72%
Debug PostgreSQL race condition 1200 232 81%
Implement React error boundary 3454 456 87%
Average 1214 294 65%

Important

Honest number warning. Caveman only shrinks output tokens. Input and reasoning tokens are untouched, and the skill itself adds ~1–1.5k input tokens per turn. So whole-session savings run smaller than the output number, and on already-terse workloads they can go net-negative. The real win is readability and speed. Cost savings are the bonus. When caveman wins, when it loses, and how to measure it yourself: docs/HONEST-NUMBERS.md.

Turns out short isn't just cheaper. A March 2026 paper, Brevity Constraints Reverse Performance Hierarchies in Language Models, tested 31 models and found that constraining large models to brief answers improved accuracy by ~26 points on some benchmarks. Sometimes less word = more correct.

caveman-compress receipts — real memory files, cutting input tokens forever
File Original Compressed Saved
claude-md-preferences.md 706 285 59.6%
project-notes.md 1145 535 53.3%
claude-md-project.md 1122 636 43.3%
todo-list.md 627 388 38.1%
mixed-with-code.md 888 560 36.9%
Average 898 481 46%

Every session after, that file loads ~46% smaller. Input tokens saved forever, not just one reply.

The whole cave

Want the whole agent, not just its mouth? → caveman-code

This skill shrinks what an agent says. caveman-code shrinks everything — a full terminal coding agent, caveman top to bottom. ~2× fewer tokens than Codex on identical tasks. 20+ providers, plan mode, autopilot goal loop, MIT.

npm install -g @juliusbrussee/caveman-code

▶ Try caveman-code →

Five tools, one idea: agent do more with less.

Repo What it shrinks
caveman (you here) What the agent says
caveman-code The whole agent, end to end
cavemem What the agent remembers, across sessions
cavekit The build loop — spec-driven, no guessing
cavegemma The compression baked into weights (Gemma fine-tune)
Also: five sibling skills, one install

JuliusBrussee/skills — works in Claude Code, Cursor, Gemini, Cline, Copilot, 40+ agents:

Skill What
caveman This one. Speak less, say more.
grill-me Agent grills your plan before you build the wrong thing.
interface-kit Build UI that looks good, loads fast, works for everyone.
junior-to-senior Adversarial review pass. Junior output in, senior output out.
loop-factory Spec-driven task loop — inbox → active → archive.
npx skills@latest add JuliusBrussee/skills
🦞 Teach the lobster brevity — OpenClaw integration

OpenClaw is a self-host gateway: one box, many agents inside, wired to Slack / Discord / iMessage / Telegram. Lobster strong. Lobster smart. Lobster also talk a lot.

Same installer, scoped to one agent:

curl -fsSL https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh | bash -s -- --only openclaw

Two things happen, no more: a caveman skill lands in the workspace, and a tiny marker-fenced block is appended to SOUL.md (OpenClaw injects it every turn, so the lobster is terse from message one — no /caveman per session). Custom path? OPENCLAW_WORKSPACE=/your/path. Uninstall with the same line plus --uninstall; your other workspace content stays untouched. Lobster claw still sharp. Lobster mouth now small.

Caveman 2

Caveman make token small. Caveman 2 make it provable.

Today's savings numbers (including /caveman-stats) are local estimates. Caveman 2 measures and verifies them across a whole team — real receipts, real dashboard, real proof the tokens went down. Building it now.

Join the waitlist → caveman.so

How it works

  1. Install drops a skill file into your agent.
  2. Skill tells agent: drop filler, keep substance, use fragments — but never touch code, commands, or errors.
  3. On Claude Code, a hook writes a tiny flag file each session, so the agent talks caveman from message one without /caveman.
  4. /caveman-stats reads your session log, counts tokens saved, writes the number to your statusline.
  5. /caveman-compress rewrites memory files (like CLAUDE.md) so every future session starts with a smaller context. Save tokens forever, not just once.

Hook architecture, file ownership, and CI sync are documented for maintainers in CLAUDE.md.

Privacy

Caveman no phone home. No telemetry, no analytics, no accounts, no backend. After install, zero network calls — the skill is a prompt, the hooks are local scripts, and /caveman-stats reads a log already on your disk. Install-time fetches (GitHub plus your agents' own registries) are spelled out in SECURITY.md.

Sponsors

Caveman free forever. Sponsors keep the rock sharp.

Atlas Cloud

Atlas Cloud — full-modal AI inference platform, one API.

Want your rock here? → Sponsor caveman

Star this repo

Caveman save you token, save you money. Star cost zero. Fair trade. ⭐

Star History Chart


Docs: Install matrix · Honest numbers · Contributing · Maintainer guide · Issues
Also by Julius Brussee: Revu — local-first macOS study app with FSRS spaced repetition (revu.cards)

MIT — free like mass mammoth on open plain.
View on GitHub

Recent activity

commits and pull requests

Releases and announcements

16 total
  1. v1.9.1 — 65%, honestlyv1.9.1Jul 3, 2026

    A maintenance + honesty release. 50 changes since `v1.9.0`, mostly hook, installer, and integration hardening, plus a full pass on how caveman states its savings number. Installs stay pinned + integrity-checked; this tag now ships `cavecrew-model-overrides.js` in the hook manifest so the `curl|bash` fallback path installs cleanly. ## Honest numbers, one number - **Headline savings is now a flat `65%`** everywhere (#234). We retired the `~50-65%` range and the `~75%` claim that still lived on the docs site. `65%` is the measured **average output-token reduction vs default verbose replies** across the committed 10-prompt benchmark (range 22–87%) — output tokens only. README, all plugin/extension manifests, the skill descriptions, the per-repo rule frontmatter, and the GitHub Pages site now agree. - **`/caveman-stats` stops mislabeling savings** (#601, and the budget-% fix). Session token stats are now attributed to the mode that was active *when each message happened*, so a mid-session `/caveman ultra` no longer rewrites the whole session's math. The output-reduction line is labeled as output reduction — not as a share of your usage/quota. - **New limit-headroom meter** in `/cavema

  2. ## Security - **Installs now pinned + integrity-checked** (#261, #262) `curl|bash` and detached installs no longer fetch hook files from the moving `main` branch — they download from the immutable `v1.9.0` tag and verify every hook against `src/hooks/checksums.sha256` (SHA-256) before anything executes. Mismatch aborts the install. This is the first tag shipping the manifest, so enforcement is fully active as of this release. - **`fix(docs)`: escape user input in the demo terminal** (#438) The docs site demo interpolated user input via `innerHTML` — a real reflected DOM XSS. Nodes are built with `textContent` now. ## opencode actually works now Smoke-tested against a real opencode runtime for the first time — and the plugin turned out to never load: opencode runs plugins inside a compiled Bun binary where both `require()` of on-disk files and `await import()` of CJS silently fail. Fixed by evaluating the shared config as CommonJS by hand. Also fixed in the same pass, all verified end-to-end against opencode 1.4.0: - Real lifecycle hooks: `event` dispatcher for session init, `chat.message` for mode parsing, `experimental.chat.system.transform` for per-turn rei

  3. ## Fixes - **`fix(install)`: curl|bash one-liner now actually installs skills** (#370) Upstream `skills` CLI rendered its interactive skill-picker TUI under `curl|bash` (stdin not a TTY), got no selection, exited 0, and installed nothing — while our installer cheerfully reported `done`. Now passes `--yes --all` to both the per-provider call and the auto-detect fallback so every detected agent gets all 7 caveman skills, no prompt required. - **`fix(gemini)`: strip stray YAML fences from `commands/caveman-init.toml`** (#372, dup #326) Gemini CLI's `FileCommandLoader` rejected the file with `Failed to parse TOML` on extension install. Fences gone — extension loads cleanly. - **`fix(codex)`: rename `codex_hooks` → `hooks` in `.codex/config.toml`** (#350) Codex source confirms `hooks` is the canonical key; `codex_hooks` is a legacy alias that emits a deprecation log on every session. ## Upgrade ``` curl -fsSL https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh | bash ``` Existing installs: re-run the same one-liner — idempotent, picks up the new flags. 🤖 Generated with [Claude Code](https://claude.com/claude-code)

  4. ## Hotfix for v1.8.0 — curl|bash one-liner The headline install command in v1.8.0 was broken at first contact: ``` $ curl -fsSL https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh | bash -s -- --only openclaw bash: line 39: BASH_SOURCE[0]: unbound variable error: unknown flag: -- ``` Two regressions — neither caught by CI because both are stdin-pipe-only. ### What broke 1. **`set -u` + `${BASH_SOURCE[0]}` is fatal under curl|bash.** When bash reads from stdin, `BASH_SOURCE` is unset; the strict-mode shell trapped on the first reference. 2. **`--` separator survived `npx`.** `install.sh` and `install.ps1` passed `npx -y "github:..." -- "$@"` and modern npx forwards the literal `--` to the package, which `parseArgs` rejected as `unknown flag: --`. ### What this release fixes - `install.sh` defaults `BASH_SOURCE[0]` to empty so the curl-pipe path falls through cleanly under `set -u`. - `install.sh` + `install.ps1` no longer pass `--` between npx and the package — npm 7+ npx forwards trailing args correctly without it. - `bin/install.js` `parseArgs` now accepts a bare `--` as a no-op (POSIX end-of-options marker). Future shim drift can't re-break this. - New

  5. > ⚠️ **v1.8.0's curl|bash one-liner was broken** (BASH_SOURCE unbound + stray `--` to parseArgs). Use [v1.8.1](https://github.com/JuliusBrussee/caveman/releases/tag/v1.8.1) instead — same release contents plus the hotfix. ## Brain still big. Two more mouths now small. This release teaches caveman to two new agents: **OpenClaw** (the lobster) and **opencode** (the TUI). Both now grunt fluent caveman from message one — no `/caveman` per session, no setup nag. Plus a stack of installer fixes from a top-to-bottom review of `bin/install.js`. ## What's new ### 🦞 OpenClaw — first-class always-on target `npx -y github:JuliusBrussee/caveman -- --only openclaw` and the lobster talks like a caveman every turn. Two tiny writes do the work: - **Skill drop** at `~/.openclaw/workspace/skills/caveman/SKILL.md` — spec-correct frontmatter (`version`, `always: true`), discoverable by `openclaw skills list`. - **SOUL.md nudge** — marker-fenced bootstrap block at `~/.openclaw/workspace/SOUL.md`, auto-injected each turn under "Project Context". Stays well under OpenClaw's 12K-per-file cap. Idempotent on both writes. Uninstall strips the skill folder + the marker block, leaves your other workspa

Code frequency

additions and deletions
+12.8K-12.8KWeek of 2026-03-29: +351 linesWeek of 2026-03-29: -25 linesWeek of 2026-04-05: +12,833 linesWeek of 2026-04-05: -5,904 linesWeek of 2026-04-12: +1,382 linesWeek of 2026-04-12: -198 linesWeek of 2026-04-19: +0 linesWeek of 2026-04-19: -0 linesWeek of 2026-04-26: +5,018 linesWeek of 2026-04-26: -810 linesWeek of 2026-05-03: +0 linesWeek of 2026-05-03: -0 linesWeek of 2026-05-10: +8,828 linesWeek of 2026-05-10: -7,464 linesWeek of 2026-05-17: +45 linesWeek of 2026-05-17: -20 linesWeek of 2026-05-24: +0 linesWeek of 2026-05-24: -0 linesWeek of 2026-05-31: +1,395 linesWeek of 2026-05-31: -165 linesWeek of 2026-06-07: +246 linesWeek of 2026-06-07: -378 linesWeek of 2026-06-14: +619 linesWeek of 2026-06-14: -18 linesWeek of 2026-06-21: +0 linesWeek of 2026-06-21: -0 linesWeek of 2026-06-28: +2,099 linesWeek of 2026-06-28: -443 linesWeek of 2026-07-05: +0 linesWeek of 2026-07-05: -0 linesWeek of 2026-07-12: +0 linesWeek of 2026-07-12: -0 linesWeek of 2026-07-19: +0 linesWeek of 2026-07-19: -0 linesWeek of 2026-07-26: +0 linesWeek of 2026-07-26: -0 linesMar 29, 2026Jul 26, 2026
+32.8K lines added, -15.4K removed over the last year.

Commits per week

last 52 weeks
810Week of 2025-08-03: 0 commitsWeek of 2025-08-10: 0 commitsWeek of 2025-08-17: 0 commitsWeek of 2025-08-24: 0 commitsWeek of 2025-08-31: 0 commitsWeek of 2025-09-07: 0 commitsWeek of 2025-09-14: 0 commitsWeek of 2025-09-21: 0 commitsWeek of 2025-09-28: 0 commitsWeek of 2025-10-05: 0 commitsWeek of 2025-10-12: 0 commitsWeek of 2025-10-19: 0 commitsWeek of 2025-10-26: 0 commitsWeek of 2025-11-02: 0 commitsWeek of 2025-11-09: 0 commitsWeek of 2025-11-16: 0 commitsWeek of 2025-11-23: 0 commitsWeek of 2025-11-30: 0 commitsWeek of 2025-12-07: 0 commitsWeek of 2025-12-14: 0 commitsWeek of 2025-12-21: 0 commitsWeek of 2025-12-28: 0 commitsWeek of 2026-01-04: 0 commitsWeek of 2026-01-11: 0 commitsWeek of 2026-01-18: 0 commitsWeek of 2026-01-25: 0 commitsWeek of 2026-02-01: 0 commitsWeek of 2026-02-08: 0 commitsWeek of 2026-02-15: 0 commitsWeek of 2026-02-22: 0 commitsWeek of 2026-03-01: 0 commitsWeek of 2026-03-08: 0 commitsWeek of 2026-03-15: 0 commitsWeek of 2026-03-22: 0 commitsWeek of 2026-03-29: 6 commitsWeek of 2026-04-05: 81 commitsWeek of 2026-04-12: 20 commitsWeek of 2026-04-19: 0 commitsWeek of 2026-04-26: 13 commitsWeek of 2026-05-03: 0 commitsWeek of 2026-05-10: 20 commitsWeek of 2026-05-17: 3 commitsWeek of 2026-05-24: 0 commitsWeek of 2026-05-31: 9 commitsWeek of 2026-06-07: 9 commitsWeek of 2026-06-14: 5 commitsWeek of 2026-06-21: 0 commitsWeek of 2026-06-28: 27 commitsWeek of 2026-07-05: 0 commitsWeek of 2026-07-12: 0 commitsWeek of 2026-07-19: 0 commitsWeek of 2026-07-26: 0 commitsAug 3, 2025Jul 26, 2026
193 commits in the last 52 weeks.

When work happens

weekday and hour
SunMonTueWedThuFriSat036912151821Sun 0:00 — 2 commitsSun 1:00 — 0 commitsSun 2:00 — 0 commitsSun 3:00 — 0 commitsSun 4:00 — 0 commitsSun 5:00 — 0 commitsSun 6:00 — 0 commitsSun 7:00 — 0 commitsSun 8:00 — 1 commitsSun 9:00 — 0 commitsSun 10:00 — 4 commitsSun 11:00 — 1 commitsSun 12:00 — 1 commitsSun 13:00 — 16 commitsSun 14:00 — 2 commitsSun 15:00 — 3 commitsSun 16:00 — 2 commitsSun 17:00 — 1 commitsSun 18:00 — 1 commitsSun 19:00 — 2 commitsSun 20:00 — 0 commitsSun 21:00 — 1 commitsSun 22:00 — 3 commitsSun 23:00 — 0 commitsMon 0:00 — 1 commitsMon 1:00 — 1 commitsMon 2:00 — 6 commitsMon 3:00 — 0 commitsMon 4:00 — 0 commitsMon 5:00 — 0 commitsMon 6:00 — 0 commitsMon 7:00 — 0 commitsMon 8:00 — 0 commitsMon 9:00 — 0 commitsMon 10:00 — 0 commitsMon 11:00 — 0 commitsMon 12:00 — 0 commitsMon 13:00 — 0 commitsMon 14:00 — 0 commitsMon 15:00 — 0 commitsMon 16:00 — 0 commitsMon 17:00 — 0 commitsMon 18:00 — 0 commitsMon 19:00 — 1 commitsMon 20:00 — 1 commitsMon 21:00 — 10 commitsMon 22:00 — 0 commitsMon 23:00 — 0 commitsTue 0:00 — 0 commitsTue 1:00 — 1 commitsTue 2:00 — 1 commitsTue 3:00 — 0 commitsTue 4:00 — 0 commitsTue 5:00 — 0 commitsTue 6:00 — 0 commitsTue 7:00 — 0 commitsTue 8:00 — 0 commitsTue 9:00 — 2 commitsTue 10:00 — 0 commitsTue 11:00 — 0 commitsTue 12:00 — 2 commitsTue 13:00 — 3 commitsTue 14:00 — 2 commitsTue 15:00 — 1 commitsTue 16:00 — 0 commitsTue 17:00 — 1 commitsTue 18:00 — 0 commitsTue 19:00 — 0 commitsTue 20:00 — 1 commitsTue 21:00 — 4 commitsTue 22:00 — 0 commitsTue 23:00 — 1 commitsWed 0:00 — 0 commitsWed 1:00 — 0 commitsWed 2:00 — 0 commitsWed 3:00 — 0 commitsWed 4:00 — 0 commitsWed 5:00 — 1 commitsWed 6:00 — 0 commitsWed 7:00 — 0 commitsWed 8:00 — 0 commitsWed 9:00 — 0 commitsWed 10:00 — 2 commitsWed 11:00 — 0 commitsWed 12:00 — 3 commitsWed 13:00 — 0 commitsWed 14:00 — 7 commitsWed 15:00 — 0 commitsWed 16:00 — 3 commitsWed 17:00 — 0 commitsWed 18:00 — 7 commitsWed 19:00 — 0 commitsWed 20:00 — 0 commitsWed 21:00 — 0 commitsWed 22:00 — 1 commitsWed 23:00 — 8 commitsThu 0:00 — 1 commitsThu 1:00 — 8 commitsThu 2:00 — 0 commitsThu 3:00 — 0 commitsThu 4:00 — 0 commitsThu 5:00 — 0 commitsThu 6:00 — 0 commitsThu 7:00 — 1 commitsThu 8:00 — 0 commitsThu 9:00 — 0 commitsThu 10:00 — 0 commitsThu 11:00 — 0 commitsThu 12:00 — 0 commitsThu 13:00 — 0 commitsThu 14:00 — 2 commitsThu 15:00 — 10 commitsThu 16:00 — 2 commitsThu 17:00 — 3 commitsThu 18:00 — 0 commitsThu 19:00 — 1 commitsThu 20:00 — 1 commitsThu 21:00 — 6 commitsThu 22:00 — 0 commitsThu 23:00 — 1 commitsFri 0:00 — 2 commitsFri 1:00 — 8 commitsFri 2:00 — 3 commitsFri 3:00 — 0 commitsFri 4:00 — 0 commitsFri 5:00 — 0 commitsFri 6:00 — 0 commitsFri 7:00 — 0 commitsFri 8:00 — 0 commitsFri 9:00 — 0 commitsFri 10:00 — 0 commitsFri 11:00 — 1 commitsFri 12:00 — 2 commitsFri 13:00 — 1 commitsFri 14:00 — 5 commitsFri 15:00 — 1 commitsFri 16:00 — 0 commitsFri 17:00 — 0 commitsFri 18:00 — 0 commitsFri 19:00 — 0 commitsFri 20:00 — 3 commitsFri 21:00 — 0 commitsFri 22:00 — 0 commitsFri 23:00 — 0 commitsSat 0:00 — 0 commitsSat 1:00 — 0 commitsSat 2:00 — 0 commitsSat 3:00 — 0 commitsSat 4:00 — 0 commitsSat 5:00 — 0 commitsSat 6:00 — 0 commitsSat 7:00 — 0 commitsSat 8:00 — 0 commitsSat 9:00 — 0 commitsSat 10:00 — 1 commitsSat 11:00 — 5 commitsSat 12:00 — 9 commitsSat 13:00 — 0 commitsSat 14:00 — 0 commitsSat 15:00 — 1 commitsSat 16:00 — 0 commitsSat 17:00 — 2 commitsSat 18:00 — 4 commitsSat 19:00 — 2 commitsSat 20:00 — 0 commitsSat 21:00 — 0 commitsSat 22:00 — 0 commitsSat 23:00 — 0 commits
Commit volume by weekday and hour (UTC). Larger dots mean more commits.

Who is committing

last 52 weeks
Maintainer commits172 (68%)
Community commits80 (32%)

252 commits in total over the last year.

DateListRankStars gained
Jul 15, 2026daily#14+7
Jul 14, 2026daily#16+5
Jul 13, 2026daily#8+4
Jul 12, 2026daily#12+3
Jul 5, 2026daily#7+31
Jul 4, 2026daily#1+42
Jul 3, 2026daily#2+32
Jul 2, 2026daily#4+43
May 11, 2026daily#24+92
May 7, 2026daily#17+57
May 6, 2026daily#25+57
May 5, 2026daily#25+53
May 1, 2026daily#15+69
Apr 30, 2026daily#15+53
Apr 29, 2026daily#12+90
  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    385.5K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • openclaw/openclaw

    Your own personal AI assistant. Any OS. Any Platform. The lobster way. 🦞

    384.4K stars · TypeScript

  • obra/superpowers

    An agentic skills framework & software development methodology that works.

    268.6K stars · Shell

  • react/react

    The library for web and native user interfaces.

    247.1K stars · JavaScript