vhs-cli-demoslisted
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.**