turbocommit creates a git commit containing everything Claude Code changes on each turn. Think of it like save state in a game emulator: whenever you fall in a pit, you can safely rewind and try again.
Captures every prompt/response transcript for the associated changes so you and your agent never lose the thread on what you were doing after the fact, even if you didn't leave behind any comments or docs.
Each commit also links back to the previous commit from the same Claude Code session, so you can run multiple agent sessions concurrently and detangle which agent committed what after the fact.
turbocommit registers four hooks with Claude Code: PreToolUse, SessionStart, SessionEnd, and Stop.
- PreToolUse tracks which sessions actually modify files (Write, Edit, MultiEdit, NotebookEdit, MCP tools). Read-only sessions (Grep, Read, Bash-only) are never committed.
- SessionStart / SessionEnd chain sessions across
/clearboundaries so planning context survives into the eventual commit. - Stop fires after every turn. If the session modified files, it
commits with
git add -A. If not, it buffers the transcript for pickup by a later session that does commit.
The commit message headline is generated by a title agent (configurable).
The body contains the full prompt/response transcript. When planning
context was buffered from ancestor sessions, it appears under a
## Planning section before the ## Implementation section.
brew install searlsco/tap/turbocommit
turbocommit installThen enable it per-project:
cd your-repo
turbocommit initturbocommit deinit # disable in a project
turbocommit uninstall # remove the global hook
brew uninstall turbocommitturbocommit install adds one hook group per event (PreToolUse,
SessionStart, SessionEnd, Stop). The hooks are fire-and-forget: they
always exit 0 and never block Claude.
If you rearrange your hooks manually, the turbocommit hooks can go anywhere — order doesn't matter since they never block.
| Command | Description |
|---|---|
turbocommit install |
Add hooks to ~/.claude/settings.json |
turbocommit uninstall |
Remove them |
turbocommit init |
Create .claude/turbocommit.json in current repo |
turbocommit deinit |
Remove it |
turbocommit doctor |
Check hook and config health |
turbocommit monitor |
Tail the event log (start/success/skip/fail) |
turbocommit help |
Show usage |
turbocommit --version |
Show version |
Every turbocommit adds a Continuation of <SHA> reference linking back to
the previous commit from the same Claude session. This means you can run
multiple sessions in parallel — different tabs, different tasks — all
committing to a single branch, and still trace each logical workstream
by following the SHA chain.
Here's a real stretch of prove_it's
main branch. Two sessions and a couple manual commits, all interleaved:
cb20f72🔵 Fix PROVE_IT_DISABLED leak in integration testscff5a2e🔵 Fix env variable leaks in integration test harness5c3ca43🟠 Fix reviewer rationale parsing for multi-line verdicts6f22cee🟠 Remove dead cached output filter and JSDocefca526v0.44.01561c46update conifgde771db🟠 Fix init to preserve custom sources during config upgrade538fc72🟠 Fix signal command to fail honestly outside hook context
Each linked commit's description starts with the reference back:
Fix signal command to fail honestly outside hook context
Continuation of de771db
Prompt:
...
So after the fact, you can reconstruct each session's lineage:
🟠 Session A: 5c3ca43 → 6f22cee → de771db → 538fc72
🔵 Session B: cb20f72 → cff5a2e
No feature branches. No rebasing. Just a flat history where every thread is traceable.
turbocommit init creates .claude/turbocommit.json with {"enabled": true}.
You can also place a global config at ~/.claude/turbocommit.json — project
config is deep-merged on top.
Here's every property with its default:
Set TURBOCOMMIT_DISABLED to any non-empty value to skip turbocommit at
runtime without changing config.
- Node.js >= 18
- Git
- Claude Code
{ // Required. turbocommit is inert unless this is true. "enabled": true, // Co-Authored-By trailer. // true → auto-detect model from transcript (default) // false → no trailer // "Name <email>" → custom trailer value "coauthor": true, "title": { // "agent" (default) → run a title agent to generate the headline // "transcript" → extract the first prompt as the headline "type": "agent", // Command to run for title generation (only when type is "agent"). "command": "claude -p --model haiku", // Prompt template sent to the title agent. Use {{transcript}} as the // placeholder for the session transcript. "prompt": "You have 10 seconds. Write a single-line git commit headline (max 72 chars) from this coding session transcript. Speed over perfection — a rough title beats no title.\n\nRules:\n- Imperative mood (\"Add\", \"Fix\", \"Update\")\n- Specific about what changed\n- No trailing period\n- No conventional commit prefixes unless clearly a fix/feat\n\nTranscript:\n{{transcript}}\n\nRespond with ONLY the headline, nothing else. Do not deliberate." }, "body": { // "transcript" (default) → use the formatted prompt/response transcript // "agent" → run a body agent to summarize "type": "transcript", // Command to run for body generation (only when type is "agent"). "command": "claude -p --model haiku", // Prompt template sent to the body agent. Use {{transcript}} as the // placeholder for the session transcript. "prompt": "Given this transcript of a coding session, write a concise git commit body.\n\nRules:\n- Summarize what was done and why\n- Be concise — a few sentences or bullet points\n- Focus on the \"why\" more than the \"what\"\n\nTranscript:\n{{transcript}}\n\nRespond with ONLY the commit body, nothing else.", // Wrap prose lines at this width. Code blocks, tables, headers, and // other structured content are preserved verbatim. // false/absent → no wrapping (default). "maxLineLength": false } }