Manim Video

SkillMedia

Plan, script, render, and stitch Manim Community Edition videos in Python. Use when the user asks for animated math explanations, algorithm walkthroughs, equation derivations, technical concept videos, 3Blue1Brown-style explainers, or programmatic educational motion graphics.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Manim Video skill

What this skill tells your AI

The instructions your AI receives, as published by hybridaione/hybridclaw in skills/manim-video/SKILL.md and read by ahel’s review.

Use this skill for Python-based Manim projects that need a clean planning phase, strong visual direction, reusable scene structure, and a deterministic render pipeline.

The output contract is usually a workspace project directory containing plan.md, script.py, concat.txt, draft renders, and optionally a stitched final.mp4.

Creative Standard

This is educational cinema, not animated slides.

  • Make it beautiful and professional. The draft should feel intentional, polished, and presentation-ready, not like a rough internal diagram dump.
  • Before writing code, define the narrative arc: confusion -> visual hook -> mechanism -> payoff -> recap.
  • Geometry before algebra. Show the shape, motion, system flow, or data change before the formal equation.
  • Every scene teaches one dominant idea. If a scene has two unrelated claims, split it.
  • Direct attention with opacity layering: primary elements at 1.0, contextual elements around 0.35-0.45, and structural elements like axes or grids around 0.12-0.2.
  • Give reveals breathing room. Add self.wait() after every important animation and make the main aha moment the longest pause.
  • Keep one cohesive visual language across the whole project: shared palette, shared timing constants, shared font rules, and stable concept-color meaning.
  • Avoid repetitive scenes. Vary dominant color, layout, and entry animation across scenes while keeping the overall palette consistent.
  • First-render quality matters. If the layout is cluttered, the typography is inconsistent, or the pacing feels rushed, the scene is not done.

Modes

ModeInputOutputPrimary references
Concept explainertopic or featureintuitive multi-scene explainerscene-planning.md, visual-design.md
Equation derivationsymbolic expression or proof goalstepwise animated derivationequations.md, python-patterns.md
Algorithm visualizationalgorithm or invariantstepwise state evolutiongraphs-and-data.md, python-patterns.md
Data storymetrics, counters, or comparisonsanimated charts and deltasgraphs-and-data.md, visual-design.md
Architecture diagramsystem or service flowprogressive build with data flowscene-planning.md, python-patterns.md
Paper explainerpaper, abstract, or findinghook -> method -> evidence explainerscene-planning.md, visual-design.md
Camera or 3D explainerspatial or geometric topicmoving-camera or 3D scene setcamera-and-3d.md, visual-design.md

Stack

Single Python script per project. No browser, no Node.js, no GPU requirement.

LayerToolPurpose
CoreManim Community Editionscene rendering and animation engine
MathLaTeX via MathTex / Texequation rendering
Video I/Offmpegstitching, muxing, and format conversion
Narrationsubtitles by default, voiceover optionalaccessibility and pacing
Setup checkcheck_setup.pyhost capability validation and install hints

Pipeline

PLAN --> CODE --> RENDER --> STITCH --> AUDIO --> REVIEW

  • PLAN: write plan.md with the narrative arc, misconception, aha moment, palette, typography, and scene beats.
  • CODE: write script.py with one independently renderable Scene subclass per clip.
  • RENDER: draft render all scenes at -ql unless a real render blocker prevents it.
  • STITCH: update concat.txt and stitch a draft video when ffmpeg is available.
  • AUDIO: add narration or music only when the user asks for it or the project explicitly includes it.
  • REVIEW: verify timing, readability, clean exits, and overall visual coherence before claiming the output is done.

Creative Direction

Color Palettes

PaletteBackgroundPrimarySecondaryAccentUse case
HybridClaw Dark#0B1220#7DA2FF#9AB6FF#7EE3A5default for systems, tools, and architecture
HybridClaw Light#F8FAFC#4A6CF7#3657E9#15803Dbrighter docs-style explainer look
HybridClaw Neutral#111827#E5EDF7#93A4B8#7DA2FFminimal or formal topics

Start with a HybridClaw palette unless the user explicitly asks for a different visual language.

Animation Speed

ContextTypical run_timeTypical self.wait() after
Title or intro hook1.2-1.8s0.8-1.2s
Key equation or mechanism reveal1.8-2.2s1.5-2.5s
Transform or morph1.2-1.8s1.0-1.5s
Supporting annotation0.6-1.0s0.3-0.6s
Fade-out cleanup0.4-0.7s0.2-0.4s
Aha moment2.0-2.8s2.0-3.0s

Typography Scale

RoleFont sizeUsage
Title34-38scene titles and opening claims
Heading28-32section headers within a scene
Body20-24explanatory text
Label18-20annotations, axis labels, component names
Caption18subtitles and supporting notes

