Every agent turn,on the record.

Turnal pairs agent activity with byte-exact workspace checkpoints. Search what happened, trace a line to its prompt, verify an earlier state, and roll back with a safety net, all on your machine.

$ npm install -g @aadijo/turnal
Get the extension Read the docs
aadijo@MacBook-Pro Project % turnal log --all-worktrees --no-pager

checkpoint graph: 5 sessions, 13 turns, 2 rollbacks

sessions: [claude 14:20] [claude 14:46] [claude 14:16] [codex 14:28] [codex 14:12]

*         59a91d6d715f - 14:58 [claude 14:20] turn 4      Read +2 complete 2 files +18 -6  24 events; claude-code; tools: Read, Edit, Bash
|         Prompt: "Return success for an event another worker already completed."
|         
| *       583cb027b9f3 - 14:56 [claude 14:46] turn 2      Read +2 complete 3 files +31 -14  22 events; claude-code; tools: Read, Edit, Bash
| |       Prompt: "Attach order and event ids to every checkout error."
| |       
| |   *   e853a4e34acc - 14:54 [codex 14:28] turn 2      Read +2 complete 2 files +24 -3  19 events; codex; tools: Read, Edit, Bash
| |   |   Prompt: "Validate provider timeout values during startup."
| |   |   
! ! ! ! ! ------------ reverted to [codex 14:12] turn 2 68459d51926d
| | | | | 
* |   |   5027e8e66e1f - 14:49 [claude 14:20] turn 3      Read +2 complete 2 files +42 -19  28 events; claude-code; tools: Read, Edit, Bash
| |   |   Prompt: "Move the idempotency claim into the fulfillment transaction."
| |   |   
| *   |   7d073c54cb16 - 14:46 [claude 14:46] turn 1      Read +3 complete 3 files +57 -8  26 events; claude-code; tools: Read, Write, Edit, Bash
| |   |   Prompt: "Add payment lifecycle correlation ids."
| |   |   
|     | * 3251ca08a1b4 - 14:43 [codex 14:12] turn 3      Read +2 complete 2 files +29 -12  21 events; codex; tools: Read, Edit, Bash
|     | | Prompt: "Separate duplicate delivery metrics from provider retries."
|     | | 
|   * | | 7f68c3762e1a - 14:40 [claude 14:16] turn 2      Read +2 complete 2 files +16 -10  18 events; claude-code; tools: Read, Edit, Bash
|   | | | Prompt: "Scope raw-body parsing to the Stripe route."
|   | | | 
! ! ! ! ! ------------ reverted to [claude 14:20] turn 1 pre 614611d0aa9f
| | | | | 
*   | | | eadff0409763 - 14:32 [claude 14:20] turn 2      Read +2 complete 2 files +23 -9  20 events; claude-code; tools: Read, Edit, Bash
|   | | | Prompt: "Release the claim only for retryable failures."
|   | | | 
|   | * | 993f79127546 - 14:28 [codex 14:28] turn 1      Read +3 complete 3 files +46 -2  23 events; codex; tools: Read, Write, Edit, Bash
|   | | | Prompt: "Define provider timeout configuration."
|   | | | 
|   |   * 68459d51926d - 14:24 [codex 14:12] turn 2      Read +2 complete 1 file +63 -7  25 events; codex; tools: Read, Edit, Bash
|   |   | Prompt: "Synchronize eight delivery workers in the integration test."
|   |   | 
*   |   | ad8a917cf3bd - 14:20 [claude 14:20] turn 1      Read +2 complete no file changes  17 events; claude-code; tools: Read, VectorSearch, Bash
|   |   | Prompt: "Map the existing fulfillment boundary."
|   |   | 
    *   | deef09f4d71a - 14:16 [claude 14:16] turn 1      Read +2 complete no file changes  15 events; claude-code; tools: Read, VectorSearch, Bash
    |   | Prompt: "Trace the parsed request-body path."
    |   | 
        * b31b0e743646 - 14:12 [codex 14:12] turn 1      Read +2 complete 1 file +71 -0  20 events; codex; tools: Read, Write, Bash
        | Prompt: "Add the first concurrent delivery test."
Claude Code Codex

It watches the work. It doesn’t direct it.

