Every release,
fully drawn.

Release notes, compatibility details, and downloadable binaries—kept alongside the documentation they belong to.

v0.6.0Latest release

v0.6.0 — The editor grows up

Record it, then fix it. The visual editor is now a proper little IDE for your recordings: a timeline panel edits the cast itself — retype a flubbed command, retime a pause, delete a stray event — and the saved SVG embeds the edited recording, so extract hands your fixes back. Recorded with the terminal too big? --cols/--rows now resize a cast after the fact, replaying it through a different-sized terminal exactly as a real resize would. And the whole editor dresses itself in the built-in themes — solarized by default, or any of the nine, independent of what the SVG wears.

The editor as an IDE: activity bar, themed chrome, live preview with zoom, and the timeline panel editing the recording's events

Highlights

  • Timeline editing — the bottom panel lists every event in the recording (control characters shown as ␛␍␊ pictures or \e\r\n escapes, your pick). Click a row and the preview scrubs to that exact moment; edit its time, code, or text (with \e \r \n \t \\ \xNN escapes), insert, duplicate, delete, or reorder — with undo/redo (⌘Z/⇧⌘Z) and a dirty dot on the file chip. Edits rewrite the recording server-side, so Download and Save embed the edited cast and terminal-svg extract recovers it; an untouched session still round-trips the original bytes exactly. v2 stays v2, v3 stays v3.
  • Resize after recording-c/--cols and -r/--rows now apply to .cast inputs, replaying the recording through a different-sized grid (recorded resize events still apply, so the canvas never shrinks below the largest grid the recording uses). The override embeds in the SVG's metadata and survives re-renders. In the editor, the sidebar columns/rows are the same non-destructive override — the recording's own size shows as the placeholder — while the timeline's recording fields rewrite the header for keeps.
  • An IDE, properly — activity bar, resizable sidebar and panel, command-center file pill, uppercase collapsible sections, Lucide icons, slim status bar with grid/events/duration readouts, and preview zoom (fit/100%/±, ⌘0 ⌘1 ⌘±, ctrl+wheel, drag to pan). A settings view (gear icon) themes the editor chrome with any built-in theme — solarized-dark out of the box, or "follow preview" — plus stage background, default zoom, and timeline preferences, persisted in the browser.

Rendering is unchanged: existing invocations produce the same SVGs, and the CLI's default theme is still dracula. The editor's /api/state payload changed shape (themes now carry their colors), which only matters if you were scripting against it.

Install

brew install russmckendrick/tap/terminal-svg   # or: brew upgrade terminal-svg

Or grab a binary below (macOS arm64/amd64, Linux arm64/amd64, Windows amd64 — each with a SHA-256 checksum). rec is macOS/Linux only for now; rendering .cast files works everywhere.

Quick start

# recorded at 132 columns, want it narrower — no re-recording
terminal-svg demo.cast -c 80 -o demo.svg

# open the editor: scrub the timeline, fix the typo, save
terminal-svg editor demo.cast

# the saved SVG carries the edited recording
terminal-svg extract terminal.svg -o fixed.cast

Docs: README · CLI reference · theme format · how it works

Bundled JetBrainsMono Nerd Font faces are under the SIL OFL; the code is MIT.

Full Changelog: https://github.com/russmckendrick/terminal-svg/compare/v0.5.0...v0.6.0

v0.5.0

v0.5.0 — The SVG is its own source

Ship an SVG demo, delete the recording, regret nothing. Every SVG terminal-svg writes now carries its own source — the recording and the render options travel inside the file, so terminal-svg demo.svg -t nord re-renders it and terminal-svg extract demo.svg hands the .cast back byte-for-byte. And when flags aren't fast enough, terminal-svg editor opens the whole option surface in your browser with a live preview rendered by the binary itself.

The visual editor: controls for every render option on the left, live preview on the right

