Not in the top 1,000 by GitHub stars
haiderfarooq3/paper-reel
Claude Code skill: faceless 9:16 explainer reels in a cut-paper style. Voice-timed scenes, word-by-word captions. Free, local, no API keys.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 9c5bc57b5e10
No earlier version was observed for comparison.
skills/paper-reel/SKILL.md
Week of Nov 2, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → 9c5bc57b5e10
No earlier version was observed for comparison.
Heat
Insufficient historyNot enough history yet to measure heat. It appears after a few days of data.
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
- paper-reel
/ - paper-reel
skills/paper-reel
How it works
paper-reel
When your agent uses it
Make a faceless 9:16 explainer reel in the cut-paper 'Claude mascot' style (flat textured paper shapes, a terracotta box mascot with a hat per scene, a screwed header sign, a typing terminal bar, counter cards, rubber stamps, word-by-word paper caption chips, hard cuts on every voice line, a soft lo-fi bed) — fully free and local: Kokoro voice, whisper.cpp word timing, canvas + Playwright + ffmpeg. Use when the user asks for a reel/short/TikTok in this paper or Claude-mascot style, a 'skill checkpoint'/tool-spotlight reel, or a faceless explainer with a comment-keyword CTA.
What it loads into context
Frontmatter
166 tokensAlways available to the agent
SKILL.md
2,435 tokensWhen the skill is activated
Reference documents
2,284 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 0. Setup check
- 1. Script (approve with the user before drawing)
- 2. Voice + timing
- 3. Scenes
- 4. Check, then export
- 5. Deliver
- Kit API (styles/paper-reel/kit.js)
- Gotchas
Scripts executed separately
bin/reelexamples/khan-skill/src/bridges.jsexamples/khan-skill/src/scenes.jsexamples/khan-skill/src/score.jskit/board.jskit/core.jskit/morph.jskit/score-head.jskit/score-tail.jspackage.jsonstyles/paper-reel/kit.jstemplates/starter/src/bridges.jstemplates/starter/src/scenes.jstemplates/starter/src/score.jstools/align.mjstools/build.mjstools/export.mjstools/gpu.mjstools/kokoro_lines.pytools/still.mjstools/storyboard.mjstools/textcheck.mjstools/tile.mjstools/voice.mjs
Files
.github/workflows/render.ymlasset831 bytes.gitignoreasset87 bytesLICENSEasset1,070 bytesNOTICE.mddoc1,717 bytesREADME.mddoc3,736 bytesSKILL.mdcore8,208 bytesSKILL.mdcore8,208 bytesbin/reelruns5,144 bytesdocs/demo.mp4asset2,187,756 bytesdocs/strip.jpgasset485,535 bytesexamples/khan-skill/piece.jsonasset419 bytesexamples/khan-skill/src/bridges.jsruns161 bytesexamples/khan-skill/src/head.htmlasset3,431 bytesexamples/khan-skill/src/scenes.jsruns21,628 bytesexamples/khan-skill/src/score.jsruns2,467 bytesexamples/khan-skill/voice.jsonasset6,713 bytesexamples/khan-skill/voice/catch.wavasset182,316 bytesexamples/khan-skill/voice/cta.wavasset84,012 bytesexamples/khan-skill/voice/draw.wavasset157,740 bytesexamples/khan-skill/voice/free.wavasset170,028 bytesexamples/khan-skill/voice/hook.wavasset189,484 bytesexamples/khan-skill/voice/repo.wavasset173,100 bytesexamples/khan-skill/voice/script.jsonasset1,039 bytesexamples/khan-skill/voice/sync.wavasset149,548 bytesexamples/khan-skill/voice/voice.wavasset2,232,428 byteskit/board.jsruns2,583 byteskit/core.jsruns28,964 byteskit/morph.jsruns9,520 byteskit/score-head.jsruns11,474 byteskit/score-tail.jsruns2,366 bytespackage-lock.jsonasset1,633 bytespackage.jsonruns145 bytesreferences/style.mddoc2,508 bytesstyles/paper-reel/kit.jsruns29,315 bytestemplates/starter/piece.jsonasset376 bytestemplates/starter/src/bridges.jsruns154 bytestemplates/starter/src/head.htmlasset1,751 bytestemplates/starter/src/scenes.jsruns8,188 bytestemplates/starter/src/score.jsruns1,652 bytestemplates/starter/voice/script.jsonasset658 bytestools/align.mjsruns2,721 bytestools/build.mjsruns7,751 bytestools/export.mjsruns15,576 bytestools/gpu.mjsruns1,531 bytestools/kokoro_lines.pyruns1,881 bytestools/still.mjsruns2,592 bytestools/storyboard.mjsruns2,191 bytestools/textcheck.mjsruns8,698 bytestools/tile.mjsruns3,503 bytestools/voice.mjsruns7,939 bytes
Read SKILL.md
# paper-reel
You make 18–25s vertical reels drawn entirely in code. The voice is the clock: every spoken line is one scene, and props, stamps and counters land on the words that name them. No paid APIs, no API keys.
Everything runs through `bin/reel` in this skill folder (call it `REEL=<this skill dir>/bin/reel`). The pieces live in the user's project, e.g. `<project>/pieces/<name>/`.
## 0. Setup check
`$REEL doctor` checks node, ffmpeg, Playwright and Chromium, whisper-cli and its model, Kokoro (Python and model), and the fonts. Run it first. It prints the exact install command for anything missing; tell the user that command and stop until it's fixed.
## 1. Script (approve with the user before drawing)
6–8 lines, 18–25s total, about 3.5 words/s. The proven arc:
1. **Hook:** what it is plus the payoff in one line ("This free Claude skill turns any topic into a Khan Academy style video.")
2. **How it works,** 2–3 lines, one concrete step each.
3. **The catch:** one honest limitation (it builds trust).View the complete source on GitHubpaper-reel
When your agent uses it
Make a faceless 9:16 explainer reel in the cut-paper 'Claude mascot' style (flat textured paper shapes, a terracotta box mascot with a hat per scene, a screwed header sign, a typing terminal bar, counter cards, rubber stamps, word-by-word paper caption chips, hard cuts on every voice line, a soft lo-fi bed) — fully free and local: Kokoro voice, whisper.cpp word timing, canvas + Playwright + ffmpeg. Use when the user asks for a reel/short/TikTok in this paper or Claude-mascot style, a 'skill checkpoint'/tool-spotlight reel, or a faceless explainer with a comment-keyword CTA.
What it loads into context
Frontmatter
166 tokensAlways available to the agent
SKILL.md
2,435 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 0. Setup check
- 1. Script (approve with the user before drawing)
- 2. Voice + timing
- 3. Scenes
- 4. Check, then export
- 5. Deliver
- Kit API (styles/paper-reel/kit.js)
- Gotchas
Scripts executed separately
../../bin/reel../../tools/align.mjs../../tools/kokoro_lines.py
Files
../../bin/reelruns5,144 bytesSKILL.mdcore8,208 bytesSKILL.mdcore8,208 bytes../../tools/align.mjsruns2,721 bytes../../tools/kokoro_lines.pyruns1,881 bytes
Read SKILL.md
# paper-reel
You make 18–25s vertical reels drawn entirely in code. The voice is the clock: every spoken line is one scene, and props, stamps and counters land on the words that name them. No paid APIs, no API keys.
Everything runs through `bin/reel` in this skill folder (call it `REEL=<this skill dir>/bin/reel`). The pieces live in the user's project, e.g. `<project>/pieces/<name>/`.
## 0. Setup check
`$REEL doctor` checks node, ffmpeg, Playwright and Chromium, whisper-cli and its model, Kokoro (Python and model), and the fonts. Run it first. It prints the exact install command for anything missing; tell the user that command and stop until it's fixed.
## 1. Script (approve with the user before drawing)
6–8 lines, 18–25s total, about 3.5 words/s. The proven arc:
1. **Hook:** what it is plus the payoff in one line ("This free Claude skill turns any topic into a Khan Academy style video.")
2. **How it works,** 2–3 lines, one concrete step each.
3. **The catch:** one honest limitation (it builds trust).View the complete source on GitHubSkills included
- paper-reel
- paper-reel
Repository facts
- License
- MIT
- Created
- Oct 23, 2026
- Last pushed
- Oct 27, 2026
- Forks
- 12
- Open issues
- 1
- Project activity
- Active
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 6, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 2 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedskills/paper-reel/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 4 dangerous shell commandsin 1 file: bin/reel:25
- 25 network referencesin 4 files: bin/reel:30 package-lock.json:12 README.md:7 and 1 more
- No hidden or obfuscated text
- No instruction overrides
- 27 executable scriptsin 24 files: bin/reel:1 tools/align.mjs:1 tools/kokoro_lines.py:1 and 21 more
- 2 references to secretsin 1 file: tools/kokoro_lines.py:20
- No requests to vote in Hot
Show all 58 signals by file
NOTICE.md
- Network accessline 3
`kit/` (core.js, morph.js, board.js, score-head.js, score-tail.js) and `tools/` (build, still, tile, textcheck, export, gpu, voice, storyboard) are vendored from **animate** by cth9191 (https://github.com/cth9191/animate), MIT License. `too
README.md
- Network accessline 7
**[Watch the example reel](docs/demo.mp4)** (23 s, made with this skill, about the [khan-explainer](https://github.com/haiderfarooq3/khan-explainer) skill). - Network accessline 9
Write-up: [paper-reel: a free Claude Code skill that draws cut-paper explainer reels from one prompt](https://haiderfarooq.dev/blog/paper-reel-explainer-reels-in-code). How the skill explains itself, on YouTube: [wide cut](https://youtu.be/ - Network accessline 33
git clone https://github.com/haiderfarooq3/paper-reel ~/.claude/skills/paper-reel - Network accessline 67
Made by [Haider Farooq](https://github.com/haiderfarooq3). MIT licensed. - Network accessline 69
The renderer, frame tools and kit core are vendored from [animate](https://github.com/cth9191/animate) by cth9191 (MIT). See [NOTICE.md](NOTICE.md).
bin/reel
- Executable scriptline 1
#!/usr/bin/env bash - Executable scriptline 1
#!/usr/bin/env bash - Dangerous shell operationline 25
ok=1; c() { if eval "$2" >/dev/null 2>&1; then echo " ok $1"; else echo " MISSING $1 -> $3"; ok=0; fi; } - Dangerous shell operationline 25
ok=1; c() { if eval "$2" >/dev/null 2>&1; then echo " ok $1"; else echo " MISSING $1 -> $3"; ok=0; fi; } - Network accessline 30
c "chromium" "node -e \"const fs=require('fs');process.exit(fs.existsSync(require('playwright').chromium.executablePath())?0:1)\"" "cd '$SKILL' && npx playwright install chromium" c "whisper-cli" "command -v whisper-c - Network accessline 30
c "chromium" "node -e \"const fs=require('fs');process.exit(fs.existsSync(require('playwright').chromium.executablePath())?0:1)\"" "cd '$SKILL' && npx playwright install chromium" c "whisper-cli" "command -v whisper-c - Network accessline 31
c "whisper-cli" "command -v whisper-cli" "brew install whisper-cpp" c "whisper model" "test -f '$WHISPER_MODEL'" "mkdir -p ~/.cache/whisper && curl -L -o ~/.cache/whisper/ggml-base.en.bin https://huggingface.co/ggerganov/w - Network accessline 31
c "whisper-cli" "command -v whisper-cli" "brew install whisper-cpp" c "whisper model" "test -f '$WHISPER_MODEL'" "mkdir -p ~/.cache/whisper && curl -L -o ~/.cache/whisper/ggml-base.en.bin https://huggingface.co/ggerganov/w - Network accessline 32
c "whisper model" "test -f '$WHISPER_MODEL'" "mkdir -p ~/.cache/whisper && curl -L -o ~/.cache/whisper/ggml-base.en.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin" - Network accessline 32
c "whisper model" "test -f '$WHISPER_MODEL'" "mkdir -p ~/.cache/whisper && curl -L -o ~/.cache/whisper/ggml-base.en.bin https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin" - Network accessline 33
c "kokoro python ($KOKORO_PY)" "'$KOKORO_PY' -c 'import kokoro_onnx, soundfile, espeakng_loader'" "python3 -m venv ~/.venvs/kokoro && ~/.venvs/kokoro/bin/pip install kokoro-onnx soundfile (or set KOKORO_PY to a python that has them)" c - Network accessline 33
c "kokoro python ($KOKORO_PY)" "'$KOKORO_PY' -c 'import kokoro_onnx, soundfile, espeakng_loader'" "python3 -m venv ~/.venvs/kokoro && ~/.venvs/kokoro/bin/pip install kokoro-onnx soundfile (or set KOKORO_PY to a python that has them)" c - Network accessline 34
c "kokoro model" "test -f '$KOKORO_DIR/models/kokoro-v1.0.onnx' -a -f '$KOKORO_DIR/voices/voices-v1.0.bin'" "mkdir -p $KOKORO_DIR/models $KOKORO_DIR/voices && curl -L -o $KOKORO_DIR/models/kokoro-v1.0.onnx https://github.com/thewh1te - Network accessline 34
c "kokoro model" "test -f '$KOKORO_DIR/models/kokoro-v1.0.onnx' -a -f '$KOKORO_DIR/voices/voices-v1.0.bin'" "mkdir -p $KOKORO_DIR/models $KOKORO_DIR/voices && curl -L -o $KOKORO_DIR/models/kokoro-v1.0.onnx https://github.com/thewh1te - Dangerous shell operationline 53
rm -rf "$p/frames" - Dangerous shell operationline 53
rm -rf "$p/frames"
examples/khan-skill/src/bridges.js
- Executable scriptline 1
Executable file
examples/khan-skill/src/scenes.js
- Executable scriptline 1
Executable file
examples/khan-skill/src/score.js
- Executable scriptline 1
Executable file
kit/board.js
- Executable scriptline 1
Executable file
kit/core.js
- Executable scriptline 1
Executable file
kit/morph.js
- Executable scriptline 1
Executable file
kit/score-head.js
- Executable scriptline 1
Executable file
kit/score-tail.js
- Executable scriptline 1
Executable file
package-lock.json
- Network accessline 12
"node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 13
"version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - Network accessline 14
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - Network accessline 26
"node_modules/playwright": { "version": "1.58.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.0.tgz", - Network accessline 27
"version": "1.58.0", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.0.tgz", "integrity": "sha512-2SVA0sbPktiIY/MCOPX8e86ehA/e+tDNq+e5Y8qjKYti2Z/JG7xnronT/TXTIkKbYGWlCbuucZ6dziEgkoEjQQ==", - Network accessline 28
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.0.tgz", - Network accessline 44
"node_modules/playwright-core": { "version": "1.58.0", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.0.tgz", - Network accessline 45
"version": "1.58.0", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.0.tgz", "integrity": "sha512-aaoB1RWrdNi3//rOeKuMiS65UCcgOVljU46At6eFcOFPFHWtd2weHRRow6z/n+Lec0Lvu0k9ZPKJSjPugikirw==", - Network accessline 46
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.0.tgz",
package.json
- Executable scriptline 1
Executable file
styles/paper-reel/kit.js
- Executable scriptline 1
Executable file
templates/starter/src/bridges.js
- Executable scriptline 1
Executable file
templates/starter/src/scenes.js
- Executable scriptline 1
Executable file
templates/starter/src/score.js
- Executable scriptline 1
Executable file
tools/build.mjs
- Executable scriptline 1
#!/usr/bin/env node
tools/export.mjs
- Executable scriptline 1
#!/usr/bin/env node
tools/gpu.mjs
- Executable scriptline 1
Executable file
tools/kokoro_lines.py
tools/still.mjs
- Executable scriptline 1
#!/usr/bin/env node
tools/storyboard.mjs
- Executable scriptline 1
Executable file
tools/textcheck.mjs
- Executable scriptline 1
#!/usr/bin/env node
tools/tile.mjs
- Executable scriptline 1
Executable file
tools/voice.mjs
- Executable scriptline 1
#!/usr/bin/env node
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 1 fact
- Contacts huggingface.co, which SKILL.md, the README and the plugin manifest do not mentionbin/reel:32High confidence
Signal confidence: 49 facts
- Network access in prose of documentationNOTICE.md:3Low confidence
- Network access in prose of documentationREADME.md:7Low confidence
- Network access in prose of documentationREADME.md:9Low confidence
- Network access in code of documentationREADME.md:33Low confidence
- Network access in prose of documentationREADME.md:67Low confidence
- Network access in prose of documentationREADME.md:69Low confidence
- Executable script in code of a file that runsbin/reel:1High confidence
- Executable script in code of a file that runsbin/reel:1High confidence
- Dangerous shell operation in code of a file that runsbin/reel:25High confidence
- Dangerous shell operation in code of a file that runsbin/reel:25High confidence
- Network access in code of a file that runsbin/reel:30High confidence
- Network access in code of a file that runsbin/reel:30High confidence
- Network access in code of a file that runsbin/reel:31High confidence
- Network access in code of a file that runsbin/reel:31High confidence
- Network access in code of a file that runsbin/reel:32High confidence
- Network access in code of a file that runsbin/reel:32High confidence
- Network access in code of a file that runsbin/reel:33High confidence
- Network access in code of a file that runsbin/reel:33High confidence
- Network access in code of a file that runsbin/reel:34High confidence
- Network access in code of a file that runsbin/reel:34High confidence
- Dangerous shell operation in code of a file that runsbin/reel:53High confidence
- Dangerous shell operation in code of a file that runsbin/reel:53High confidence
- Executable script in a comment of a file that runsexamples/khan-skill/src/bridges.js:1Low confidence
- Executable script in code of a file that runsexamples/khan-skill/src/scenes.js:1High confidence
- Executable script in code of a file that runsexamples/khan-skill/src/score.js:1High confidence
- Executable script in code of a file that runskit/board.js:1High confidence
- Executable script in a comment of a file that runskit/core.js:1Low confidence
- Executable script in code of a file that runskit/morph.js:1High confidence
- Executable script in a comment of a file that runskit/score-head.js:1Low confidence
- Executable script in a comment of a file that runskit/score-tail.js:1Low confidence
- Executable script in code of a file that runspackage.json:1High confidence
- Executable script in a comment of a file that runsstyles/paper-reel/kit.js:1Low confidence
- Executable script in a comment of a file that runstemplates/starter/src/bridges.js:1Low confidence
- Executable script in code of a file that runstemplates/starter/src/scenes.js:1High confidence
- Executable script in a comment of a file that runstemplates/starter/src/score.js:1Low confidence
- Executable script in a comment of a file that runstools/align.mjs:1Low confidence
- Executable script in a comment of a file that runstools/align.mjs:1Low confidence
- Executable script in code of a file that runstools/build.mjs:1High confidence
- Executable script in code of a file that runstools/export.mjs:1High confidence
- Executable script in a comment of a file that runstools/gpu.mjs:1Low confidence
- Executable script in prose of a file that runstools/kokoro_lines.py:1Low confidence
- Executable script in prose of a file that runstools/kokoro_lines.py:1Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuetools/kokoro_lines.py:20Low confidence
- Access to secrets in code of a file that runs: a variable, placeholder or call, not a stored valuetools/kokoro_lines.py:20Low confidence
- Executable script in code of a file that runstools/still.mjs:1High confidence
- Executable script in a comment of a file that runstools/storyboard.mjs:1Low confidence
- Executable script in code of a file that runstools/textcheck.mjs:1High confidence
- Executable script in a comment of a file that runstools/tile.mjs:1Low confidence
- Executable script in code of a file that runstools/voice.mjs:1High confidence
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Frontmatter field argument-hint in SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.