Caveman
Agent toolingBrowser extension

Browser extension

"Caveman Mode" is an MV3 extension for ChatGPT, Claude, and Gemini. When enabled, it prepends a visible caveman directive to the message you send, then submits through the page UI. It edits only your outgoing message.

The extension is MIT-licensed and has no build step. No bundler, no WASM, no analytics, no network code.

What it does

When the toggle is on, the content script intercepts your send gesture in the capture phase, prepends the directive through the editor's own input path, then re-fires send. The directive is visible in the chat.

The directive is staged in two forms:

  • First message of a conversation gets the full primer — the caveman skill, compacted into one block.
  • Every message after gets a short "stay caveman" reminder.

The primer also tells the model to use TOON fences for large tabular structured output when compactness matters and you did not ask for a specific format, while explicitly avoiding TOON for tool-call arguments or code.

The injected directive is plainly visible in the chat. The extension does not hide what it adds.

Install (load unpacked)

There is no store install today. You load the extension folder directly into a Chromium browser.

Open the extensions page

Go to chrome://extensions and turn on Developer mode (top-right toggle).

Load the folder

Click Load unpacked and pick the public/extension/ directory from the repo. It ships on for all three sites.

Pin and use

Pin the icon. Type and send as normal — the extension prepends the directive and submits. The on-page flame pill shows it's active; click it (or say stop caveman in chat) to turn off.

Works in any Chromium browser — Chrome, Edge, Brave, Arc. No build step.

No Chrome Web Store link yet

The store listing is pending review — there is no published "add to Chrome" link to give you. Until the correct listing is confirmed, the only way in is load unpacked. Treat any store URL you find as not-yet-live.

The popup

The popup is the control surface:

  • A master on / off toggle.
  • Intensity: lite, full, or ultra — how aggressively the directive asks the model to compress its replies.
  • Per-site switches for ChatGPT, Claude, and Gemini independently.
  • A "Leave a review" link.

State is stored as three keys in chrome.storage.sync: enabled, level, and sites. That is the entire footprint.

How it's built

Three source files, loaded in order:

  • src/directive.js — the pure caveman directive text (buildPrimer / buildReminder / isPrefixed / normLevel). No DOM, no chrome APIs, no network. It is loaded first and is the one piece the test suite imports directly.
  • src/caveman.js — the content script: per-site composer adapter plus capture-phase send interception. It uses a safe setText path (never textContent=, which desyncs editors like ProseMirror and Quill) and polls for the enabled send button before clicking.
  • src/background.js — the service worker, which just reflects the on/off state on the toolbar badge.

Per-site composer and send selectors live in a SITES map in src/caveman.js. Each entry keeps aria-label fallbacks, so one site rename does not break it.

terminal
make product-test PRODUCT=extension   # runs the directive unit tests (node --test)
make extension-zip # stages the shippable files into a zip

How it stays honest

Outgoing only, local only, inferred only

The extension edits your outgoing message and nothing else. It never reads model replies, never touches network requests, and automates nothing beyond submitting the message you sent. It requests only the storage permission — no host network access.

It runs entirely locally: no network requests, no analytics. The only stored state is enabled / level / sites.

Any savings are an effect of terser replies and are not measured by the extension. Caveman Mode never claims verified savings.

The privacy posture is spelled out in the bundled PRIVACY.md. The short version: nothing leaves your browser.

Where to go next