Highlights

  • The SVG is its own source — the original input (.cast recording or captured ANSI) plus the effective options ride along in a <metadata> block browsers ignore, deflate-compressed, typically a few percent of file size. Re-render with new flags (terminal-svg demo.svg --speed 2; command line beats embedded beats config), or recover the recording with the new extract subcommand. --no-embed-source (flag or config key) turns it off — and note the flip side: an embedded source means the SVG contains everything that was captured, so scrub first or opt out for sensitive sessions. SVG optimizers strip <metadata>, which forfeits the round trip.
  • terminal-svg edit — fix a take without re-recording. --redact 'ghp_\w+' masks matches with * per character (matched across event boundaries in both the output and keystroke streams, so a token split over events or typed one key at a time is still caught), --cut 12.5-20 removes a range and closes the gap, --max-pause 1.5 bakes an idle cap into the file. v2 in, v2 out; v3 in, v3 out — input/marker events and the embedded v3 theme all survive, and editing in place is refused by design.
  • terminal-svg editor — a visual editor served by the binary on 127.0.0.1 (--port, --no-open): themes, chrome, layout, cursor, speed, trims — every option a control, every preview the real renderer (~10 ms a frame). Drop in a .cast, an ANSI dump, or any terminal-svg SVG — which seeds the controls from the options it carries — then Download, or Save straight to the -o path. Flags and your config file seed the controls: terminal-svg editor demo.cast -t nord.

Existing invocations keep working and rendering is unchanged; output differs only by the embedded metadata block (opt out with --no-embed-source).

Install

brew install russmckendrick/tap/terminal-svg   # or: brew upgrade terminal-svg

Or grab a binary below (macOS arm64/amd64, Linux arm64/amd64, Windows amd64 — each with a SHA-256 checksum). rec is macOS/Linux only for now; rendering .cast files works everywhere.

Quick start

# re-theme an SVG you shipped months ago — no .cast needed
terminal-svg demo.svg -t github-dark -o demo-dark.svg

# get the recording back out of it
terminal-svg extract demo.svg -o demo.cast

# scrub a leaked token and tighten the pauses, without re-recording
terminal-svg edit demo.cast --redact 'ghp_\w+' --max-pause 1.5 -o clean.cast

# or just open it in the browser and fiddle
terminal-svg editor demo.cast

Docs: README · CLI reference · theme format · how it works

Bundled JetBrainsMono Nerd Font faces are under the SIL OFL; the code is MIT.

Full Changelog: https://github.com/russmckendrick/terminal-svg/compare/v0.4.0...v0.5.0

v0.4.0

v0.4.0 — Animated demos go light and dark

The dual-theme trick from v0.3.0 — one SVG carrying a light and a dark palette, switched by the viewer's prefers-color-scheme — now works for animated recordings too. One set of frames serves both palettes, so the dual file below costs 22 bytes more than its single-theme twin. If you're reading this in GitHub's dark mode it's already dark; flip your theme and it follows.

Animated dual-theme demo

Highlights

  • Animated dual-theme--theme-light github-light --theme-dark github-dark now works for .cast inputs and rec sessions, not just stills. Frames are rendered once with palette classes and the colours live in a CSS block per theme, so a dual animation is ~100% the size of a single-theme one instead of double.
  • asciicast v3 — recordings from asciinema 3.0 load directly (v2 keeps working). v3 files embed the recording terminal's colours, so -t auto renders a session with the palette of the terminal it was recorded in.
  • Trim the replay--from 12 --to 31 animates just a slice of a recording. The first frame opens on the screen as of --from, so the lead-in is skipped, not fast-forwarded.
  • Cursor styles and reduced motion--cursor <block|bar|underline|none> picks the cursor shape, and every animated SVG now respects prefers-reduced-motion by showing the final frame as a still poster.
  • Completions, man page, config fileterminal-svg --completions zsh (and bash/fish/elvish/powershell), a generated man page, and personal defaults in ~/.config/terminal-svg/config.toml — flags always beat the config, and typo'd keys fail loudly instead of silently doing nothing.
  • A --help worth reading — flags are grouped into the same sections as the docs (Output & themes, Window, Layout & fonts, Capture, Animation) with human value names and a set of examples at the bottom.