An append-only event trail explains what happened. Hidden Git checkpoints preserve what the captured workspace looked like. Turnal keeps the two together.

Local by construction.

Events and checkpoints live in .turnal, outside your Git history.

One history across agents.

Completed turns from every agent land in one traceable timeline.

The story behind the diff.

Prompts, responses, tools, and file changes stay together for every turn.

Recovery you can rehearse.

Preview the rollback. Turnal saves a safety checkpoint first.

Every agent session, one history.

Claude Code and Codex can work in sequence or in parallel. Turnal keeps each completed turn, including its prompt, tools, and checkpoints, in one interleaved timeline.

Claude Code v2.1.11 welcome screen using Fable 5

Fable 5 with high effort · Claude API

? for shortcuts

>_ OpenAI Codex (v0.144.0)

model: gpt-5.6-sol high fast

directory: ~/Dev/relay-api

checkpoint graph: 2 sessions, 0 turns, 0 lanes

A commit shows the code. An agent turn shows the story.

A Git commit preserves what the code looked like. An agent turn adds what happened, why, what changed, and how to get back safely.

Turn detail
Git commit What the code looked like
Agent turn What happened, and how to get back
Captured files & bytes Byte-exact contents and executable bits for the captured workspace surface.
Full tree Included in a Git commit
Captured tree Included in an agent turn
Branch & commit context Which branch and commit the work was sitting on.
Ref + SHA Included in a Git commit
Repo + worktree identity Included in an agent turn
Prompt & assistant response The instruction and response when the agent integration exposes them.
Not captured Not available in a Git commit
Captured or marked redacted Included in an agent turn
Tool activity Ordered tool activity exposed by the agent integration.
Not captured Not available in a Git commit
Append-only event trail Included in an agent turn
Before / after diff What actually changed, scoped to a single agent turn.
Between commits Partial in a Git commit
Per-turn checkpoints Included in an agent turn
Attribution to the responsible turn Which agent turn and prompt are behind a given line.
Author + hash only Partial in a Git commit
Prompt-aware blame Included in an agent turn
Safety-first rollback Previewing a restore and preserving the current captured state first.
Manual reset or revert Partial in a Git commit
Safety checkpoint first Included in an agent turn

Capture. Inspect. Verify. Recover.

Search, diff, blame, verification, and rollback all derive from events and checkpoints already on disk.

aadijo@MacBook-Pro Project %

Turnal captures each turn in the background. Use the CLI when you need to inspect, trace, test, or restore what happened.

Go beyond the timeline.

Trace a line, test an earlier state, name a rollback point, inspect rerun readiness, or preserve a turn as an immutable case.

aadijo@MacBook-Pro Project % turnal blame src/webhooks/stripe.ts:24 --verbose
14:48 [claude 14:42] turn 4     24 |   if (!claimed) return res.sendStatus(200)
  Prompt: "Make the webhook idempotency claim transactional and release it only on retryable failures."
  session: claude-a13f
  adapter: claude-code
  tools: Read, Edit, Bash
  checkpoint: refs/agent-vcs/checkpoints/claude-a13f/turn/000004/post
  id: 9df3a1e9c54b

Keep the starting point. See what a fork needs.

When a result deserves another pass, preserve its starting point as a case. Fork preflight shows what you need to retry the task with a different agent, instruction, or approach.

aadijo@MacBook-Pro Project % turnal case create claude-a13f:4

Source turn

claude-a13f:4

prompt

Make webhook delivery safe to retry.

checkpoint
8e7bc19
workspace
3 files changed
tests
13 passed

Case

retry-webhook / rev 3

immutable
starting checkpoint
8e7bc19
task revision
retry-webhook / 3
contract
13 tests must pass
limitations
staging API unavailable

Fork preflight

readiness only

aadijo@MacBook-Pro Project % turnal fork claude-a13f:4 --dry-run

Captured

3
  • Base checkpoint8e7bc19
  • Instructionexact
  • Evaluators13 tests

Still needed

3
  • Conversationpartial
  • Secretsnot captured
  • Networklive service

Keep the story next to the code.

Install Turnal, initialize the workspace, then let Claude Code and Codex work normally.

$ npm install -g @aadijo/turnal
Get the extension