by furkankly
Watch a Claude Code session as a live flow graph, in your terminal or your browser.
# Add to your Claude Code skills
git clone https://github.com/furkankly/zoetropezoetrope is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by furkankly. Watch a Claude Code session as a live flow graph, in your terminal or your browser. It has 57 GitHub stars.
zoetrope's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/furkankly/zoetrope" and add it to your Claude Code skills directory (see the Installation section above).
zoetrope is primarily written in Rust. It is open-source under furkankly on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh zoetrope against similar tools.
No comments yet. Be the first to share your thoughts!
Unlocks once the catalog security scan passes (runs nightly).
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
Claude Code writes a JSONL transcript for every session under ~/.claude/projects/.
zoetrope reads it and draws the session as a graph in your terminal: the main agent, the subagents and
workflows it spawns, and the tools each one runs, updating live as it goes. Point it
at a finished run and it replays, paced by the session's own timestamps. Point it at a
running one and it follows along. It's read-only, and nothing leaves your machine.
Built on ratatui and rataflow.

cargo install zoetrope
The binary is zoe. Or build from source:
git clone https://github.com/furkankly/zoetrope
cd zoetrope
cargo build --release
./target/release/zoe
No install at all: try it in your browser. Drop a transcript on the page and get the same graph.
zoe # follow the current project's live session
zoe <dir> # follow another project's session
zoe <file.jsonl> # replay a recording from the start
zoe <file.jsonl> --follow # open a recording at its live edge
zoe <file.jsonl> --speed N # playback speed (default 8.0)
zoe inspect <file.jsonl> # print the session tree and exit (no TUI)
Give it a file and it reads the whole transcript, then keeps watching for new lines. Give it a directory, or no argument at all, and it finds the newest session in that project and follows it live. Whichever way you start, the controls are the same: scrub, follow, pause, jump back to live.
The same engine also runs in the browser, compiled to WebAssembly via ratzilla. Open a session from disk, or drop a transcript on the page. It stays local there too.
The graph
⚒ bash ×5, or ⚒ bash 0.5s
ticking during a single call), resolving to ✓ or ✗Time travel
Inspection
zoe inspect prints the whole tree headlessly, so it runs anywhere without a TTYReading your sessions
space play/pause · [ ] prev/next prompt · End or g jump to live · drag the
bar to seek · ? for everything else.
| Key | Action |
|---|---|
space |
play / pause (resumes from the playhead) |
[ / ] |
previous / next prompt era |
End / g |
jump to the live edge |
s |
toggle gap compression (faithful pacing vs. skip idle stretches) |
| mouse drag | seek along the scrubber |
o / f |
camera: Overview / Follow |
r |
relayout (tidy the graph) |
arrows / Tab / Shift-Tab |
move between agents |
h j k l |
pan the graph |
+ / - / 0 |
zoom in / out / reset |
c |
center on the selected agent |
| click | open an agent's detail panel |
j / k / PgUp / PgDn |
scroll the detail panel |
i |
session info overlay |
? |
help overlay |
esc |
close an overlay / clear the selection |
q / ctrl-c |
quit |
j / k scroll the detail panel when an agent is selected, otherwise they pan the graph.
Hand the camera to the action with f and it glides to whichever agent just did
something. This is what watching a live run looks like:

Or drive it yourself: pan, zoom where you point, open an agent's panel, and drag the scrubber to travel back through the session.

zoetrope treats the transcript as an append-only event log. It tails the files, parses each line defensively, and folds them into a derived model of agents, tool calls, and prompts. Nothing is mutated in place. The model is a pure function of the facts seen so far, so seeking backwards is exact.
A few of the pieces that turn a log into a watchable session:
toolUseId, a workflow's runId, a journal
result) rather than from guessing at strings or timing.r to relayout). The camera follows the action
until you touch it, then stays where you put it.tokio is pulled in without its net feature. cargo tree is the proof. This is
a property you can check, not a promise.The model, the timeline and the rendering all live in the portable core, a
library with no IO that compiles for any target, including WebAssembly. The native
frontend (the zoe binary in this
crate) and the browser frontend (the zoetrope-web crate under web/wasm/, which
runs the hosted app) sit on top of it and differ only in their IO and event loop.
See docs/DESIGN.md for the module map and the transcript format,
and docs/ARCHITECTURE.md for the invariants above in full.
The JSONL format zoetrope reads is undocumented and internal to Claude Code, so it can change without warning. zoetrope is built to degrade rather than break: unrecognized records are skipped, missing fields fall back, and a malformed line never takes down the session. If a new Claude Code release makes something render oddly, please open an issue.
Pull requests are welcome.
feat(timeline): index the playhead by event instead of wall-clock, `fix(tailer): fold appends at the live edge withou