Existing invocations all keep working. Rendered output is unchanged apart from animated SVGs gaining the reduced-motion CSS block.

Install

brew install russmckendrick/tap/terminal-svg   # or: brew upgrade terminal-svg

Or grab a binary below (macOS arm64/amd64, Linux arm64/amd64, Windows amd64 — each with a SHA-256 checksum). rec is macOS/Linux only for now; rendering .cast files works everywhere.

Quick start

# an animated README demo that follows the viewer's light/dark mode
terminal-svg demo.cast --theme-light github-light --theme-dark github-dark

# render an asciinema 3 recording with its own terminal's colours
terminal-svg session.cast -t auto

# animate just the good bit
terminal-svg demo.cast --from 12 --to 31 -o highlight.svg

Docs: README · CLI reference · theme format · how it works

Bundled JetBrainsMono Nerd Font faces are under the SIL OFL; the code is MIT.

Full Changelog: https://github.com/russmckendrick/terminal-svg/compare/v0.3.0...v0.4.0

v0.3.0

v0.3.0 — Windows and Ubuntu get windows

terminal-svg screenshots no longer have to pretend they were taken on a Mac. A new --chrome flag dresses the window as a classic Windows PowerShell console or an Ubuntu GNOME Terminal, each with a matching built-in theme — and the macOS chrome was retuned to real-window proportions while we were at it. Both images below are terminal-svg's own output.

Windows PowerShell chrome Ubuntu GNOME Terminal chrome

Highlights

  • --chrome <macos|windows|ubuntu|none> — Windows renders the classic conhost console (white title bar, window icon, square corners, scrollbar gutter); Ubuntu renders GNOME Terminal's Ambiance look (dark header, orange close button, menu bar). Pair them with the two new built-in themes — powershell (conhost navy + the Campbell palette) and ubuntu (aubergine + Tango) — bringing the built-ins to nine.
  • A more honest macOS window — 32 px title bar, true 12 px traffic lights, a fixed 12 px title in the system sans. Chrome is now fixed-size like a real window and no longer scales with --font-size.
  • Light and dark in one file--theme-light github-light --theme-dark github-dark emits a single static SVG carrying both palettes, switched by the viewer's prefers-color-scheme. One <img> tag, correct in both GitHub modes.
  • Titles sort themselves out — with no --title, the window title falls back to the recording's own title, then the last OSC 0/2 report from your shell — shown Ghostty-style as 📁 ~/Code/blog — then the command string. --title-emoji swaps or drops the emoji.
  • Freeze-frames and transparency--at <seconds> renders the screen at any point in a recording; --no-background drops the window body, chrome, and shadow for a transparent floating-text embed.
  • Themes can restyle the chrome — optional [chrome] keys (bar_bg, bar_fg, button_fg, button_bg) recolour the new title bars straight from your theme TOML.

There's also a new home: terminal-svg.dev — a showcase site with a gallery of every theme rendered in its native chrome, built from the repo and deployed on every release.

Existing invocations all keep working; the macOS chrome retune does change rendered output — deliberately, it has real proportions now.

Install

brew install russmckendrick/tap/terminal-svg

Or grab a binary below (macOS arm64/amd64, Linux arm64/amd64, Windows amd64 — each with a SHA-256 checksum). rec is macOS/Linux only for now; rendering .cast files works everywhere.

Quick start

terminal-svg --chrome windows -t powershell -- pwsh -c 'Get-ChildItem'
terminal-svg --chrome ubuntu -t ubuntu -- lsd -la
terminal-svg demo.cast --static --theme-light github-light --theme-dark github-dark

Docs: README · theme format · how it works

Bundled JetBrainsMono Nerd Font faces are under the SIL OFL; the code is MIT.

Full Changelog: https://github.com/russmckendrick/terminal-svg/compare/v0.2.0...v0.3.0

v0.2.0

v0.2.0 — record it, replay it, embed it

