Everyone swears Claude got lazier. Bring receipts. cc-sentiment scores your Claude Code transcripts on-device and ships ten signed metrics per 5-minute slice to the shared dashboard at sentiments.cc.
uvx cc-sentimentThe first run links a signing key (GitHub or GPG), scores every transcript in ~/.claude/projects/, and uploads the numbers; your slice joins the pooled charts at sentiments.cc. Needs uv.
Driving with an agent? Paste this:
Run `uvx cc-sentiment` and finish the setup TUI — it links a GitHub or GPG signing key, scores my Claude Code transcripts locally, and uploads the numbers.
Then run `cc-sentiment install` to schedule the daily background run.
Verify my contribution shows up on the dashboard at https://sentiments.cc.
Threads like anthropics/claude-code#42796 describe the same drift of fewer reads before edits and lazier patches, but every report is one person's slice. Score yours and pool it:
uvx cc-sentimentEach 5-minute slice becomes numbers such as sentiment, read-to-edit ratio, edits without a prior read, and tool calls per turn. On the pooled charts a real shift shows up as a line bending, not a vibe.
Your transcripts hold prompts, file paths, and diffs you'd never post publicly. The upload never contains them:
uvx cc-sentiment setupSetup walks you through linking a GitHub or GPG signing key, with honest verified / pending / failed end-states. Scoring runs on-device with MLX on Apple Silicon, and the CLI asks before touching the fallback Claude CLI engine. Each upload is the numbers plus a signature the server verifies without learning anything else about your sessions.
Was it the new model, or the CLI release that shipped under you the same week? One contributor's sessions can't separate the two:
uvx cc-sentiment installA daily launchd run keeps scoring new sessions, and every slice lands tagged with the Claude model and Claude Code version that produced it, so the dashboard breaks the trends down by model while the CLI version rides along in the data.
The client records the following per 5-minute slice of each conversation.
| Metric | What it captures |
|---|---|
| Sentiment score | 1 to 5, scored locally |
| Read-to-edit ratio | Files Claude reads before editing |
| Edits without prior read % | Edits to files Claude hadn't read this session |
| Write-to-edit ratio | File rewrites vs. surgical edits |
| Tool calls per turn | Tools invoked between user messages |
| Subagent spawns | How often Claude delegates to a subagent |
| Turn count | User-to-assistant exchanges |
| Thinking present / chars | Whether and how much Claude wrote extended thinking |
| Claude model | Which model produced the assistant turns |
cc_version |
Claude Code CLI version |
Plus a public verification handle, your GitHub username or GPG fingerprint, used only to find a public key and verify signatures. Conversation text, file contents, file paths, prompts, tool inputs, and tool outputs never leave your machine.
| Command | Description |
|---|---|
cc-sentiment |
Interactive TUI. Sets up if needed, then scores and uploads. |
cc-sentiment setup |
Re-run the setup wizard to pick, generate, or re-link a signing key. |
cc-sentiment run |
Score new transcripts and upload. Non-interactive; safe for cron, SSH, and launchd. |
cc-sentiment install |
Schedule a daily background run via launchd. |
cc-sentiment uninstall |
Stop and remove the scheduled run. |
cc-sentiment debug |
Print hardware, engine, Claude CLI, server, and Sentry probes. |
The full flag list lives in cc-sentiment --help.
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ client/ │ POST │ server/ │ fetch │ app/ │
│ local CLI │────────▶│ Modal API │◀────────│ SvelteKit │
│ scoring │ signed │ TimescaleDB │ SSR │ dashboard │
└─────────────┘ upload └─────────────┘ └─────────────┘
The CLI you run, the API that verifies signatures and stores slices, and the dashboard that charts the pool all live in one repo.
Watch the experiment live at sentiments.cc. Licensed under MIT.