Font Rules

Text typeDefault choiceNotes
Titles and sentence copyText(..., font=SANS)prefer a clean sans like SANS = "Avenir Next" or another installed equivalent
Styled inline emphasisMarkupText(..., font=SANS)best for colored spans or bold fragments
Code-like labelsText(..., font=MONO)use MONO = "Menlo" only for identifiers, commands, chips, or short technical tags
MathMathTex(...) / Tex(...)requires LaTeX

Minimum readable text size is font_size=18.

Text density rules:

  • If more than 4 text elements are strongly visible, reduce body text toward 20-24 instead of 26-30.
  • Keep title/subtitle stacks to 2 text blocks. If a third block is needed, move it to a side label, caption, or a new scene.
  • Clamp all titles before .to_edge(...), for example fit_text(title, max_width=11.0).
  • Clamp any potentially long text block to the usable frame width instead of trusting the raw font_size.
  • If a width-clamped title still feels oversized, lower it toward 34-36 or split it into 2 lines. Do not keep a full-sentence title at 48.
  • Do not write new text on top of old text in the same area. Use ReplacementTransform, FadeOut, or a layout shift first.
  • Use buff >= 0.5 for edge-positioned text so draft renders do not clip.

Performance Targets

QualityResolutionFPSUse case
-ql854x48015draft iteration and timing checks
-qm1280x72030text-heavy preview and layout review
-qh1920x108060production export only

Default Workflow

  1. Run the bundled setup check first:
python3 skills/manim-video/scripts/check_setup.py

Treat the setup check as advisory by default. Missing manim, ffmpeg, or pdflatex should stop render commands, but it must not stop planning or script editing. 2. If the user wants a new project, create the target directory and write plan.md, script.py, and concat.txt directly. Preserve the exact requested output path. 3. Fill in plan.md before heavy coding. Read references/scene-planning.md and references/visual-design.md when the narrative, pacing, or screen layout is still fuzzy. When the user already gave a topic, draft the audience, teaching objective, misconception, aha moment, narrative arc, palette, typography, subtitle strategy, and scene beats yourself instead of asking the user to fill placeholders. 4. Keep reference loading small. For a normal request, start with only these core references:

  1. Add only one specialty reference when the task actually needs it:
  2. Read stage-specific references only when you reach that stage:
  3. Implement script.py with one Scene subclass per clip. Use shared constants for palette, typography, and timing. Put subtitles on significant animations, keep scene exits clean, and make every scene independently renderable.
  4. For ordinary requests like "create a short animation explaining X", do not stop after planning and scripting when rendering is available. Produce a draft render in the same turn: render all scene classes at -ql, update concat.txt, and stitch a draft video if ffmpeg is available. Render is part of the normal pipeline, not an optional next step.
  5. Use manim ... as the default render entry point. A global manim CLI from uv tool install manim is fine. Fall back to python3 -m manim ... only when Manim is installed into the host interpreter but the CLI is unavailable.
  6. Before production render, run the production checklist in references/production-quality.md. Use -qh only when the user explicitly asks for a final or high-quality export. For the default one-turn path, a stitched draft render is the finish line. Use references/rendering.md for the exact command shapes.

If required tools are missing, the fallback is still useful:

  • create plan.md
  • write or revise script.py
  • explain what still needs to be installed
  • stop short of claiming a video was rendered

