charm-vhs
Skill5 starsChanged 8 months agoMITView on GitHub
MUST USE when writing, editing, or debugging Charmbracelet VHS `.tape` files for terminal demos. Covers scripted terminal recordings, timing, typing, screen layout, and producing GIF, MP4, or WebM demos from VHS tapes. Do NOT use for general shell scripting, live terminal automation without VHS, or browser and GUI recording tasks unless the output is a VHS-driven terminal demo.
In this repository15 other files it gives its agents.
- AGENTS.mdAGENTS.md
- cloud-foundation-fabricSkill
- d2Skill
- duckdbSkill
- github-profile-architectSkill
- jqSkill
- opencode-devSkill
- playwright-cliSkill
- skill-crawlerSkill
- skill-registry-syncSkill
- tech-writerSkill
- terminal-ui-engineerSkill
- terraformSkill
- worktrunkSkill
- writingSkill
The file
We split this skill into the rules it gives an agent
4 rules. About 0 are common, 1 is distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 43
When building shell commands with nested quotes, split across multiple Type lines:
- Very specific: line 92
Use Hide/Show to run setup commands (e.g.
- Very specific: line 104
Every
Typestring must be closed: before Sleep/Enter on the same line - Distinctive: line 106
Sleep durations: after commands should be long enough for the command to finish (network calls may need 8s+)
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
VHS Tape Files
VHS records terminal sessions into GIFs/MP4s/WebMs from .tape scripts. Run with vhs demo.tape.
Critical Syntax Rules
Type command and inline directives
Type, Sleep, Enter are separate directives on the same line, delimited by the closing " of the Type string. The most common bug is forgetting to close the Type string, which causes Sleep/Enter to be typed literally into the terminal.
# ✅ CORRECT — closing " before Sleep
Type "echo hello" Sleep 300ms Enter
# ❌ WRONG — Sleep and Enter are typed as literal text
Type "echo hello Sleep 300ms EnterType with @speed override
Override typing speed per-command with @<time> immediately after Type (no space):
Type@80ms '{"pageSize": 2}' Sleep 100msQuoting
- Double quotes
"..."are the standard Type delimiter - Single quotes
'...'also work and are useful when the typed content contains double quotes (e.g. JSON) - Escape quotes inside strings with backticks:
Type `VAR="value"` - When building shell commands with nested quotes, split across multiple
Typelines:
Type "gws drive files list --params '" Sleep 100ms
Type@80ms '{"pageSize": 2, "fields": "nextPageToken,files(id)"}' Sleep 100ms
Type "' --page-all" Sleep 300ms EnterPitfall: Every
Typeline that is followed bySleeporEnteron the same line MUST close its string first. Audit each line to ensure the quote is closed before any directive.
Settings (top of file only)
Settings must appear before any non-setting command (except Output). TypingSpeed is the only setting that can be changed mid-tape.
Output demo.gif
Set Shell "bash"
Set FontSize 14
Set Width 1200
Set Height 1200
Set Theme "Catppuccin Mocha"
Set WindowBar Colorful
Set WindowBarSize 40
Set TypingSpeed 40ms
Set Padding 20Common Commands
| Command | Example | Notes |
Output | Output demo.gif | .gif, .mp4, .webm |
Type | Type "ls -la" | Type characters |
Type@<time> | Type@80ms "slow" | Override typing speed |
Sleep | Sleep 2s, Sleep 300ms | Pause recording |
Enter | Enter | Press enter |
Hide / Show | Hide ... Show | Hide setup commands |
Ctrl+<key> | Ctrl+C | Key combos |
Tab, Space, Backspace | Tab 2 | Optional repeat count |
Up, Down, Left, Right | Up 3 | Arrow keys |
Wait | Wait /pattern/ | Wait for regex on screen |
Screenshot | Screenshot out.png | Capture frame |
Env | Env FOO "bar" | Set env var |
Source | Source other.tape | Include another tape |
Require | Require jq | Assert program exists |
Hide/Show for Setup
Use Hide/Show to run setup commands (e.g. setting $PATH, clearing screen) without recording them:
Hide
Type "export PATH=$PWD/target/release:$PATH" Enter
Type "clear" Enter
Sleep 2s
ShowChecklist When Editing Tape Files
- Every
Typestring must be closed beforeSleep/Enteron the same line - Multi-line Type sequences that build a single shell command: ensure the final line closes its string and includes
Enter - Sleep durations after commands should be long enough for the command to finish (network calls may need 8s+)
- Settings go at the top — only
TypingSpeedcan appear later - Test locally with
vhs <file>.tapebefore committing
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

