🎬 showreel
One CLI to turn terminal recordings into everything.
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.
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
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"
| 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:00entry 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)
| File | Size | Uploaded | |
|---|---|---|---|
| showreel-0.2.0.tar.gz | 1.7 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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