Turn a Topic into a Hand-Drawn Video whiteboard-video
Turn a topic into a hand-drawn whiteboard explainer with narration and subtitles, plus landscape and portrait covers, publishing copy and sources. Supports Claude Code and Codex; requires local tools and Volcengine TTS credentials.
Works with Claude Code · Codex
Requirements
- Node.js >=20.12
- FFmpeg
- Playwright Chromium
- Codex CLI
- Volcengine TTS
Overview
What you get
- A 1080p hand-drawn explainer with progressive drawing, narration and burned-in subtitles.
- Landscape and portrait covers, five candidate titles and platform-specific publishing copy.
- A source ledger and configurable branding, voice, subtitles and music.
Good fit
- Explaining structured concepts, comparisons and processes without appearing on camera.
- Producing a consistent series of short educational videos.
Not for
- Browser-only chat tools: the workflow needs local files and command execution.
- Automatic publishing or guaranteed audience growth; topics and output still need human review.
Tutorial
Turn an idea into a draw-as-you-talk video
Use whiteboard-video for an explainer, a product walkthrough or a process your customers find confusing. Here, you will make an episode about why plans are hard to stick to: show a large commitment becoming a small action someone can start, then apply the approach to your own subject.
Watch the demo above. Notice how a person, a label or an arrow appears as the narration introduces an idea. The aim is to show relationships as people hear the explanation, rather than put the entire script on screen.
The skill turns narration and scenes into drawing animations, speech, captions and a finished video. Your job is to decide who is watching, what they should understand and which example will make it concrete. First, get the tools running; then use those decisions to make your first episode.
1. Install the skill and its shared dependency
Use Claude Code or Codex with local file and command access. You need Node.js 20.12 or newer and FFmpeg. The repository reports testing on macOS. On Linux, address browser dependencies following Playwright’s messages; wb open relies on the macOS open command.
Check your existing tools in a terminal:
node --version # At least v20.12
ffmpeg -version # Video composition
ffprobe -version # Inspect the finished video
On macOS with Homebrew installed, brew install ffmpeg installs FFmpeg. Then fetch the repository and install its dependencies:
git clone https://github.com/trustfuture/simon-skills.git
cd simon-skills
# Codex: install the main skill and shared workflow as siblings
mkdir -p ~/.codex/skills
for s in whiteboard-video video-common; do
ln -sfn "$PWD/skills/$s" ~/.codex/skills/$s
done
cd skills/whiteboard-video
npm install # The postinstall script installs Chromium
cp .env.example .env
For Claude Code, replace every ~/.codex/skills above with ~/.claude/skills. Choose the installation for your host. video-common provides fact-checking, delivery checks and publishing review; installing only whiteboard-video leaves those references unavailable.
Run all following terminal commands from simon-skills/skills/whiteboard-video. Generating stickers also requires an installed, authenticated Codex CLI. The bundled example already includes stickers, so testing it does not require regenerating them.
2. Configure narration credentials
Open the copied .env and enter credentials from your Volcengine console. This shows the configuration shape; replace the placeholder before running:
# Newer console: use an API Key
VOLC_TTS_API_KEY=REPLACE_WITH_YOUR_API_KEY
# For the older console, fill these instead and leave API Key empty
VOLC_TTS_APP_ID=
VOLC_TTS_ACCESS_TOKEN=
# Official 2.0 voice: match the voice and resource IDs
VOLC_TTS_RESOURCE_ID=seed-tts-2.0
VOLC_TTS_VOICE=zh_male_liufei_uranus_bigtts
Official 2.0 voices use seed-tts-2.0; cloned voices beginning with S_ use volc.megatts.default. Check your console for voice availability and resource access. Keep credentials in your local configuration, not in topic instructions or publishing copy.
The bundled example uses Chinese narration. For an English script, choose a voice that supports the language in your console and test its pronunciation before rendering the full episode.
3. Render the bundled example first
Verify narration and rendering before asking the agent to create content. The example includes scenes, stickers and a cover function, helping you separate environment failures from content problems.
# Copy the complete example into the default projects directory
mkdir -p episodes
cp -R examples/* episodes/
# The title substring matches the bundled Chinese episode
bin/wb build 懂很多道理
build generates scenes, narration, drawing animation, mixing and covers, then cleans selected intermediate files. Runtime depends on your machine, network and narration cache. The author’s cached rendering times are not a first-run guarantee.
The default video path is build/<episode-directory>/outputs/final.mp4. The episode’s 旁白稿.md includes a link to it. 字幕.srt, 封面-4x3.png and 封面-3x4.png are in the episode project directory. Check narration, captions, drawing animation and the end card. Two cover aspect ratios do not imply that the video is automatically exported in both ratios.
4. Give the viewer one thing to take away
“Why plans fail” is a broad subject. This episode takes one angle: when a task feels too large, turn it into a specific action that is easy to start. This is a creative direction for the episode, not a diagnosis of every difficulty with motivation.
Complete this sentence: “After watching, viewers can turn ____ into ____.” Here, use “read for an hour every day” and “read two pages after dinner.” Concrete actions give you something to draw.
Send the following to Claude Code or Codex. These conversation examples are Editorial suggestions, not reproduction-tested through video generation. They are not the creator’s original prompts. Terminal commands are shown separately.
Use whiteboard-video for an episode about why plans are hard to stick to.
The audience is office workers who want to read after work but struggle to start.
Keep the tone plain and helpful, without lecturing.
Teach one idea: turn a vague, large commitment into a small action with a clear cue.
Use “read for an hour daily” becoming “read two pages after dinner” throughout.
Verify factual claims and record sources in README.md. Do not invent studies or success rates.
First show me the narration draft and a visual plan. Do not generate speech or render yet.
Read the narration on its own. It should make sense without the pictures. Once it does, choose visuals that help explain it. Starting with attractive illustrations can leave you with decoration that does little teaching.
5. Make the pictures explain the script
Writing “a big commitment” on screen is less useful than showing one. Draw a book beside a long block of time, then replace that block with two pages. The viewer can see what changed.
| Point in the narration | Visual support |
|---|---|
| Reading for an hour feels difficult after work | A person, a book and a time block labelled “one hour” |
| Start with two pages | Replace the time block with two pages and highlight “start” |
| Give the action a clear cue | Connect “dinner ends” to “open the book and read two pages” |
This mapping is the basis of the storyboard. Narration is split into beats with |, each paired with a group of visual elements. Every word does not need its own sticker.
Once you approve the draft, continue with:
Create the episode from the approved narration.
Write narration, scenes and covers in scenes.js.
Each visual group should show one relationship or change. Avoid paragraphs copied from the script.
Run scenes and stills, then show me the still frames before generating speech or the full video.
To create the project yourself, run the following in the skill directory. new creates a template; edit scenes.js before running the next two commands. Keep the Chinese project title here so that the selector in subsequent commands matches it:
bin/wb new "为什么定了计划总是坚持不下去"
bin/wb scenes 计划
bin/wb stills 计划
计划 is a title substring and must match only one episode. Use the full title if it is ambiguous. Still frames appear in build/<episode>/work/frames/. Without reading the script, can you identify what each image compares or changes? If all you see is a collection of stickers, reduce the elements or split the beat.
The canvas is 1920×1080. Reserve y≥960 for captions and the top-right 320×130 area for the watermark. Fix layout warnings in the source rather than shrinking all the text. scenes.js is the main hand-authored source; editing generated 旁白稿.md or 字幕.srt does not update it.
After approving the stills, ask the agent to generate speech and render, or run:
bin/wb build 计划
Play final.mp4 and focus on timing: does each visual arrive when it is mentioned? Does a diagram finish before the next point starts? Stills reveal layout problems; playback reveals pacing problems.
6. Change one part and follow its consequences
For your first revision, change only the example:
Replace “read two pages after dinner” with “read one article paragraph after lunch”.
Keep the explanation order and drawing style. First list what needs to change together.
Update the narration, the cue labels and the book/article visuals.
Update the cover too if it mentions the old example.
Show new stills first. After approval, regenerate speech and build the video.
This changes more than an image. The spoken example, the action on screen and any cover reference must agree. New narration also changes timestamps, so regenerate speech. Rendering pictures alone would pair the revised content with the old audio.
For a purely visual change, be specific: “Only reduce and reposition the character; keep the narration and timing.” Separating content changes from visual changes helps preserve the parts you already like. The commands below explain which stages to rerun.
Rerun the stages affected by your changes
Change the source or configuration before rerunning commands. Replace 计划 with your episode’s unique title substring.
| Change | Edit | Next commands |
|---|---|---|
| Narration or additional scenes | scenes.js | bin/wb build 计划 |
| Narration speed | tts.speed in config.json | bin/wb build 计划 |
| Visual layout or caption size | Scene source or caption configuration | bin/wb render 计划, then bin/wb mix 计划 |
| Music level | bgm.gain | bin/wb mix 计划 |
| Cover text or stickers | Cover function in scenes.js | bin/wb cover 计划 |
| Platform titles or publishing copy | 发布.md | No video rebuild |
For a music-only adjustment, try a temporary level multiplier:
bin/wb mix 计划 0.4 # Remix without regenerating speech or visuals
TTS caches audio using the text, voice and speed as part of the key. A speed change regenerates all narration. After replacing a sticker, inspect stills again; rebuild covers too if they use that sticker.
Apply the approach to your product or subject
Leave the reading example behind and fill in this brief. Choose one process the viewer needs to understand before listing the materials. An episode does not need every product feature.
Use whiteboard-video to make an explainer.
Audience: [who will watch and what they already know]
Takeaway: [one specific understanding or action]
Example: [one real situation to carry through the explanation]
Sequence: [problem → key change → result]
Available materials: [screenshots, real logos, sources; identify anything missing]
Visual priorities: [relationships, comparisons or steps to draw]
Voice and brand: [tone, brand name, colors and closing invitation]
Publishing needs: [platform, target duration, video aspect ratio; check tool support first]
Show narration and a visual plan first, then stills for approval, then speech and rendering.
For a booking product, “customer chooses a time → system checks availability → both parties receive confirmation” is easier to follow than a tour of every menu. Use genuine product logos, stickers for people and objects, and labels, boxes and arrows for the process. A screenshot on a hand-drawn background does not by itself explain how the product works.
Edit brand.name, brand.accent, brand.slogan and brand.endCard.cta in the existing config.json; use tts.speed for speech speed. Do not replace the entire configuration just to change branding. Music is not bundled: without assets/bgm.mp3, start with a video without background music.
Collect the finished video, both covers, publishing copy and sources. You or the agent must write 发布.md and README.md; the CLI does not guarantee their completeness or upload anything to a platform. Play the opening, middle and ending, listening especially for numbers, names and music balance. Report the duration from the actual file.
Troubleshoot common failures
The agent cannot find the shared workflow? Confirm that both whiteboard-video and video-common exist as valid sibling links in your host’s skills directory.
Narration fails or has no audio? Check credentials, voice/resource pairing and speech-service access in your Volcengine account. Do not combine official voices with the cloned-voice resource.
Only part of a narration segment was generated? The tool checks returned word information and retries. If it remains incomplete, force narration regeneration:
FORCE_TTS=1 bin/wb build 计划 # Request forced synthesis, then rebuild
Chromium is missing or rendering times out? Confirm the browser installation during npm install succeeded. Run npx playwright install chromium from the skill directory if needed. On Linux, follow Playwright’s messages for missing system libraries. If memory is constrained, reduce render.workers to 1, then run bin/wb render 计划 and bin/wb mix 计划 again.
Captions or the watermark are covered? Adjust scenes.js to keep elements outside the reserved regions and inspect new stills before rebuilding.
The wrong sticker image was picked up? Do not run wb image concurrently. The upstream image tool’s most-recent-image fallback can mix up concurrent jobs. Generate sequentially and inspect each image.
Extend the scenes and publishing workflow
For custom visuals, read the scene DSL. For reusable layouts, consult scene patterns. The skill instructions cover the full revision workflow, while video-common provides fact-checking and delivery review requirements.
Code and documentation use the MIT license. That does not grant unrestricted rights to third-party logos, music or other assets. Review asset permissions, factual sources and the finished video before publication.