bassimeledath/manim-video-maker/manimate

Claude Code and agent skill by bassimeledath/manim-video-maker

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Generate diagram and animation videos from natural language descriptions using Manim. Outputs MP4 (default) or GIF on request.

Install

npx vskill@latest install bassimeledath/manim-video-maker/manimate

SKILL.md

/manimate — Manim Animation Video Maker

Generate diagram and animation videos from natural language descriptions using Manim. Outputs MP4 video by default; GIF available on request.

Usage

/manimate "explain how binary search works"
/manimate "show the Pythagorean theorem proof"
/manimate "visualize bubble sort step by step"

Pipeline

When the user invokes /manimate, execute these 12 steps in order:


Step 1: Parameter Inference

Parse the user's prompt and infer rendering parameters:

ParameterRangeDefaultHow to infer
scenes1-62Count distinct concepts/steps/phases in the prompt
qualityl/m/hhDefault high; use medium for quick drafts
formatgif/mp4/bothmp4Default mp4; use gif or both only if user explicitly requests GIF
styleeducational/minimal/cinematiceducationalInfer from the tone/subject
duration_per_scene5-15s8Longer for complex concepts, shorter for simple transitions

Write to $WORK_DIR/params.json:

json
{
"prompt": "explain how binary search works",
"scenes": 3,
"quality": "h",
"format": "mp4",
"style": "educational",
"duration_per_scene": 8
}

Write $WORK_DIR/manim.cfg:

ini
[CLI]
quality = high_quality
format = mp4
renderer = cairo
disable_caching = True
[output]
media_dir = media
video_dir = {media_dir}/videos
images_dir = {media_dir}/images
Why `renderer = cairo`: Cairo is the safe default for headless/CI environments. It requires no GPU, no display server, and no OpenGL context.

Step 2: Preflight Checks

Verify dependencies and set pipeline-wide capability flags:

bash
# Required: Python 3.8+
python3 --version 2>/dev/null || { echo "python3 not found"; exit 1; }
# Required: ManimCE
python3 -c "import manim; print(f'manim {manim.__version__}')" 2>/dev/null || {
echo "manim not found. Install: pip install manim"
exit 1
}
# Required: ffmpeg
command -v ffmpeg >/dev/null 2>&1 || { echo "ffmpeg not found"; exit 1; }
# Optional: LaTeX + dvisvgm
LATEX_AVAILABLE=false
if command -v latex >/dev/null 2>&1 && command -v dvisvgm >/dev/null 2>&1; then
LATEX_AVAILABLE=true
echo "LaTeX + dvisvgm available — MathTex/Tex enabled"
else
echo "LaTeX or dvisvgm not found. Falling back to Text-only mode."
echo " Install: brew install --cask mactex-no-gui (macOS) or apt install texlive-full (Linux)"
fi
# Detect timeout command (used for render timeouts in Step 10)
TIMEOUT_CMD=""
if command -v gtimeout >/dev/null 2>&1; then
TIMEOUT_CMD="gtimeout"
elif command -v timeout >/dev/null 2>&1; then
TIMEOUT_CMD="timeout"
else
echo "Neither timeout nor gtimeout found. Render hangs won't be caught."
fi

Create a run-scoped working directory to allow concurrent pipeline executions:

bash
WORK_DIR=".manimate-$(date +%s)-$$"
mkdir -p "$WORK_DIR"/scenes "$WORK_DIR"/assets "$WORK_DIR"/lastframes "$WORK_DIR"/output
echo "Working directory: $WORK_DIR"
`WORK_DIR` is the pipeline root for this run. All subsequent steps reference $WORK_DIR instead of a hardcoded .manimate path. This prevents data loss when multiple /manimate invocations run concurrently.
Pipeline-wide LATEX_AVAILABLE flag: When false, scene code must NOT use MathTex or Tex — use Text() for all text, including math expressions. Render equations as Unicode or ASCII.

Step 3: Story Decomposition

Break the prompt into scenes. Each scene specifies visual elements, animations, and narrative arc.

Default to SVG icons for every real-world concept. For each scene, identify concepts that can be icons and add them to asset_manifest. Every video should have at least 2 SVG assets — if the manifest is empty, revisit the decomposition.