Working Rules

  • Keep all project files in the workspace or in a user-specified output directory. Do not write task-specific files under skills/manim-video/.
  • If the user supplies a target directory such as ./tmp/manim-smoke, preserve that path exactly. Do not invent a new directory name, prepend the repo name, or compress the topic into the path.
  • Prefer manim ... as the default render command. python3 -m manim ... is a fallback, not the primary path.
  • For explicit planning-only requests such as "just plan it", "only write the files", or "stop after creating files", first run check_setup.py, then write plan.md, script.py, and concat.txt, then stop and report the created files.
  • For ordinary requests such as "create a short animation explaining X", continue through the full pipeline in the same turn: fill plan.md, write topic-specific script.py, render the draft scenes, and stitch a draft video when possible. Only stop early if the user asked to stop after setup or a real render blocker prevents progress.
  • If check_setup.py reports missing render dependencies, continue with planning and script generation. Only block manim ..., python3 -m manim ..., preview renders, and final stitching when the missing dependency actually matters for that step.
  • Do not ask "Would you like me to continue?" or offer a preview-vs-full-render choice for an ordinary create request. If draft rendering is available, do it. Reserve follow-up questions for real blockers, explicit quality choices, or user-directed revisions.
  • Treat plan.md as the source of truth for audience, teaching goal, misconception, palette, typography, scene order, pacing, and scene variation.
  • Do not reply that the generated plan is empty or ask the user to provide basic teaching goals, visuals, or narration when those can be inferred from the request.
  • Make every scene independently renderable. One class per scene keeps rerenders cheap.
  • Prefer visual intuition before dense symbolic derivation. Show the shape or process before the final formula.
  • Make every scene look presentation-ready. If the frame feels amateur, cramped, or default-looking, revise layout, typography, spacing, or color before calling it done.
  • Use shared constants at the top of script.py for colors, opacities, fonts, sizes, and timing so scenes stay visually consistent.
  • Use a clean sans font for titles, subtitles, and sentence-level copy. Reserve MONO = "Menlo" for code-like chips, identifiers, terminal snippets, or very short technical labels.
  • Good starter constants are SANS = "Avenir Next" or another installed sans, MONO = "Menlo", TITLE_SIZE = 38, BODY_SIZE = 22, LABEL_SIZE = 18, and CAPTION_SIZE = 18.
  • Use MarkupText when a label needs mixed emphasis, inline colors, or controlled span styling. Do not simulate styled text by stacking many tiny Text objects unless the layout truly requires it.
  • If more than 4 text elements are simultaneously visible, reduce body text toward 20-24 and labels toward 18-20 instead of leaving the default larger sizes.
  • Keep centered title stacks to at most 2 text blocks. If more explanation is needed, move it to a side callout, a bottom note, or the next scene.
  • Clamp long text to the usable frame width. Do not assume long copy will fit just because the font size looks reasonable in code.
  • Create titles through a width-clamp helper before calling .to_edge(...). Do not place a raw long title at font_size=48 and hope it fits.
  • Use buff >= 0.5 for .to_edge(...) text placement.
  • Replace or fade old text before writing new text in the same screen region.
  • Put self.add_subcaption(...) or subcaption= on every title beat, key reveal, and summary beat.
  • Vary dominant color, layout, and animation entry from scene to scene. Do not make every scene a centered title plus subtitle with the same motion.
  • Keep no more than 5-6 strongly visible elements at once. Dim older context instead of leaving every object at full emphasis.
  • For math-heavy scenes, use raw strings with MathTex, for example MathTex(r"\\frac{1}{2}").
  • If pdflatex is unavailable, avoid MathTex and Tex until LaTeX is installed; use Text placeholders instead. Fast package hints: macOS brew install --cask mactex-no-gui, Debian/Ubuntu sudo apt install texlive-full, Fedora sudo dnf install texlive-scheme-full.
  • Use Group(*self.mobjects) rather than VGroup(*self.mobjects) when fading out mixed Text, MathTex, and shape content.
  • Use ValueTracker, add_updater, or always_redraw when the scene depends on a continuously changing parameter. Do not hand-recompute dependent geometry before every self.play() if the relationship is conceptually continuous.
  • Prefer a well-labeled static diagram when motion does not teach anything new. Do not animate just because Manim can.
  • End scenes cleanly. Fade or transform old content away before the next major section instead of hard-cutting between unrelated layouts.
  • Iterate at -ql or -qm. Only render -qh after the draft timing and layout are already correct.
  • For long scenes or videos with clear chapter boundaries, use self.next_section(...) and render with --save_sections so rerenders stay local and review is easier.
  • The default delivery for a normal request is: plan.md, topic-specific script.py, rendered draft scene clips, updated concat.txt, and a stitched draft video when ffmpeg is available.
  • Run the production checklist before claiming a scene is final.
  • Do not claim final.mp4 exists unless the render and stitch steps actually succeeded.

Common Commands

Setup check:

python3 skills/manim-video/scripts/check_setup.py

Strict render gate:

python3 skills/manim-video/scripts/check_setup.py --strict

Install Manim globally with uv:

uv tool install manim

LaTeX install hints for MathTex and Tex:

brew install --cask mactex-no-gui
sudo apt install texlive-full
sudo dnf install texlive-scheme-full

Create a new project directory:

mkdir -p my-video
cd my-video

Render a draft:

cd my-video
manim -ql script.py Scene1Introduction Scene2Invariant

Host-Python fallback render:

cd my-video
python3 -m manim -ql script.py Scene1Introduction Scene2Invariant

Host-CLI fallback render:

cd my-video
manim -ql script.py Scene1Introduction Scene2Invariant

Preview a still frame:

cd my-video
manim -s -ql script.py Scene2Invariant

Stitch clips:

ffmpeg -y -f concat -safe 0 -i concat.txt -c copy final.mp4

References

Validation

Run:

python3 skills/skill-creator/scripts/quick_validate.py skills/manim-video

Signals

GitHub stars
132
Forks
12
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
manim-video-hybridaione
Source
github.com/hybridaione/hybridclaw