← ClaudeAtlas

vhs-cli-demoslisted

Generate deterministic screenshots and demo GIFs of command-line and terminal (TUI) applications using Charm VHS. Use this skill whenever the user wants to capture, record, screenshot, or make a GIF/video of a CLI or terminal app — for a README, docs site, marketing page, changelog, release notes, or visual regression tests. Trigger on phrases like "record a gif of my CLI", "demo gif for the README", "screenshot my terminal app", "capture the TUI", "make a terminal recording", "VHS tape", "charm vhs", "asciinema but as a gif", or any request to show a terminal program in motion or as a still — even when the user doesn't name VHS. Also use when a captured GIF is too large and needs to be shrunk for the web, or when setting up a repeatable capture pipeline for many scenes. Covers install, authoring tapes, determinism, motion-GIF storytelling, and the lossless size-optimization that makes GIFs web-viable.
gfargo/skills · ★ 0 · Web & Frontend · score 72
Install: claude install-skill gfargo/skills
# Capturing CLI & TUI apps with VHS [VHS](https://github.com/charmbracelet/vhs) (by Charm) drives a real PTY through a headless terminal and records exactly what a user would see — so captures are pixel-accurate, scriptable, and reproducible in CI. It's the right tool for README GIFs, docs/marketing stills, release demos, and terminal visual-regression tests. This skill is the methodology; it transfers to any CLI or TUI regardless of language (Go, Rust, Python, Node, a shell script — VHS only sees the terminal). The single most important thing to internalize: **a `.tape` is a screenplay, not a config file.** You're directing a short scene — what's typed, how long each beat holds, when the camera clicks. Two failure modes dominate, and both are covered below: captures that look *wrong* (loading spinners, drifting dates, empty state — a determinism problem) and GIFs that are *enormous* (10-20 MB — a file-size problem with a one-line lossless fix). ## The essentials (if you read nothing else) Three things separate a capture that ships from one that embarrasses you. Get these right and the rest is polish: 1. **Always optimize GIFs losslessly.** Raw VHS GIFs are 10-20 MB of redundant frames. Run `gifsicle -O3` (lossless, 20-30× smaller, zero quality loss) — via the bundled `scripts/optimize_gif.sh` — or bake it into your pipeline. Never ship a raw VHS GIF, and never reach for lossy compression as the default fix. 2. **Make it deterministic, and size it generously.**