vhs
npx skills add https://github.com/marcfargas/skills --skill vhs
Agent 安装分布
Skill 文档
VHS â Terminal Recorder
VHS records terminal sessions from declarative .tape files.
Produces GIF, MP4, or WebM. No screen recording needed â deterministic and reproducible.
Install
scoop install vhs # Windows
brew install vhs # macOS
Requires ffmpeg (for video encoding). scoop install ffmpeg if missing.
Quick Start
# Create example tape
vhs new demo.tape
# Record
vhs demo.tape
# Validate without running
vhs validate demo.tape
# Publish to vhs.charm.sh (get shareable URL)
vhs publish demo.gif
Tape File Syntax
Output
Output demo.gif # GIF (default, best for READMEs)
Output demo.mp4 # MP4 video
Output demo.webm # WebM video
Multiple Output lines = multiple formats from one tape.
Settings
Set Shell "bash" # Shell to use
Set FontSize 14 # Font size (default 22 â too large for most)
Set FontFamily "JetBrains Mono" # Font family
Set Width 1200 # Terminal width in pixels
Set Height 600 # Terminal height in pixels
Set Padding 15 # Padding around terminal
Set TypingSpeed 50ms # Delay between keystrokes (default 50ms)
Set Theme "Dracula" # Color theme (see Themes below)
Set Framerate 30 # GIF framerate
Set PlaybackSpeed 1.0 # Playback speed multiplier
Set LoopOffset 80% # Where GIF loop restarts (% from end)
Set WindowBar "Colorful" # Window bar: Rings, RingsRight, Colorful, ColorfulRight
Set WindowBarSize 40 # Window bar height in pixels
Set BorderRadius 8 # Terminal border radius
Set MarginFill "#1a1a2e" # Background color outside terminal
Set Margin 20 # Margin size (needs MarginFill)
Commands
Type "echo hello" # Type characters
Type@100ms "slow typing" # Type with custom speed
Enter # Press Enter
Enter 3 # Press Enter 3 times
Sleep 2s # Wait 2 seconds
Sleep 500ms # Wait 500 milliseconds
# Special keys
Backspace 5 # Delete 5 chars
Tab # Tab completion
Ctrl+C # Interrupt
Ctrl+L # Clear screen
Up # Arrow up (history)
Down # Arrow down
Left 3 # Move cursor left 3
Right 3 # Move cursor right 3
Escape # Escape key
Space # Space key
PageUp # Page up
PageDown # Page down
# Visibility
Hide # Hide commands from output
Show # Show commands again
Require
Require git # Fail if git not in PATH
Require node
Windows: Use Set Shell "cmd"
VHS’s default bash resolves to WSL bash on Windows â a separate environment with no access to Windows-installed tools (node, scoop packages, etc.). Always use cmd on Windows:
Set Shell "cmd"
This gives VHS the full Windows PATH so all installed CLIs work.
Recommended Defaults
For README demos and documentation:
Output demo.gif
Set Shell "cmd" # Windows â use "bash" on Linux/macOS
Set FontSize 14
Set Width 1100
Set Height 600
Set Theme "Dracula"
Set TypingSpeed 30ms
Set Padding 15
Set WindowBar "Colorful"
Set BorderRadius 8
Patterns
Simple command showcase
Output demo.gif
Set Shell "bash"
Set FontSize 14
Set Width 1100
Set Height 600
Set Theme "Dracula"
Set TypingSpeed 30ms
Set Padding 15
Type "my-tool --help"
Enter
Sleep 3s
Type "my-tool run --input data.json"
Enter
Sleep 5s
Complex commands (use a wrapper script)
VHS tape files don’t support shell quoting well. For complex commands with quotes, pipes, or multi-line args, write a helper script:
# demo-run.sh
#!/bin/bash
echo "Running analysis..."
my-tool analyze --format json | jq '.results[] | .name'
Type "bash demo-run.sh"
Enter
Sleep 10s
Hide setup, show the interesting part
# Setup (hidden from recording)
Hide
Type "cd /tmp/demo-project"
Enter
Type "export DEMO_MODE=1"
Enter
Sleep 1s
Show
# Visible demo starts here
Type "my-tool init"
Enter
Sleep 3s
Before/after comparison
Type "# Before:"
Enter
Type "cat config.yaml"
Enter
Sleep 3s
Type "# After running fix:"
Enter
Type "my-tool fix config.yaml"
Enter
Sleep 3s
Type "cat config.yaml"
Enter
Sleep 3s
Recording live (interactive)
# Record your terminal actions into a tape file
vhs record > my-session.tape
# Then edit the tape to clean up timing, add sleeps, etc.
vhs my-session.tape
Recording TUI apps with holdpty
Use holdpty to record full-color TUI applications â apps that need a real PTY for colors, take time to start, or are already running. holdpty provides the PTY, VHS captures the output.
Why this matters:
- TUI apps (pi, htop, k9s, lazygit) need a real PTY for colors and layout
- Slow-starting apps (AI agents, servers) can be ready before recording begins
- Already-running processes can be recorded on demand for monitoring/sharing
The pattern:
# Step 1: Launch the app in holdpty (or it's already running)
holdpty launch --bg --name demo -- my-tui-app
# Step 2: Wait for it to be ready (or it already is)
sleep 5
# Step 3: Record with VHS
vhs record-demo.tape
# Step 4: Clean up (or leave it running)
holdpty stop demo
Tape file â attach to a running session:
Output demo.gif
Output demo.mp4
Set Shell "cmd"
Set FontSize 14
Set Width 1200
Set Height 700
Set Theme "Dracula"
Set Padding 15
Set WindowBar "Colorful"
Set BorderRadius 8
# Attach to the running holdpty session
Type "holdpty attach demo"
Enter
Sleep 2s
# Interact with the app (VHS types, app responds with full TUI)
Type "your input here"
Enter
Sleep 15s
Tape file â view-only snapshot of a running process:
Output snapshot.gif
Set Shell "cmd"
Set FontSize 14
Set Width 1200
Set Height 700
Set Theme "Dracula"
Set Padding 15
# View is read-only â just captures current output
Type "holdpty view demo"
Enter
Sleep 10s
Ctrl+C
Use cases:
- README demos â launch app, let it start, record the interesting part
- Monitoring snapshots â capture what a running service looks like right now
- Bug reports â record a live reproduction with full colors
- Agent recordings â capture an AI agent working with its full TUI (thinking indicators, tool calls, colored output)
On Windows, use
node.exe <path/to/cli.js>instead of CLI names when launching via holdpty â see the holdpty skill for the.cmdwrapper gotcha.
Themes
Popular themes for demos:
| Theme | Style |
|---|---|
Dracula |
Dark purple â high contrast, popular |
Catppuccin Mocha |
Dark warm â modern, easy on eyes |
Tokyo Night |
Dark blue â clean |
Nord |
Dark muted â professional |
Gruvbox Dark |
Dark warm/retro |
Solarized Dark |
Classic |
GitHub Dark |
Familiar to devs |
One Dark |
VS Code-like |
List all: vhs themes
Tips
- FontSize 14 â default 22 is way too large for most demos
- TypingSpeed 25-40ms â 50ms default feels slow; 25ms is snappy
- Sleep after Enter â always add
Sleepafter commands to let output render - Long commands â use wrapper scripts, VHS quoting is fragile
- GIF size â keep under 5MB for GitHub READMEs; reduce Framerate, Height, or duration
- Multiple outputs â one tape can produce
.gif+.mp4simultaneously - Publish â
vhs publish demo.gifgives a shareable URL on vhs.charm.sh - Validate first â
vhs validate demo.tapecatches syntax errors without recording
Gotchas
- Windows:
Set Shell "bash"uses WSL â VHS resolvesbashto WSL bash, not Git Bash. UseSet Shell "cmd"to get the full Windows PATH. Custom shell paths (Set Shell "C:/path/to/bash.exe") are rejected. - No shell expansion in Type â
Type "echo $HOME"types the literal string; variable expansion happens when bash executes it, not in the tape - Quoting â avoid nested quotes in Type. Use wrapper scripts for complex commands
- Windows paths â use forward slashes in Type strings (
C:/dev/...notC:\dev\...) - Long recordings â GIFs get huge fast. Keep demos under 30 seconds. Use
Set PlaybackSpeed 2.0to compress - Terminal size â if output wraps weird, increase Width or reduce FontSize
- TUI apps without holdpty â apps that need a real PTY for colors (pi, htop, lazygit) will render without colors if launched directly from VHS. Use the holdpty pattern above.