"Generate a 2D animated explainer video for any open-source project: MP4, GIF, and editable Remotion source. Use when the user wants to create a demo video, explainer video, or feature announcement video for their project."
Resources
13Install
npx skillscat add rubenglez/reelme Install via the SkillsCat registry.
reelme
Generate a 2D animated explainer video for any open-source project: MP4, GIF, and editable Remotion source.
Step 1: Determine mode
Ask the user one question before reading anything:
"Is this a project intro (explain what the project does) or a feature announcement (highlight what's new in a release)?"
Wait for the answer. This determines what to read and how to build the brief.
Step 2: Read the repo
For intro mode, read:
README.mdpackage.json/pyproject.toml/Cargo.toml/go.mod(whichever applies)- Up to 3 key source files (infer from the README or entry point)
Extract and hold in memory:
- name: project name
- tagline: one sentence describing what it does
- problem: the pain it solves (infer from README "why" sections, motivation, background)
- install_command: the primary install/get-started command
- repo_url: from package.json
repository, or leave blank - key_feature: the one thing that makes this project worth using
- code_example: a short, representative code snippet (5-15 lines max) showing the key feature
For announcement mode, read:
CHANGELOG.mdorCHANGELOG(if it exists)git log --oneline -20(to find the latest tag and recent commits)git diff <latest-tag>..HEAD --stat(to understand what changed)
Extract and hold in memory:
- name: project name (from package.json or git remote)
- version: latest tag or the version being announced (e.g.
v2.0.0) - headline: one punchy sentence: what's new ("Feature announcement mode and logo support")
- subtext: one sentence on why it matters
- key_change: the most important change: a code snippet, a command, or a description
- install_command: current install/upgrade command
- repo_url: from package.json
repository, or leave blank
Mark each field as confident or uncertain.
Step 3: Interview
Always ask (both modes):
- primary_color: "What's the project's primary brand color? (hex code, e.g. #6366f1)"
- logo: "Do you have a logo file? (optional; provide a path relative to the repo root, e.g.
assets/logo.png)"
Ask only if uncertain:
- For each uncertain field, ask a single, direct question. Pre-fill with your best guess.
Ask all questions at once in a single message. Use a numbered list. Keep it short.
Wait for the user's answers before proceeding.
Step 4: Build the brief
Write .reelme/brief.json to the repo root.
Intro mode shape:
{
"project": {
"name": "",
"tagline": "",
"problem": "",
"installCommand": "",
"repoUrl": "",
"primaryColor": "",
"tone": "professional",
"mode": "intro",
"logo": ""
},
"scenes": [
{
"type": "problem",
"headline": "",
"subtext": "",
"caption": ""
},
{
"type": "feature-list",
"headline": "",
"items": ["", ""],
"caption": ""
},
{
"type": "code-reveal",
"language": "",
"code": "",
"highlightLine": 1,
"caption": ""
},
{
"type": "terminal",
"commands": [
{ "input": "", "output": "" }
],
"caption": ""
},
{
"type": "data-flow",
"nodes": [
{ "id": "", "label": "" }
],
"edges": [
{ "from": "", "to": "", "label": "" }
],
"caption": ""
},
{
"type": "split",
"before": { "label": "", "content": "" },
"after": { "label": "", "content": "" },
"caption": ""
},
{
"type": "browser",
"url": "",
"image": "",
"caption": ""
},
{
"type": "stat-callout",
"headline": "",
"stats": [
{ "value": "", "label": "" }
],
"caption": ""
},
{
"type": "file-tree",
"headline": "",
"entries": [
{ "path": "", "type": "file", "highlight": false }
],
"caption": ""
},
{
"type": "mobile",
"title": "",
"image": "",
"caption": ""
},
{
"type": "cta",
"installCommand": "",
"repoUrl": "",
"caption": ""
}
]
}Announcement mode shape:
{
"project": {
"name": "",
"tagline": "",
"problem": "",
"installCommand": "",
"repoUrl": "",
"primaryColor": "",
"tone": "professional",
"mode": "announcement",
"version": "",
"logo": ""
},
"scenes": [
{
"type": "problem",
"headline": "",
"subtext": "",
"caption": ""
},
{
"type": "feature-list",
"headline": "",
"items": ["", ""],
"caption": ""
},
{
"type": "code-reveal",
"language": "",
"code": "",
"highlightLine": 1,
"caption": ""
},
{
"type": "terminal",
"commands": [
{ "input": "", "output": "" }
],
"caption": ""
},
{
"type": "split",
"before": { "label": "", "content": "" },
"after": { "label": "", "content": "" },
"caption": ""
},
{
"type": "stat-callout",
"headline": "",
"stats": [
{ "value": "", "label": "" }
],
"caption": ""
},
{
"type": "cta",
"installCommand": "",
"repoUrl": "",
"caption": ""
}
]
}Scene selection rules:
For intro:
- Always include
problemfirst andctalast. - Include
feature-listto enumerate what the project does (3–5 items max). - Include
code-revealif there is a good code example. - Include
terminalif the project is a CLI tool or the install/run flow is the main demo. - Include
data-flowif the project has a clear pipeline. - Include
splitif the core value is a before/after contrast (DX improvement, verbosity reduction, etc). - Include
browserif the project has a web UI or produces a visual output worth showing. - Include
stat-calloutif the project has compelling numbers (performance, adoption, reduction in code). - Include
file-treeif the project's structure or generated output is itself a selling point. - Include
mobileif the project is a mobile app or has a mobile UI. - The middle can have 1–3 scenes. Prefer fewer; clarity beats completeness.
For announcement:
- The
problemscene acts as the "what's new" opener. Headline = punchy release statement. Subtext = why it matters. - Do NOT use the pain-framing for
problem; use it as a release headline instead. - Include
feature-listif the release has multiple notable changes. - Include
code-revealif the key change is best shown as code. - Include
terminalif the key change is a new command or CLI flow. - Include
splitif the release fixes a pain point that's easy to show as before/after. - Include
stat-calloutif the release has measurable improvements (speed, size, lines of code). - Skip
data-flow,browser,file-tree, andmobileunless directly relevant to what changed. - Always end with
cta.
Captions: write a short caption (5-10 words) for each scene. Captions appear as a pill overlay near the bottom of the scene after the main animation settles. They reinforce the scene's point, not a description of what's shown, but the takeaway. Omit the caption field or leave it as "" to skip it for a scene.
Examples:
- problem → "Developers judge a project in seconds."
- code-reveal → "One command. One video."
- terminal → "Works in any repo, no config needed."
- data-flow → "Claude writes the brief. Remotion does the rest."
- cta → "Star it, share it, ship it."
Logo: if the user provided a logo path, set "logo": "<filename-only>" (e.g. "logo.png"). Leave as "" if none.
Step 5: Ask about gitignore
Tell the user: "I'll scaffold the Remotion project at .reelme/ in this repo. Do you want to keep it for future edits? If not, I'll add it to .gitignore."
Wait for their answer. If they say no (don't want to keep it), add .reelme/ to .gitignore after scaffolding. If yes, skip that step.
Step 6: Scaffold the Remotion project
Copy the template (excluding dev-only files):
SKILL_DIR=$(find "$HOME" -maxdepth 6 -name "SKILL.md" -path "*/reelme/SKILL.md" 2>/dev/null | head -1 | xargs dirname)
rsync -a \
--exclude='.gitignore' \
--exclude='src/__tests__' \
--exclude='src/brief.json' \
--exclude='src/showcase.json' \
--exclude='eslint.config.mjs' \
--exclude='vitest.config.ts' \
--exclude='out' \
--exclude='node_modules' \
--exclude='public/logo.svg' \
--exclude='public/.gitkeep' \
"$SKILL_DIR/template/" ".reelme/"Copy brief.json into the template:
cp .reelme/brief.json .reelme/src/brief.jsonIf the user provided a logo, copy it to the public/ directory:
cp <logo_path_in_repo> .reelme/public/<logo_filename>If the user chose not to keep the project for future edits, add it to .gitignore:
echo ".reelme/" >> .gitignoreInstall dependencies:
cd .reelme && pnpm install && pnpm approve-builds --allStep 7: Render
cd .reelme
pnpm renderThis produces:
.reelme/out/video.mp4.reelme/out/video.gif
Tell the user where to find the output files and mention they can edit .reelme/src/brief.json + re-run pnpm render to tweak without re-running the full interview.
Error handling
- If
pnpm installfails: check Node version (requires ≥18), suggestnvm use 20. - If
pnpm renderfails: show the last 30 lines of stderr and ask the user to share the error. - If a required field is still empty after the interview: ask one follow-up question rather than failing silently.
- If the logo file doesn't exist at the given path: warn the user and proceed without it (set
logoto"").