with one click
story
// Create high-quality MulmoScript through structured multi-phase creative process
// Create high-quality MulmoScript through structured multi-phase creative process
Replicate ใขใใซใฎ API ใใฉใกใผใฟใ่ชฟๆปใใใๆฐใใใขใใซใฎ่ฟฝๅ ใใใฉใกใผใฟ็ขบ่ชใใขใใซ้ใฎๆฉ่ฝๆฏ่ผๆใซไฝฟ็จใ
Create a stroke order animation MulmoScript using KanjiVG SVG data. Use when the user wants to create stroke order learning content for hiragana, katakana, kanji, or Latin alphabet characters.
Create a vocabulary learning chat MulmoScript with messenger-style animated UI (voiceover approach). Use when the user wants to create vocabulary learning content.
Create a vocabulary learning lesson MulmoScript with multi-section structure (word display, examples with voice_over, explanation, review with translation). Use when the user wants to create vocabulary learning content with a lesson/presentation-style format rather than chat-style.
Create a conversation practice chat MulmoScript with speech bubble UI and character illustration (voiceover approach). Use when the user wants to create English conversation practice content.
ElevenLabs ใฎๆฐใขใใซ่ฟฝๅ ๆใซไฝฟ็จใprovider2agent.ts ใฎใขใใซใชในใๆดๆฐใจใในใในใฏใชใใๆดๆฐใ่กใใ
| name | story |
| description | Create high-quality MulmoScript through structured multi-phase creative process |
| allowed-tools | Read, Write, Edit, Bash, Grep, Glob, WebSearch, WebFetch, mcp__playwright__browser_navigate, mcp__playwright__browser_snapshot, mcp__playwright__browser_take_screenshot, mcp__playwright__browser_evaluate, mcp__playwright__browser_close, mcp__playwright__browser_install |
| user-invocable | true |
Create compelling MulmoScript through a structured creative process. Present Topic Brief + Beat Outline + Narrations + Visual plan to the user, then assemble the final JSON.
Key principle: Separate what to say (narration) from how to show it (visuals). Never generate both simultaneously.
Ask the user what they want to create content about. Inputs can be:
Try WebFetch first. Only use Playwright MCP when WebFetch fails (403, paywalled, JS-heavy).
browser_navigate + browser_snapshot. Close with browser_close after all browser operations (fetching + image collection).If the page has pagination, fetch ALL pages before proceeding.
During research, actively download real images. Real images > AI-generated for recognizable subjects.
Store in output/images/{scriptBasename}/:
mkdir -p output/images/{scriptBasename}
curl -fL -o output/images/{scriptBasename}/{name}.jpg "URL"
If using Playwright, collect image URLs with browser_evaluate:
() => Array.from(document.querySelectorAll('img')).filter(img => img.naturalWidth > 200).map(img => ({src: img.src, alt: img.alt || ''}))
## Topic Brief
**Subject**: [one line]
**Target audience**: [who]
**Tone**: [professional / conversational / energetic / serious]
**Orientation**: [landscape (1280ร720) / portrait (1080ร1920)]
**Key insights** (3-5):
1. ...
**Suggested theme**: [corporate / pop / warm / creative / minimal / dark]
**Collected images** (N found):
- [description]: [local path]
Ask the user about orientation. Default to landscape (1280ร720) for presentations and standard videos. Use portrait (1080ร1920) for short-form content (TikTok, Reels, Shorts, Stories).
Default to light/bright themes. Dark theme is only for explicitly technical/developer content.
| Content Type | Theme | Background |
|---|---|---|
| Business news, financial data | corporate (DEFAULT) | Light |
| Pop culture, entertainment | pop | Light |
| Education, tutorials | warm | Light |
| Academic, research | minimal | Light |
| Startups, design | creative | Dark |
| Tech talks, developer content | dark | Dark |
| Source length | Beat count | Structure |
|---|---|---|
| Short (1 article) | 3-8 beats | HOOK โ SECTIONS โ CLOSE |
| Medium (long article) | 8-15 beats | HOOK โ (SECTION_INTRO โ BEATS) ร N โ CLOSE |
| Long (report, multi-chapter) | 15-25 beats | HOOK โ (CHAPTER โ BEATS) ร N โ CLOSE |
When user asks for condensed/few slides, aim for 3-5 dense beats.
YouTube Shorts constraint: When portrait orientation is selected for Shorts, limit to 3-5 beats with short narrations (1-2 sentences each) to keep total duration โค 60 seconds. Each beat typically produces ~8-12 seconds of audio.
## Beat Outline (N beats)
| # | Tag | Summary |
|---|-----|---------|
| 1 | HOOK | ... |
| N | CLOSE | ... |
GOOD narration: Opens with specific detail, uses sensory language, natural spoken rhythm, each beat advances the story.
BAD narration: Generic statements ("AI is changing the world"), listy recitation, robotic transitions.
lang fieldRead the theme JSON from assets/slide_themes/{theme}.json and embed in slideParams.theme.
Follow a restrained color palette. Too many colors creates visual noise.
primary): Use for headings, sidebars, badges, dividers. Creates visual unity.danger/warning only for alarming data; success only for positive metrics. Target specific words or values, not entire sections.primary for all. Differentiation comes from label text.{color:text} is surgical: Highlight 1-2 key terms per bullet. Default text color handles the rest.BAD (rainbow sidebars):
{ "type": "section", "label": "A", "color": "primary" },
{ "type": "section", "label": "B", "color": "accent" },
{ "type": "section", "label": "C", "color": "warning" }
GOOD (unified base + surgical accent):
{ "type": "section", "label": "A", "color": "primary" },
{ "type": "section", "label": "B", "color": "primary" },
{ "type": "section", "label": "C", "color": "primary" }
Then inside bullets: "Key point about {danger:critical risk} and normal context"
| Beat count | Density | Approach |
|---|---|---|
| 3-5 beats | Maximum | Pack each slide like a cheat sheet. Use split + multiple sections, nested bullets, tables, metrics. Every pixel should carry information. |
| 6-10 beats | Standard | 3-5 bullet points per slide. Use split layout with image/chart in one panel and text in the other. Fill space with imageRef or callout blocks. |
| 11+ beats | Relaxed | Focus on one key point per slide. Generous whitespace. Use title/bigQuote for section breaks. |
Fill space with visuals: In any density, if a panel has room, add imageRef, imagePrompt, chart, or mermaid. Never leave panels empty.
| Content Type | Recommended Layout |
|---|---|
| Opening/closing | title or bigQuote |
| Dense information (DEFAULT) | split with content blocks |
| Numbers/KPIs | stats or split with metric blocks |
| Steps/process | columns or timeline |
| Compare/contrast | comparison |
| Data tables | table or split with table block |
For layout/block specifications, Read slide_dsl_reference.md in this skill directory.
For design pattern examples (dense slides, charts, mermaid), Read slide_patterns.md in this skill directory.
Define images in imageParams.images, then reference with imageRef blocks in slide content:
{ "type": "imageRef", "ref": "keyVisual", "alt": "Description", "fit": "contain" }
Path formula: From scripts/samples/ to output/images/ = ../../output/images/{basename}/{filename}.
For AI-generated images when no real counterpart exists, use imagePrompt in imageParams.images (object form โ defines a named image for imageRef to reference):
{ "type": "imagePrompt", "prompt": "Detailed description..." }
For image-only beats without slide layout, use imagePrompt as a beat-level string field (generates a standalone background image):
{ "text": "Narration", "imagePrompt": "Detailed prompt..." }
html_tailwind animation)For beats that benefit from motion โ cinematic intros, opening crawls, data visualizations, 3D effects โ use html_tailwind animation instead of static slides or imagePrompt.
Read docs/llm/html_animation_reference.md for the full API reference (MulmoAnimation DSL, interpolate, Easing, property types).
| Content Type | Visual Mode |
|---|---|
| Data, charts, structured info | slide (default) |
| Photographic / illustrative imagery | imagePrompt |
| Cinematic intros, text crawls, transitions | html_tailwind animation |
| Data dashboards with animated counters | html_tailwind animation |
| 3D card flips, reveals, code walkthroughs | html_tailwind animation |
{
"image": {
"type": "html_tailwind",
"html": ["<div id='el' style='opacity:0'>...</div>"],
"script": [
"const animation = new MulmoAnimation();",
"animation.animate('#el', { opacity: [0, 1], translateY: [30, 0] }, { start: 0, end: 0.5, easing: 'easeOut' });"
],
"animation": true
}
}
Key rules:
html: HTML markup with Tailwind CSS (no <script> tags). Set initial styles inline (e.g., style='opacity:0')script: JavaScript code (no <script> tags). Use MulmoAnimation DSL or raw render() + interpolate()animation: true (30fps) or { "fps": 15 } for custom fpsduration โ it is auto-calculated from the audio length. Setting it explicitly causes audio/video desync. Only set duration for silent beats or fixed-length intros.animation to enable auto-render (no manual render() needed)end: 'auto' for animations that span the entire beat durationAnimated beats can be freely mixed with slide beats and imagePrompt beats in the same script. When mixing, ensure slideParams.theme is present for any slide beats.
Choose background music from the mulmocast-media BGM catalog that matches the story mood:
| BGM | Title | Mood | Best for |
|---|---|---|---|
story001.mp3 | Whispered Melody | smooth, piano | Calm narratives, reflective stories |
story002.mp3 | Rise and Shine | techno, inspiring, piano | Motivational, startup, tech innovation |
story003.mp3 | Chasing the Sunset | piano, inspiring | Uplifting stories, journeys, aspirations |
story004.mp3 | Whispering Keys | classical, ambient | Academic, research, thoughtful content |
story005.mp3 | Whisper of Ivory | piano solo, classical | Elegant, formal, documentary |
theme001.mp3 | Rise of the Flame | classical, emotional | Epic achievements, milestones, announcements |
vibe001.mp3 | Let It Vibe! | rap, dance | Pop culture, entertainment, energetic |
olympic001.mp3 | Olympic-style Theme | epic orchestral fanfare | Grand openings, celebrations, competitions |
morning001.mp3 | Morning Dance | morning, piano solo | Lifestyle, daily routines, light topics |
URL pattern: https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/{name}
Select the BGM that best matches the tone from Phase 1's Topic Brief, and add it to audioParams.
Note: The template below shows commonly used beat fields. If you need a field not listed here, run
npx mulmo tool schemato verify it exists in the schema before adding it. The beat schema is strict โ unrecognized fields will cause validation errors.
{
"$mulmocast": { "version": "1.1" },
"lang": "en",
"canvasSize": { "width": 1280, "height": 720 }, // portrait: { "width": 1080, "height": 1920 }
"title": "Title",
"description": "Brief description",
"references": [{ "url": "...", "title": "...", "type": "article" }],
"speechParams": { "speakers": { "Presenter": { "voiceId": "shimmer" } } },
"audioParams": {
"bgm": { "kind": "url", "url": "https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/story001.mp3" },
"bgmVolume": 0.15
},
"slideParams": { "theme": { } },
"imageParams": { "provider": "google", "images": { } },
"beats": [
{
"text": "Narration",
"speaker": "Presenter",
"image": {
"type": "slide",
"slide": { "layout": "...", "..." : "..." },
"reference": "Source: ... (optional)"
}
}
]
}
reference to data-citing beatsFor beats showing statistics or research findings, add "reference": "Source: ..." to the image object.
Generate the movie directly โ yarn movie automatically generates images and audio as well, so separate yarn images / yarn audio steps are unnecessary.
yarn movie --grouped <filename>
Wrote: <filename>
Summary:
- N beats, [theme] theme
- Key topics: [brief list]
Output: output/video/<basename>.mp4