Skip to main content

🎬 showreel

One CLI to turn terminal recordings into everything.

CI PyPI Python License Stars

Reads asciicast v1 / v2 / v3 (including asciinema 3.x recordings that most tools can't touch). Writes animated SVG, MP4 / WebM / MKV with real chapters, GIF / APNG, a self-contained HTML player, transcripts, subtitles and more — with vhs-style beauty presets on top.

uv tool install showreel

This is not a video and not a GIF — it's a single animated SVG. It is typing itself character by character right now: watch the loading bar fill in place and the cursor run ahead of the text. One .svg file, zero JavaScript, exported with one command.

Animated typewriter SVG: a production-deploy session typing itself character by character inside a decorated terminal window with ring traffic lights, purple gradient margin, drop shadow and a live cursor
showreel svg demo.cast -o demo.svg --preset pretty --chrome "showreel demo" \
  --watermark "made with showreel" --typewriter 50 --cursor-blink 530
Prefer pixels? The same recording as a GIF

The same deploy session rendered as a GIF with window chrome, gradient margin and rounded corners

Built for humans and AI agents. Every text command prints to stdout, every file command prints its path, showreel info gives stable JSON — and ships with a skill that teaches coding agents how to drive it.

Why

You recorded your terminal with asciinema — a perfect .cast file. Now what? asciinema itself has no SVG/video export, and the existing converters are stuck in the past:

Tool Status Reads v3 SVG Video Chapters
showreel ✅ active ✅ ✅ ✅ mp4/webm/mkv/mov ✅ real (mkv/mp4) + YouTube/VTT/JSON
agg ✅ official ✅ ❌ ❌ (gif only) ❌
svg-term-cli 😴 2017 ❌ v2-only ✅ ❌ ❌
termtosvg 🗄️ archived ❌ ✅ ❌ ❌
terminalizer 😴 dormant ❌ ❌ ❌ ❌

showreel keeps the good ideas (agg's knob set, svg-term's CSS animation, termtosvg's window frames, vhs's aesthetics) in one dependency-light Python tool.

Install

uv tool install showreel        # fast
pipx install showreel           # classic
pip install showreel            # boring

Needs Python ≥ 3.10. Video/GIF/APNG export needs ffmpeg on PATH (brew install ffmpeg / apt install ffmpeg).

Quick start

asciinema rec demo.cast              # record something

showreel info demo.cast               # metadata + markers as JSON
showreel svg demo.cast                # → demo.svg   self-contained animated SVG
showreel video demo.cast              # → demo.mp4   H.264 with chapters
showreel gif demo.cast                # → demo.gif   palette-optimized, loops
showreel html demo.cast               # → demo.html  offline player, no CDN
showreel all demo.cast -o out/        # → everything + manifest.json

Text commands (text, md, subs, chapters) print content to stdout unless you pass -o; file commands print the output path. Progress goes to stderr, exit codes are 0/1 — pipe freely.

Commands

Command Output Highlights
info JSON duration, markers, event stats, env, first prompt — the agent entrypoint
video mp4 / mkv / mov / webm chapters embedded from marker events, --audio background music, --crf, --fps
gif gif / apng two-pass palette (stats_mode=diff, diff_mode=rectangle), --hold last frame
svg animated SVG SMIL-timed, no JS, per-glyph grid alignment — embed anywhere
html offline player embedded mini terminal emulator, seek bar, speed 0.5–8×, marker buttons
poster PNG still any --at SECONDS, final screen by default
text txt stream (raw), screen (final), timed ([hh:mm:ss] prefixes — feed an LLM)
md Markdown front matter + final screen + chapter list
html-transcript colored HTML every screen change, timestamped
subs srt / vtt transcript as captions — makes recordings searchable
chapters ffmetadata / youtube / vtt / json / text from markers or --auto 30
convert asciicast v1/v2/v3 version conversion + trim/speed/idle/gzip, --strip-input
all directory full bundle + manifest.json with sha256 + README.txt

Examples — one recording, every format

Everything below lives in examples/ and was produced by two commands (see examples/README.md for the exact ones). The animated SVG at the top of this page is examples/demo.svg — the same file your terminal exports.

Then compare the same recording across formats:

Watch Read Data
demo.mp4 · demo.mkv (chapters!) · demo.webm · demo.apng demo.txt · demo.timed.txt · demo.md · demo.transcript.html demo.v3.cast · demo.v2.cast · demo.summary.json
demo.html (offline player) · demo.poster.png demo.srt · demo.transcript.vtt demo.chapters.json · .youtube.txt · .ffmeta.txt · manifest.json

Time control (every command)

--start 10 --end 25   # trim; pre-start history still shapes the first frame
--from-marker build --to-marker deploy   # agg-style marker selection (exact or unique prefix)
--speed 2             # faster playback
--idle-limit 3        # compress pauses longer than 3s

Make it beautiful

One flag for the full look, or compose your own:

showreel gif demo.cast -o demo.gif --preset pretty --chrome "deploy" --watermark "@you"
A decorated terminal frame: window bar with ring traffic lights, rounded corners, drop shadow, purple gradient margin and a watermark
Option What it does
--preset pretty / clean / minimal curated defaults; explicit flags always win
--theme dracula, nord, monokai, gruvbox-dark, solarized-dark/light, tango-light, asciinema, or auto (from the cast header)
--chrome "title" + --chrome-style mac/rings/right window bar with traffic lights (vhs WindowBar)
--margin N --margin-fill "#6B50FF,#241a66" outer margin, solid or vertical gradient (vhs Margin/MarginFill)
--radius 12 rounded corners (vhs BorderRadius)
--shadow drop shadow behind the panel
--watermark "@you" corner watermark
--typewriter [CPS] re-time output character by character (default 40 chars/sec)
--cursor-blink 530 blinking cursor in rendered frames
--font /path/Mono.ttf --font-size 24 --padding 16 typography & spacing
--cursor block/underline/off --bold-is-bright cursor & color quirks

Chapters, properly

Touch the m key during asciinema rec (v3) and showreel turns markers into:

  • Matroska/MOV chapters inside MKV/MP4 — VLC, mpv and IINA show them, seeking is instant;
  • YouTube chapter lists (0:00 entry added automatically, as YouTube requires);
  • WebVTT chapter tracks and JSON;
  • seek buttons in the exported HTML player.

No markers? --chapters auto:30 (video) or chapters --auto 30 cuts one every 30 seconds.

For AI agents 🤖

showreel ships with a ready-made skill — copy skills/showreel/SKILL.md into your agent's skill directory (or point it at this repo) and it will know how to: convert recordings, extract timestamped transcripts for context, cut clips by marker, and embed demos in docs. Highlights agents rely on:

showreel info rec.cast                 # stable JSON schema
showreel text rec.cast --mode timed    # [hh:mm:ss] ANSI-free transcript on stdout
showreel all rec.cast -o out/          # deterministic names + sha256 manifest
cat rec.cast | showreel gif - -o r.gif # stdin works

Exit codes 0/1, progress on stderr, paths/content on stdout. The full contract lives in AGENTS.md — for building showreel and for driving it.

How the SVG works

Each output event is replayed through the pyte terminal emulator; the screen is diffed row by row, and every changed row becomes a <g> group — background <rect> plus styled runs — popped in by a declarative SMIL <set> at the event's timestamp. Every glyph gets an absolute x position on the cell grid, so nothing shifts or jitters regardless of the viewer's fonts. The cursor is a live element: it follows the typing inside per-event visibility windows, then settles at the prompt and blinks forever. Later rows paint over earlier ones, so history accumulates like a real terminal. One file, zero JavaScript, plays anywhere SVG animates — browsers, <img> tags, README embeds.

Limitations

  • The emulator keeps the header's terminal size; mid-recording resizes are recorded but not re-flowed.
  • Full-screen TUI apps (vim, htop) can render with artifacts — pyte doesn't swap the alternate screen buffer.
  • WebM carries no chapters (not in the spec) — use MKV/MP4.
  • No emoji font fallback in rendered frames yet.

Development

git clone https://github.com/forcewake/showreel && cd showreel
uv sync                # deps + editable install
uv run pytest          # test suite (ffmpeg tests auto-skip)

Architecture and hard-won gotchas are documented in AGENTS.md. PRs welcome — especially new themes and output formats.

Acknowledgements

  • asciinema by Marcin Kulik — the recording format and the reference agg
  • pyte — the terminal emulator core
  • vhs — the aesthetics bar this project steals from, openly

License

MIT © Pavel Nasovich

If showreel saved you an afternoon, drop a ⭐ — it helps others find it.

Metadata

Release files for showreel 0.2.0

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

Source distribution (sdist)

Source distribution for showreel 0.2.0
File Size Uploaded
showreel-0.2.0.tar.gz 1.7 MB Details

Built distribution (wheel)

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

Total release size: 1.8 MB

Release files / showreel-0.2.0.tar.gz

Download URL showreel-0.2.0.tar.gz
Size 1.7 MB
Tags Source
SHA-256 checksum
How to use checksums
2cd3f69315a24af27064f9c8aedb8441fd82d2a147bf148363bb53674588924a
BLAKE2b-256 checksum
How to use checksums
b091ac79c55bdcf7ca1373d5caf003033a389c52526df37423a91d6b5f9f6fe5
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 Sep 2, 2026.

Transparency log

Release files / showreel-0.2.0-py3-none-any.whl

Download URL showreel-0.2.0-py3-none-any.whl
Size 53.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
00c4476e8878f93983d17d35589f9bb498f9f0e0e82011b0da9f0fe83623d6a4
BLAKE2b-256 checksum
How to use checksums
f12739119bf2bad03f43cf59f39b8e9b7618814ed0d577696bea1c61bfd056f6
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 Sep 2, 2026.

Transparency log

Release history Release notifications | RSS feed

0.3.1

2 release files

0.3.0

2 release files

0.2.1

2 release files

This release

0.2.0 This release

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