Turn any documentation URL into a 30-60 second tutorial video — using your own React components so the video looks like your actual product.
- One step per scene, short punchy narration
- Audio-visual sync powered by real ElevenLabs timestamps (not estimated)
- Content stays centered in a safe zone — no edge overflow
- Node.js v18+
- Claude Code CLI installed
- A React/Next.js project with reusable UI components
| Key | Required? | Free tier? | Get it at |
|---|---|---|---|
| Tabstack | Yes | 50k credits/month free | https://tabstack.ai/dashboard |
| ElevenLabs | Yes | Yes (TTS). Music needs paid plan. | https://elevenlabs.io |
Run this from your project root (where your package.json and src/ live):
cd /path/to/my-react-app
npx docs-to-video setupThis will:
- Copy
docs-to-video/into your project (MCP server, remotion template, skill) - Install MCP server dependencies
- Prompt for your API keys
- Register the MCP server in Claude Code (pointing to your project)
- Install the skill
Your project will look like:
my-react-app/
├── src/ ← your code
├── package.json
└── docs-to-video/ ← created by setup
├── mcp-server/ (MCP server + dependencies)
├── remotion-template/ (video scaffolding)
└── skill/ (SKILL.md)
Then restart Claude Code and run:
/docs-to-video https://docs.stripe.com/payments/quickstart
Important: Always start Claude Code from your project root so it can find your components and the
docs-to-video/directory.
If you use skills.sh, you can install the skill with:
npx skills add Bhonar/docs-to-videoThe first time you run /docs-to-video, Claude will automatically run npx docs-to-video setup to install the MCP server and dependencies.
If you prefer to clone the repo directly:
Go to the folder that contains your package.json and src/ — not inside src/:
cd /path/to/my-react-app # where package.json and src/ live
git clone https://github.com/Bhonar/docs-to-video.git docs-to-videoYour project should now look like:
my-react-app/
├── src/ ← your code
├── package.json
└── docs-to-video/ ← cloned here, next to src/
cd docs-to-video/mcp-server
npm install
npm run build
cd ../..Replace YOUR_TABSTACK_KEY and YOUR_ELEVENLABS_KEY with your actual keys:
cat > docs-to-video/mcp-server/.env << 'EOF'
TABSTACK_API_KEY=YOUR_TABSTACK_KEY
ELEVENLABS_API_KEY=YOUR_ELEVENLABS_KEY
EOFMake sure the file is saved with your actual keys before continuing.
Add the MCP server to your global Claude Code config (~/.claude/config.json).
If the file doesn't exist yet, create it. If it already has other servers, add docs-to-video to the existing mcpServers object.
# Run this from your project root (where docs-to-video/ lives)
node -e "
const path = require('path');
const fs = require('fs');
const serverPath = path.resolve('docs-to-video/mcp-server/dist/server.js');
const projectRoot = process.cwd();
if (!fs.existsSync(serverPath)) {
console.error('ERROR: Server not found at ' + serverPath);
console.error('Make sure you ran: cd docs-to-video/mcp-server && npm run build');
console.error('And that you are running this from your project root');
process.exit(1);
}
const configPath = path.join(require('os').homedir(), '.claude', 'config.json');
const config = fs.existsSync(configPath) ? JSON.parse(fs.readFileSync(configPath, 'utf8')) : {};
config.mcpServers = config.mcpServers || {};
config.mcpServers['docs-to-video'] = {
command: 'node',
args: [serverPath],
cwd: projectRoot
};
fs.mkdirSync(path.dirname(configPath), { recursive: true });
fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
console.log('Written to', configPath);
console.log('Server:', serverPath);
console.log('Working directory:', projectRoot);
"If you see
ERROR: Server not found, make sure you're in the right directory and that you rannpm run buildin Step 2.
Claude Code expects each skill to be a directory containing a SKILL.md file:
mkdir -p ~/.claude/skills/docs-to-video
ln -s "$(pwd)/docs-to-video/skill/SKILL.md" ~/.claude/skills/docs-to-video/SKILL.mdRestart required — Claude Code loads skills and MCP servers at startup. If Claude Code is already running, quit and restart it.
Start Claude Code from your project root (not from inside docs-to-video/):
claudeClaude Code will prompt you to allow the MCP tools on first run — type y to approve them.
Then type:
/docs-to-video https://docs.stripe.com/payments/quickstart
-
Wrong skill structure — Claude Code expects a directory with
SKILL.mdinside, not a standalone file. Check with:ls -la ~/.claude/skills/docs-to-video/You should see
SKILL.md(symlink). If the structure is wrong, fix it:rm -rf ~/.claude/skills/docs-to-video ~/.claude/skills/docs-to-video.md mkdir -p ~/.claude/skills/docs-to-video ln -s "$(pwd)/docs-to-video/skill/SKILL.md" ~/.claude/skills/docs-to-video/SKILL.md
-
Symlink target doesn't resolve — the symlink must use an absolute path. Re-run the
ln -scommand from Step 5 while in your project root. -
Didn't restart Claude Code — skills are loaded at startup. Adding a skill mid-session won't work. Quit Claude Code and start it again.
-
Wrong directory — you must run
claudefrom your project root, not from insidedocs-to-video/.
- Stale
.mcp.json— If a previous test created a.mcp.jsonin your project with relative paths, delete it. The global~/.claude/config.json(set by Step 4) uses absolute paths and is more reliable. - Wrong working directory — Start Claude Code from your project root (where
docs-to-video/lives), not a parent directory. - Config points to wrong path — Re-run the Step 4 command from your project root to update with correct absolute paths. Check
~/.claude/config.jsonto verify. - Server not built — Run
cd docs-to-video/mcp-server && npm run build - Didn't restart Claude Code — MCP servers load at startup. Quit and restart after config changes.
- Check
ELEVENLABS_API_KEYis set indocs-to-video/mcp-server/.env(git clone) or~/.docs-to-video/.env(npm) - TTS (narration) works on the free tier
- Music requires a paid ElevenLabs plan — video renders with narration only if music fails
If you installed via npm:
cd /path/to/my-react-app # run from your project root
npx docs-to-video uninstall
rm -rf docs-to-video/ # remove the copied filesIf you installed via git clone:
rm -rf docs-to-video/
rm -rf ~/.claude/skills/docs-to-video
# Then remove the "docs-to-video" entry from ~/.claude/config.jsonThe /docs-to-video skill tells Claude to follow a 6-step workflow:
- Scan your codebase — finds your components (Button, Card, Badge, etc.), design tokens, and import paths
- Scaffold Remotion — sets up a
remotion/directory in your project if needed - Extract documentation — fetches the URL content, downloads logos, extracts branding colors
- Write narration & generate audio — writes a short script (1-2 sentences per step), generates TTS audio with real timestamps from ElevenLabs for precise audio-visual sync
- Build the video composition — writes
Generated.tsxusing your own components, with each step as its own scene inside a centeredSafeZonelayout - Validate & render — checks 29 quality rules (no crowded scenes, no numbered lists in a single scene, timecode sync, etc.) then renders to MP4