vhs — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited vhs (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
VHS records terminal sessions from declarative .tape files. Produces GIF, MP4, or WebM. No screen recording needed — deterministic and reproducible.
scoop install vhs # Windows
brew install vhs # macOSRequires ffmpeg (for video encoding). scoop install ffmpeg if missing.
# 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.gifOutput demo.gif # GIF (default, best for READMEs)
Output demo.mp4 # MP4 video
Output demo.webm # WebM videoMultiple Output lines = multiple formats from one tape.
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)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 againRequire git # Fail if git not in PATH
Require nodeSet 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.
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 8Output 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 5sVHS 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# 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 3sType "# 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# 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.tapeUse 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:
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 demoTape 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 15sTape 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+CUse cases:
On Windows, usenode.exe <path/to/cli.js>instead of CLI names when launching via holdpty — see the holdpty skill for the.cmdwrapper gotcha.
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
Sleep after commands to let output render.gif + .mp4 simultaneouslyvhs publish demo.gif gives a shareable URL on vhs.charm.shvhs validate demo.tape catches syntax errors without recordingbash to WSL bash, not Git Bash. Use Set Shell "cmd" to get the full Windows PATH. Custom shell paths (Set Shell "C:/path/to/bash.exe") are rejected.Type "echo $HOME" types the literal string; variable expansion happens when bash executes it, not in the tapeC:/dev/... not C:\dev\...)Set PlaybackSpeed 2.0 to compress~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.