Use basic Manim shapes only for: array cells, flowchart boxes, graphs/axes, code blocks, containers, math expressions. Everything else gets an SVG.

Write $WORK_DIR/story.json with a top-level asset_manifest and per-scene svg_assets referencing manifest keys:

json
{
"title": "How Binary Search Works",
"asset_manifest": {
"magnifier_icon": {
"description": "Magnifying glass with circular lens and angled handle",
"viewbox": "0 0 64 64",
"primary_color_token": "ACCENT",
"used_in": [1]
},
"checkmark_icon": {
"description": "Bold checkmark inside a rounded square",
"viewbox": "0 0 64 64",
"primary_color_token": "SUCCESS",
"used_in": [3]
}
},
"scenes": [
{
"id": 1,
"title": "The Problem",
"description": "Show a sorted array of numbers. Highlight that we need to find a target value.",
"visual_elements": ["sorted array of boxes with numbers", "target value highlighted"],
"animations": ["Create array", "Highlight target", "Write question text"],
"svg_assets": ["magnifier_icon"],
"scene_class": "TheProblem",
"duration": 8,
"template": "basic",
"text_elements": ["title: 3 words", "description: 12 words"],
"estimated_reading_pauses": 6.0,
"continuity_in": null,
"continuity_out": "Array remains visible, target highlighted"
}
],
"shared_style": {
"NOTE": "LOCKED — copy these values verbatim into shared.py. Do NOT change any hex code.",
"bg_color": "#2a2a3a",
"surface_color": "#3a3a4a",
"border_color": "#4a4a5a",
"primary_color": "#ff3366",
"accent_color": "#33ccff",
"highlight_color": "#ffcc00",
"success_color": "#66ff66",
"negative_color": "#ff4444",
"text_color": "#ffffff",
"muted_color": "#8a8aaa",
"font_heading": "Helvetica Neue",
"font_body": "Helvetica Neue",
"font_code": "Monaco",
"font_size_title": 44,
"font_size_body": 26
},
"latex_available": true
}

`asset_manifest` schema: Each key is an asset ID (snake_case). Fields:

  • description — what the icon depicts, enough detail for accurate SVG generation
  • viewbox — SVG viewBox (tall: "0 0 80 100", square: "0 0 64 64", wide: "0 0 100 60")
  • primary_color_token — which palette token to use as the main fill (PRIMARY, ACCENT, HIGHLIGHT, SUCCESS, NEGATIVE)
  • used_in — list of scene IDs that use this asset

Per-scene `svg_assets` is a list of asset IDs from the manifest (not freeform hints). If a scene needs no SVG assets, use an empty list [].

Asset density target: Aim for 1-2 SVG assets per scene, 3-6 per video. Scenes with SVG icons are dramatically more engaging than scenes with only basic shapes.

If no scenes need SVG assets (e.g., a pure math derivation), set asset_manifest to {} and all svg_assets to []. Steps 6-7 will no-op.

Continuity rules:

  • continuity_out of scene N must match continuity_in of scene N+1
  • Shared visual elements should use identical styling constants
  • Color palette must be consistent across all scenes (defined in shared_style)

Pacing rules:

  • text_elements lists each text block with its approximate word count — used to calculate reading pauses
  • estimated_reading_pauses is the total seconds of self.wait() needed for reading time (sum of max(2, words / 3) for each text block)
  • duration must be >= animation time + estimated_reading_pauses — increase duration if needed to fit reading time
  • Use the formula: `self.wait(max(2, word_count / 3))` after every text appearance

Step 4: Outline Confirmation

Before generating any code, present the story outline to the user for review and approval.

Build a readable summary from `$WORK_DIR/story.json`:

