concept-to-video
npx skills add https://github.com/mathews-tom/praxis-skills --skill concept-to-video
Agent 安装分布
Skill 文档
Concept to Video
Creates animated explainer videos from concepts using Manim (Python) as a programmatic animation engine.
Reference Files
| File | Purpose |
|---|---|
references/scene-patterns.md |
Common scene patterns for different concept types with reusable templates |
scripts/render_video.py |
Wrapper around Manim CLI â handles quality, format, output path cleanup |
Why Manim as the engine
Manim is the “SVG of video” â you write Python code that describes animations declaratively, and it renders to MP4/GIF at any resolution. The Python scene file IS the editable intermediate: the user can see the code, request changes (“make the arrows red”, “add a third step”, “slow down the transition”), and only do a final high-quality render once satisfied. This makes the workflow iterative and controllable, exactly like concept-to-image uses HTML as an intermediate.
Workflow
Concept â Manim scene (.py) â Preview (low-quality) â Iterate â Final render (MP4/GIF)
- Interpret the user’s concept â determine the best animation approach
- Design a self-contained Manim scene file â one file, one Scene class
- Preview by rendering at low quality (
-ql) for fast iteration - Iterate on the scene based on user feedback
- Export final video at high quality using
scripts/render_video.py
Step 0: Ensure dependencies
Before writing any scene, ensure Manim is installed:
# System deps (usually pre-installed)
apt-get install -y libpango1.0-dev libcairo2-dev ffmpeg 2>/dev/null
# Python package
pip install manim --break-system-packages -q
Verify with: python3 -c "import manim; print(manim.__version__)"
Step 1: Interpret the concept
Determine the best animation pattern. Read references/scene-patterns.md for detailed templates.
| User intent | Animation pattern | Key Manim primitives |
|---|---|---|
| Explain a pipeline/flow | Sequential flow animation | Arrow, Rectangle, Text, AnimationGroup |
| Show architecture layers | Layer build-up | VGroup, Arrange, FadeIn with shift |
| Algorithm step-through | State machine transitions | Transform, ReplacementTransform, Indicate |
| Compare approaches | Side-by-side morph | Split screen VGroups, simultaneous animations |
| Data transformation | Object metamorphosis | Transform chains, color transitions |
| Mathematical concept | Equation + geometric proof | MathTex, geometric shapes, Rotate, Scale |
| Agent/multi-system interaction | Message passing animation | Arrows between entities, Create/FadeOut |
| Training/optimization loop | Iterative cycle animation | Loop with Transform, ValueTracker, plots |
| Timeline/history | Left-to-right progression | NumberLine, sequential Indicate |
Step 2: Design the Manim scene
Core rules:
- Single file, single Scene class: Everything in one
.pyfile with oneclass XxxScene(Scene). - Self-contained: No external assets unless absolutely necessary. Use Manim primitives for everything.
- Readable code: The scene file IS the user’s artifact. Use clear variable names, comments for each animation beat.
- Color with intention: Use Manim’s color constants (BLUE, RED, GREEN, YELLOW, etc.) or hex colors. Max 4-5 colors. Every color should encode meaning.
- Pacing: Include
self.wait()calls between logical sections. 0.5s for breathing room, 1-2s for major transitions. - Text legibility: Use
font_size=36minimum for body text,font_size=48+for titles. Test at target resolution. - Scene dimensions: Default Manim canvas is 14.2 à 8 units (16:9). Keep content within ±6 horizontal, ±3.5 vertical.
Animation best practices
# DO: Use animation groups for simultaneous effects
self.play(FadeIn(box), Write(label), run_time=1)
# DO: Use .animate syntax for property changes
self.play(box.animate.shift(RIGHT * 2).set_color(GREEN))
# DO: Stagger related elements
self.play(LaggedStart(*[FadeIn(item) for item in items], lag_ratio=0.2))
# DON'T: Add/remove without animation (jarring)
self.add(box) # Only for setup before first frame
# DON'T: Make animations too fast
self.play(Transform(a, b), run_time=0.3) # Too fast to read
Structure template
from manim import *
class ConceptScene(Scene):
def construct(self):
# === Section 1: Title / Setup ===
title = Text("Concept Name", font_size=56, weight=BOLD)
self.play(Write(title))
self.wait(1)
self.play(FadeOut(title))
# === Section 2: Core animation ===
# ... main content here ...
# === Section 3: Summary / Conclusion ===
# ... wrap-up animation ...
self.wait(2)
Step 3: Preview render
Use low quality for fast iteration:
python3 scripts/render_video.py scene.py ConceptScene --quality low --format mp4
This renders at 480p/15fps â fast enough for previewing timing and layout. Present the video to the user.
Step 4: Iterate
Common refinement requests and how to handle them:
| Request | Action |
|---|---|
| “Slower/faster” | Adjust run_time= params and self.wait() durations |
| “Change colors” | Update color constants |
| “Add a step” | Insert new animation block between sections |
| “Reorder” | Move code blocks around |
| “Different layout” | Adjust .shift(), .next_to(), .arrange() calls |
| “Add labels/annotations” | Add Text or MathTex objects with .next_to() |
| “Make it loop” | Add matching intro/outro states |
Step 5: Final export
Once the user is satisfied:
python3 scripts/render_video.py scene.py ConceptScene --quality high --format mp4
Quality presets
| Preset | Resolution | FPS | Flag | Use case |
|---|---|---|---|---|
low |
480p | 15 | -ql |
Fast preview |
medium |
720p | 30 | -qm |
Draft review |
high |
1080p | 60 | -qh |
Final delivery |
4k |
2160p | 60 | -qk |
Presentation quality |
Format options
| Format | Flag | Use case |
|---|---|---|
mp4 |
--format mp4 |
Standard video delivery |
gif |
--format gif |
Embeddable in docs, social |
webm |
--format webm |
Web-optimized |
Delivering the output
Present both:
- The
.pyscene file (for future editing) - The rendered video file (final output)
Copy the final video to /mnt/user-data/outputs/ and present it.
Error Handling
| Error | Cause | Resolution |
|---|---|---|
ModuleNotFoundError: manim |
Manim not installed | Run Step 0 setup commands |
pangocairo build error |
Missing system dev headers | apt-get install -y libpango1.0-dev |
FileNotFoundError: ffmpeg |
ffmpeg not installed | apt-get install -y ffmpeg |
| Scene class not found | Class name mismatch | Verify class name matches CLI argument |
| Overlapping objects | Positions not calculated | Use .next_to(), .arrange(), explicit .shift() calls |
| Text cut off | Text too large or positioned near edge | Reduce font_size or adjust position within ±6,±3.5 |
| Slow render | Too many objects or complex transformations | Reduce object count, simplify paths, use lower quality |
LaTeX Error |
LaTeX not installed (for MathTex) | Use Text instead, or install texlive-latex-base |
LaTeX fallback
If LaTeX is not available, avoid MathTex and Tex. Use Text with Unicode math symbols instead:
# Instead of: MathTex(r"\frac{1}{n} \sum_{i=1}^{n} x_i")
# Use: Text("(1/n) Σ xᵢ", font_size=36)
Limitations
- Manim + ffmpeg required â cannot render without these dependencies.
- No audio support in this workflow â Manim supports audio but adds complexity. Keep videos silent or add audio post-export.
- LaTeX optional â MathTex requires a LaTeX installation. Fall back to Text with Unicode for math.
- Render time scales with complexity â a 30-second 1080p scene with many objects can take 1-2 minutes to render.
- 3D scenes require OpenGL â ThreeDScene may not work in headless containers. Stick to 2D Scene class.
- No interactivity â output is a static video file, not an interactive widget.
Design anti-patterns to avoid
- Walls of text on screen â keep to 3-5 words per label, max 2 lines
- Everything appearing at once â use staged animations with LaggedStart
- Uniform timing â vary run_time to create rhythm (fast for simple, slow for important)
- No visual hierarchy â use size, color, and position to guide attention
- Rainbow colors â 3-4 intentional colors max
- Ignoring the grid â align objects to consistent positions using arrange/align