Skip to main content

sessionreel

Your agent worked for two hours. Here is the 35-second version.

sessionreel reads a Claude Code session log and renders a short recap video: the ask, the test that went red, the diff that fixed it, the run that went green, what shipped. It runs locally, redacts secrets before anything is drawn, and needs no API key.

sessionreel demo: 2 failed → 14 passed in 35 seconds

uvx sessionreel            # newest session in this directory → reel.mp4

한국어

Why

Agent sessions are real work that nobody else can see. A teammate will not scrub a 30 MB transcript, a client will not open a replay viewer, and a link on X is not a video. The tools that exist are viewers (you go to them); sessionreel makes the thing you send.

What a reel is built from: all of it straight from the log:

scene source in the log
the ask the prompt that started this piece of work
exploring files read and searches run before the first change
red a test/build command whose output shows failures (pytest, jest/vitest, go test, cargo test, tsc, ruff, mypy, make <target>)
the fix the diffs Claude Code recorded between that red run and the next green run of the same check
green the same check passing
shipped a successful git commit / git push / gh pr create / publish, with the commit message
numbers active time (breaks over 15 min don't count), tool calls, files and lines changed, tests

No arc in the session? The reel is built from the largest edits instead. A long session with many unrelated tasks? The reel tells one episode: from the ask that led to the fix up to the next ask, so it doesn't end on another task's summary (--whole to override).

Install

uvx sessionreel                                          # run without installing
pipx install sessionreel                                 # or install
uvx --from git+https://github.com/mandu5/sessionreel sessionreel   # latest main

Python 3.10+. ffmpeg is used if it's on your PATH, otherwise the bundled static build from imageio-ffmpeg. Fonts are bundled (JetBrains Mono, Inter, Pretendard for Hangul, Noto Emoji).

As a Claude Code plugin, the agent that did the work writes the captions:

/plugin marketplace add mandu5/sessionreel
/plugin install sessionreel@sessionreel
/reel

/reel plans the storyboard, rewrites the captions from its own context (only claims the scene data supports), and renders. Or npx skills add mandu5/sessionreel.

Use

sessionreel                          # this session inside Claude Code; else the newest one for this directory
sessionreel 5e55a0d0                 # a session id prefix, or a path to a .jsonl
sessionreel list                     # recent sessions: id, time, prompts, tool calls, project
sessionreel demo                     # a bundled sample session, no logs needed

sessionreel --format wide            # 1920×1080   (square 1080×1080 is the default; tall 1080×1920)
sessionreel --lang ko                # Korean captions
sessionreel --voice                  # narrate with the OS voice (say / espeak-ng), no cloud TTS
sessionreel --gif                    # also write a GIF
sessionreel --redact 'ACME-\d+'      # extra pattern to scrub (repeatable)
sessionreel --project "client app"   # name shown on frames instead of the directory; --no-branch hides the branch

Edit before rendering:

sessionreel plan -o storyboard.json      # the story as JSON: scenes, captions, durations
$EDITOR storyboard.json                  # rewrite captions, drop a scene, change timing
sessionreel render storyboard.json -o reel.mp4

A 35-second 1080×1080 reel renders in about 30 seconds on an M1 Pro and is ~1 MB.

Privacy

Redaction runs on the parsed session before the storyboard exists, so no later stage ever sees the original strings, and it runs again at render time over every string in the storyboard, so a caption edited by you or by an agent is checked too. It removes:

  • provider keys and tokens (Anthropic, OpenAI, Stripe, GitHub, GitLab, npm, PyPI, AWS, Slack, SendGrid, Twilio, Google, Hugging Face), JWTs, bearer/basic auth, private-key blocks, also when they span lines inside a diff, webhook URLs, credentials and tokens in URLs;
  • SECRET=value, "api_key": "…", --password …, mysql -p…, curl -u user:pass;
  • long high-entropy strings that look like credentials;
  • your identity: home directory (→ ~, including Claude Code's -Users-you-… form), username, hostname, user@host prompts, e-mail addresses;
  • the contents of .env*, *.pem, *.key, *.p12, *.tfvars, .git-credentials, kube/docker/AWS credential files, never shown at all.

plan prints how many items were removed, by kind. --project NAME replaces the directory name shown on every frame and --no-branch hides the git branch. Captions whose numbers do not appear in the scene's data are flagged at render time.

Redaction is pattern-based. Watch the video before you post it. Nothing is uploaded anywhere; sessionreel makes no network calls.

FAQ

Isn't this just a screen recording? No recording happens. Every frame is drawn from the log: the real command, the real output, the real diff hunks Claude Code stored. You can make a reel of a session from last month.

Does an LLM write the story? No. The planner is deterministic and every caption is built from numbers in the log. In plugin mode the agent may reword captions, but the skill forbids claims the scene data doesn't support, and each scene keeps its original fact.

Codex / Cursor / other agents? Claude Code first. The ingest layer normalises to five event kinds, so another log format is one adapter; Codex is next. PRs welcome.

How is this different from claude-replay, mindwalk, zoetrope, claude-code-log? Those are viewers: interactive pages or TUIs you open and explore. sessionreel produces a 30–60 second video that plays inline wherever you post it.

How it works

ingest (JSONL → prompts, messages, tool calls joined to their results, diff hunks, token usage) → redact → story (finds the red→fix→green arc, scopes the episode, packs scenes into a time budget) → render (Pillow draws each frame; frames stream into ffmpeg as raw RGB → H.264). Design notes: DESIGN.md.

python -m pytest -q      # 140 tests: ingest, adversarial redaction, check parsing, arcs, storyboard safety, rendering, CLI

License

MIT. Bundled fonts are under the SIL Open Font License 1.1 (see src/sessionreel/fonts/).

Metadata

Release files for sessionreel 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sessionreel 0.1.1
File Size Uploaded
sessionreel-0.1.1.tar.gz 4.3 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for sessionreel 0.1.1
File Interpreter ABI Platform
sessionreel-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 8.5 MB

Release files / sessionreel-0.1.1.tar.gz

Download URL sessionreel-0.1.1.tar.gz
Size 4.3 MB
Tags Source
SHA-256 checksum
How to use checksums
1d14fe5b7004a3992f251f7d6d8ee207c2773a60a50c7eb9637d7414bd380ff5
BLAKE2b-256 checksum
How to use checksums
144637205ab7745a92e68004355fd684a4dcfbe9cceb981d68f6af67ae1a1a82
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.

Transparency log

Release files / sessionreel-0.1.1-py3-none-any.whl

Download URL sessionreel-0.1.1-py3-none-any.whl
Size 4.3 MB
Tags Python 3
SHA-256 checksum
How to use checksums
9a6dc799d3c69ad5cbcb2b07a2bcc1e695a9821adacf2cf05f28c76757d9def9
BLAKE2b-256 checksum
How to use checksums
658a43071aa2da3e7b214fa4bbabd9248969f7c6a080d76815c72f8ca77ebcb3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 4, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page