Scene Outline for: "{title}"
Scene 1: {scene_title}
{description}
Key visuals: {visual_elements joined as comma-separated list}
Duration: {duration}s
Scene 2: {scene_title}
{description}
Key visuals: {visual_elements joined as comma-separated list}
Duration: {duration}s
...
SVG Assets to generate:
- magnifier_icon
Icon: Magnifying glass with circular lens and angled handle
Color: ACCENT (#33ccff)
Used in: Scene 1
- checkmark_icon
Icon: Bold checkmark inside a rounded square
Color: SUCCESS (#66ff66)
Used in: Scene 3
Total duration: {sum of all durations}s
Output format: MP4 (default). Would you like GIF, or both?

Present this outline to the user and ask:

Does this outline look good? You can:
1. Approve and continue
2. Request changes (add/remove/reorder scenes, adjust descriptions, change durations)
3. Change output format (mp4 / gif / both)

⛔ HARD STOP — Do NOT proceed past this point until the user explicitly approves.

After presenting the outline, STOP. Do not generate any code, write any files, or start any subsequent steps. Wait for the user to respond. This is a mandatory approval gate.

Revision loop:

  • If the user requests changes, update $WORK_DIR/story.json accordingly (add/remove scenes, edit descriptions, adjust durations, etc.) and re-present the outline.
  • If the user changes the output format, update $WORK_DIR/params.json (format field) and $WORK_DIR/manim.cfg to match.
  • Repeat until the user explicitly approves (e.g., "looks good", "approved", "go ahead", "yes").

Once — and ONLY once — the user explicitly approves, proceed to Step 5.


Step 5: Shared Preamble Generation

Generate $WORK_DIR/shared.py — a single module containing palette constants, helpers, and asset loading that all scenes import. This eliminates ~50 lines of duplicated boilerplate from each scene file.

Write `$WORK_DIR/shared.py` by copying the code block below VERBATIM. Do NOT change ANY hex value — not even the background tones (BG, SURFACE, BORDER). The exact hex codes below are the Creative Chaos brand palette and must appear character-for-character in the generated file:

python
from manim import *
import tempfile, os
# ── Creative Chaos Dark — LOCKED palette, do not modify ──
BG = "#2a2a3a"
SURFACE = "#3a3a4a"
BORDER = "#4a4a5a"
PRIMARY = "#ff3366"
ACCENT = "#33ccff"
HIGHLIGHT = "#ffcc00"
SUCCESS = "#66ff66"
NEGATIVE = "#ff4444"
TEXT_CLR = "#ffffff"
TEXT_DIM = "#8a8aaa"
# ── Asset directory ──
ASSET_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets")
def svg_icon(svg_string, scale=1.0):
"""Write inline SVG to temp file and load as SVGMobject.
Use for rare one-off SVGs (under 5 lines). Prefer load_asset() for validated assets."""
tmpdir = tempfile.mkdtemp()
path = os.path.join(tmpdir, "icon.svg")
with open(path, "w") as f:
f.write(svg_string)
return SVGMobject(path).scale(scale)
def load_asset(asset_id, scale=1.0):
"""Load a validated SVG asset from the assets directory."""
path = os.path.join(ASSET_DIR, f"{asset_id}.svg")
if not os.path.exists(path):
raise FileNotFoundError(f"Asset not found: {path}")
return SVGMobject(path).scale(scale)
def tw(text_str):
"""Calculate reading time wait duration: max(2, word_count / 3)."""
return max(2, len(text_str.split()) / 3)
def dot_grid():
"""Create the signature Creative Chaos dot grid background."""
return VGroup(*[
Dot([x, y, 0], radius=0.02, fill_opacity=0.08, color=TEXT_CLR)
for x in range(-7, 8) for y in range(-4, 5)
])
def setup_scene(scene):
"""Set background color and add dot grid. Call at the start of construct()."""
scene.camera.background_color = BG
scene.add(dot_grid())
def title_card(scene, text, wait=2.0):
"""Show title with signature underline, then move to corner.

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 95 of 100Pattern checks on the skill's files.
  • Model reviewPassed
  • semgrepPassed, 100 of 100
  • njsscanPassed, 100 of 100
  • trufflehogPassed, 100 of 100

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

  • SKILL.md in the repositoryCheckingSKILL.md

Popularity

7-day trend score
0

Refreshed 11 May 2026, 5 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/bassimeledath/manim-video-maker/manimate/badge)](https://verified-skill.com/skills/bassimeledath/manim-video-maker/manimate)

Something wrong with this skill or its page? Tell us.