terminal-svg can now record. Run terminal-svg rec, do your thing, exit the shell — and out comes an animated SVG replaying the whole session: GIF-quality demos at a fraction of the size, with real selectable text, that play anywhere an <img> tag does. GitHub READMEs included, no JavaScript. The image below is one — 42 KB, font embedded.

animated terminal-svg demo

Highlights

  • terminal-svg rec — records a live interactive session (your $SHELL, or rec -- <command>) on a real PTY at your current terminal size, keystrokes forwarded, window resizes captured. Exit the session and the animated SVG is rendered on the spot.
  • asciicast v2 in and out — every recording is saved as a standard asciicast next to the SVG (asciinema play demo.cast just works), and any .cast file renders directly: re-theme or re-time a take without re-recording, or render recordings you already made with asciinema (terminal-svg session.cast -t github-dark).
  • Replays that stay small — output bursts coalesce to ≤30 fps, pauses are capped at 2 s (--idle-time-limit), identical frames are dropped, and repeated rows are shared across frames via <defs>/<use>. A 120-line scrolling build log lands around 130 KB — font included.
  • Plays everywhere — frames are toggled by plain CSS keyframes with step-end timing inside the SVG itself: crisp discrete frames, no cross-fading, no scripts, loops forever with a hold on the last frame. --speed to taste, --no-loop to play once and freeze, --static for just the final screen.
  • The details still matter — a soft block cursor tracks the session, carriage-return progress bars and spinners replay exactly as they ran, mid-session window resizes grow the canvas, and per-frame font subsetting covers every glyph the whole recording touches.

Everything from 0.1.0 is untouched: the static screenshot CLI is byte-for-byte compatible, golden-tested to prove it.

Install

brew install russmckendrick/tap/terminal-svg

Or grab a binary below (macOS arm64/amd64, Linux arm64/amd64, Windows amd64 — each with a SHA-256 checksum). rec is macOS/Linux only for now; rendering .cast files works everywhere.

Quick start

terminal-svg rec -o demo.svg        # exit the shell to finish
terminal-svg demo.cast --speed 2 -t nord -o demo-nord.svg

Docs: README · theme format · how it works

Bundled JetBrainsMono Nerd Font faces are under the SIL OFL; the code is MIT.

Full Changelog: https://github.com/russmckendrick/terminal-svg/compare/v0.1.0...v0.2.0

v0.1.0

v0.1.0 — pixel-perfect terminal screenshots

The first release of terminal-svg — a single self-contained binary that turns terminal output into pixel-perfect SVG screenshots, complete with macOS-style window chrome. The image above is its own output.

Highlights

  • Three capture modes — run a command in a real PTY (terminal-svg -- lsd -la), pipe ANSI through stdin, or render a captured dump file.
  • Real terminal emulation — output goes through a proper VT state machine (asciinema's avt), so carriage-return progress bars, ESC[K clears, and cursor-repaint spinners resolve to exactly the final screen — no regex-stripped artefacts.
  • Embedded font subsetting — only the glyphs you actually used are embedded as WOFF2 (typically a few KB), so the SVG renders identically everywhere: GitHub READMEs, blogs, machines with no fonts installed. Nerd Font powerline segments, box drawing, and wide CJK all align on the grid; emoji render through the viewer's native colour font.
  • Full ANSI fidelity — truecolor, 256-colour, the classic 16, bold/dim/italic/underline/strikethrough/inverse.
  • 7 built-in themesdracula (default), catppuccin-mocha, nord, tokyo-night, github-dark, github-light, solarized-dark — plus custom themes from a small TOML file.

Install

brew install russmckendrick/tap/terminal-svg

Or grab a binary below (macOS arm64/amd64, Linux arm64/amd64, Windows amd64 — each with a SHA-256 checksum).

Quick start

terminal-svg --title "the proof" -o shot.svg -- cargo test

Docs: README · theme format · how it works

Bundled JetBrainsMono Nerd Font faces are under the SIL OFL; the code is MIT.

Full Changelog: https://github.com/russmckendrick/terminal-svg/commits/v0.1.0

Full Changelog: https://github.com/russmckendrick/terminal-svg/commits/v0.1.0