Skip to content
Back to skills

Manim Composer

ASecurity

Trigger when: (1) The user wants to create an educational/explainer video, (2) The user has a vague concept they want visualized, (3) The user mentions "3b1b style" or "explain like 3Blue1Brown", (4) The user wants to plan a Manim video or animation sequence, (5) The user asks to "compose" or "plan" a math/science visualization. Transforms vague video ideas into detailed scene-by-scene plans (scenes.md). Conducts research, asks clarifying questions about audience/scope/focus, and outputs com...

  • 19 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added June 2, 2026
documentationpython

Works with

  • cli

Security analysis

A100/100

Pro scans all 5 files and shows the line behind each finding

Scanned June 2, 2026

npx -y skills add linkxzhou/build-your-own-x-skills --skill manim-composer --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Manim Composer?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Manim Composer
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/linkxzhou-manim-composer/badge)](https://www.skillsdirectory.com/skills/linkxzhou-manim-composer)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: manim-composer
description: |
  Trigger when: (1) The user wants to create an educational/explainer video, (2) The user has a vague concept they want visualized, (3) The user mentions "3b1b style" or "explain like 3Blue1Brown", (4) The user wants to plan a Manim video or animation sequence, (5) The user asks to "compose" or "plan" a math/science visualization.

  Transforms vague video ideas into detailed scene-by-scene plans (scenes.md). Conducts research, asks clarifying questions about audience/scope/focus, and outputs comprehensive scene specifications ready for implementation with ManimCE or ManimGL.

  Use this BEFORE writing any Manim code. This skill plans the video; use manimce-best-practices or manimgl-best-practices for implementation.
---

## Workflow

### Phase 1: Understand the Concept

1. **Research the topic** deeply before asking questions
   - Use web search to understand the core concepts
   - Identify the key insights that make this topic interesting
   - Find the "aha moment" — what makes this click for learners
   - Note common misconceptions to address

2. **Identify the narrative hook**
   - What question does this video answer?
   - Why should the viewer care?
   - What's the surprising or counterintuitive element?

### Phase 2: Clarify with User

Ask targeted questions (not all at once — adapt based on responses):

**Audience & Scope**
- What math/science background should I assume? (e.g., "knows calculus" or "high school algebra")
- Target video length? (short: 5–10min, medium: 15–20min, long: 30min+)
- Should this be self-contained or part of a series?

**Focus & Depth**
- Any specific aspects to emphasize or skip?
- Proof-heavy or intuition-focused?
- Real-world applications to include?

**Style Preferences**
- Color scheme preferences?
- Narration style? (casual, formal, playful)
- Any specific visual metaphors you have in mind?

### Phase 3: Create scenes.md

Output a comprehensive `scenes.md` file with this structure:

```markdown
# [Video Title]

## Overview
- **Topic**: [Core concept]
- **Hook**: [Opening question/mystery]
- **Target Audience**: [Prerequisites]
- **Estimated Length**: [X minutes]
- **Key Insight**: [The "aha moment"]

## Narrative Arc
[5-10 sentences describing the journey from confusion to understanding]

---

## Scene 1: [Scene Name]
**Duration**: ~X seconds
**Purpose**: [What this scene accomplishes; be as detailed as possible]

### Visual Elements
- [List of mobjects needed]
- [Animations to use]
- [Camera movements]

### Content
[Detailed description of what happens, what's shown, what's explained]

### Narration Notes
[Key points to convey, tone, pacing notes]

### Technical Notes
- [Specific Manim classes/methods to use]
- [Any tricky implementations to note]

---

## Scene 2: [Scene Name]
...

---

## Transitions & Flow
[Notes on how scenes connect, recurring visual motifs]

## Color Palette
- Primary: [color] - used for [purpose]
- Secondary: [color] - used for [purpose]
- Accent: [color] - used for [purpose]
- Background: [color]

## Mathematical Content
[List of equations, formulas, or mathematical objects that need to be rendered]

## Implementation Order
[Suggested order for implementing scenes, noting dependencies]
```

## 3b1b Style Principles

Apply these principles when composing scenes:

### Visual Storytelling
- **Show, don't just tell** - Every concept needs a visual representation
- **Progressive revelation** - Build complexity gradually, don't show everything at once
- **Visual continuity** - Transform objects rather than replacing them when possible

### Pacing & Rhythm
- **Pause for insight** - Give viewers time to absorb key moments
- **Vary the pace** - Mix quick sequences with slower explanations
- **End scenes with resolution** - Each scene should feel complete

### Mathematical Beauty
- **Emphasize elegance** - Highlight when math is surprisingly simple or beautiful
- **Connect representations** - Show the same concept multiple ways (algebraic, geometric, intuitive)
- **Embrace abstraction gradually** - Start concrete, then generalize

### Engagement Techniques
- **Pose questions** - Make viewers curious before revealing answers
- **Acknowledge difficulty** - "This might seem confusing at first..."
- **Celebrate insight** - Make the "aha moment" feel earned

## Notes / Pitfalls

### 1) Chinese text & LaTeX

#### 1.1 Do NOT put Chinese in MathTex

LaTeX does not support Chinese characters by default. If you put Chinese inside `MathTex`, it will fail to compile:

```
LaTeX Error: Unicode character 位 (U+4F4D)
ValueError: latex error converting to dvi
```

**Solution**: render Chinese with `Text`, render formulas with `MathTex`, and combine them using `VGroup`:

```python
# ❌ Wrong: MathTex contains Chinese
formula = MathTex(r"8\text{位范围}: [0, 2^8-1] = [0, 255]")
formula = MathTex(r"\text{值} = (-1)^S \times 1.M \times 2^{E-127}")

# ✅ Correct: separate Chinese text and MathTex
formula = VGroup(
    Text("8-bit range: ", font_size=22),
    MathTex(r"[0, 2^8-1] = [0, 255]", font_size=26)
).arrange(RIGHT, buff=0.1)

formula = VGroup(
    Text("Value = ", font_size=24),
    MathTex(r"(-1)^S \times 1.M \times 2^{E-127}", font_size=28)
).arrange(RIGHT, buff=0.1)

# ✅ When the Chinese/annotation is after the formula
result = VGroup(
    MathTex(r"10^{1000} = +\infty", font_size=28),
    Text(" (overflow)", font_size=22)
).arrange(RIGHT, buff=0.1)
```

**Note**: the LaTeX `\text{}` command only supports ASCII characters. Any Chinese/Japanese/Korean Unicode characters will cause compilation to fail.

#### 1.2 Pure English text is OK via `\textrm{}`

If you only need English text (e.g., NaN/Inf), you can use `\textrm{}` inside `MathTex`:

```python
# ✅ English text can use \textrm{}
MathTex(r"\sqrt{-1} = \textrm{NaN}", font_size=28)
MathTex(r"0 / 0 = \textrm{NaN}", font_size=28)
```

#### 1.3 Avoid Chinese quotation marks that conflict with Python strings

Using Chinese double quotes like `“”` (or mixing quote styles) inside Python strings can easily lead to syntax issues.

```python
# ❌ Wrong: quotes conflict
explain = Text(
    "n elements, each has two choices: "in"/"out"",  # SyntaxError!
    font_size=18
)

# ✅ Option 1: use single quotes inside
explain = Text(
    "n elements, each has two choices: 'in/out'",
    font_size=18
)

# ✅ Option 2: escape quotes
explain = Text(
    "n elements, each has two choices: \"in/out\"",
    font_size=18
)

# ✅ Option 3: use single-quoted outer string
explain = Text(
    'n elements, each has two choices: "in/out"',
    font_size=18
)
```

**Best practice**: consistently use ASCII punctuation in code to avoid subtle parsing issues.

### 2) Layout & Positioning

#### 2.1 Keep groups horizontally centered

If your content ends up drifting left/right, `.set_x(0)` can force horizontal centering:

```python
# ❌ Wrong: positioning relative to a left-aligned object drifts everything left
switch_label = Text("Switch", font_size=24).to_edge(LEFT)
bulb_label = Text("Bulb", font_size=24).next_to(switch_label, RIGHT, buff=2)
# The whole group drifts left!

# ✅ Option 1: VGroup + arrange + set_x(0)
labels = VGroup(
    Text("Switch", font_size=24),
    Text("Bulb", font_size=24)
).arrange(RIGHT, buff=2).set_x(0)  # centered as a whole

# ✅ Option 2: center a single element
title = Text("Boolean Algebra", font_size=36)
title.to_edge(UP, buff=0.5).set_x(0)

# ✅ Option 3: center after relative layout
content = VGroup(title, subtitle).arrange(DOWN, buff=0.3)
content.next_to(header, DOWN, buff=0.5).set_x(0)
```

**Common issue**: once you use `.to_edge(LEFT)` or `.align_to(..., LEFT)`, anything positioned relative to that object will also shift left.

#### 2.2 When side-by-side content gets too wide

If multiple items arranged horizontally exceed the frame width, split into sequential reveals:

```python
# ❌ Wrong: three tables side-by-side overflow the screen
and_table = create_table("AND")
or_table = create_table("OR")
not_table = create_table("NOT")
tables = VGroup(and_table, or_table, not_table).arrange(RIGHT, buff=0.5)

# ✅ Correct: show them one by one
and_group = create_operation_display("AND").set_x(0)
self.play(FadeIn(and_group))
self.wait(2)
self.play(FadeOut(and_group), run_time=0.5)

or_group = create_operation_display("OR").set_x(0)
self.play(FadeIn(or_group))
self.wait(2)
self.play(FadeOut(or_group), run_time=0.5)

not_group = create_operation_display("NOT").set_x(0)
self.play(FadeIn(not_group))
self.wait(2)
self.play(FadeOut(not_group), run_time=0.5)
```

**Applies to**:
- multiple truth tables / formulas / charts
- comparisons across multiple concepts
- vertical mobile layouts (9:16) with limited width

#### 2.3 Prefer `next_to()` over absolute `move_to()` offsets

```python
# ❌ Wrong: absolute offsets can cause overlaps when text changes
name_text.move_to(box.get_left() + RIGHT * 0.7)
formula_text.move_to(box.get_center() + RIGHT * 0.5)

# ✅ Correct: relative positioning adapts automatically
name_text.next_to(box.get_left(), RIGHT, buff=0.3)
formula_text.next_to(name_text, RIGHT, buff=0.3)
```

#### 2.4 Timing: position elements inside a VGroup after arranging

```python
# ❌ Wrong: using box position before arrange()
boxes = VGroup()
for data in items:
    box = Rectangle(...)
    text = Text(data)
    text.move_to(box.get_left() + RIGHT * 1)  # box not positioned yet!
    boxes.add(VGroup(box, text))
boxes.arrange(DOWN)  # too late, texts are already misaligned

# ✅ Correct: arrange first, then position internals
boxes = VGroup(*[Rectangle(...) for _ in items])
boxes.arrange(DOWN)

for i, data in enumerate(items):
    box = boxes[i]
    text = Text(data)
    text.next_to(box.get_left(), RIGHT, buff=0.3)
```

#### 2.5 `Text("")` does NOT create spacing

```python
# ❌ Wrong: empty Text won't create spacing
VGroup(
    Text("Title", font_size=20),
    Text("", font_size=8),
    Text("Body", font_size=16),
).arrange(DOWN, buff=0.1)

# ✅ Correct: use buff
VGroup(
    Text("Title", font_size=20),
    Text("Body", font_size=16),
).arrange(DOWN, buff=0.2)
```

#### 2.6 Standard “content inside a box” layout

```python
box = RoundedRectangle(width=7, height=2, ...)
box.next_to(previous, DOWN, buff=0.4)

content = VGroup(
    Text("Title", font_size=20),
    Text("Description", font_size=14),
).arrange(DOWN, buff=0.15)
content.move_to(box.get_center())

# or: use a relative chain
# title.next_to(box.get_top(), DOWN, buff=0.2)
# desc.next_to(title, DOWN, buff=0.15)
```

### 3) Scene Management

#### 3.1 Clear between sections

```python
def clear_scene(self):
    """Call at the end of each section to prevent mobject accumulation."""
    if len(self.mobjects) > 0:
        self.play(*[FadeOut(m) for m in self.mobjects], run_time=0.5)
    self.wait(0.1)
```

#### 3.2 Manage chapter titles centrally to avoid duplicates

If a `Scene` class contains multiple `section_*` methods, creating the same chapter title inside each section can lead to duplicated titles or layout glitches.

```python
# ❌ Wrong: each section creates its own chapter title
class MyScene(Scene):
    def construct(self):
        self.section1()
        self.section2()

    def section1(self):
        title = create_title("Chapter 1: ...")
        title.to_edge(UP, buff=0.8)
        self.play(Write(title))
        # ...
        self.play(FadeOut(title))

    def section2(self):
        title = create_title("Chapter 1: ...")
        title.to_edge(UP, buff=0.8)
        self.add(title)
        # ...

# ✅ Correct: define title text as a class constant, build it once in construct()
class MyScene(Scene):
    CHAPTER_TITLE = "Chapter 1: ..."

    def construct(self):
        self.chapter_title = create_title(self.CHAPTER_TITLE)
        self.chapter_title.to_edge(UP, buff=0.8)

        self.section1()
        self.section2()
        clear_scene(self)

    def section1(self):
        """Intro - write the shared chapter title once."""
        subtitle = Text("Subtitle", font_size=24)
        subtitle.next_to(self.chapter_title, DOWN, buff=0.5)

        self.play(Write(self.chapter_title))
        self.play(FadeIn(subtitle))
        self.wait(1)
        self.play(FadeOut(subtitle))

    def section2(self):
        """Later section - reuse the same chapter title."""
        section_title = Text("Section title", font_size=28)
        section_title.next_to(self.chapter_title, DOWN, buff=0.5)

        self.play(Write(section_title))
        # ...
```

**Key points**:
- Use a class attribute like `CHAPTER_TITLE` to define chapter title text (easy to maintain)
- Create `self.chapter_title` in `construct()` and reuse it across sections
- Only `Write()` the chapter title once; later sections simply reference it
- Call `clear_scene(self)` at the end to clean up

### 4) Vertical mobile format (9:16)

If you target vertical mobile video (`frame_width=9, frame_height=16`), width is limited; pay extra attention to layout.

#### Recommended font sizes

| Element type | Recommended size | Notes |
|---|---:|---|
| Scene title | 32–36 | `title.to_edge(UP, buff=0.6)` |
| Chapter title | 24–28 | secondary titles |
| Body text | 16–20 | main content |
| Captions | 12–14 | gray supportive text |
| Code/formulas | 14–18 | monospace or `MathTex` |

## References

- [references/narrative-patterns.md](references/narrative-patterns.md) - Common 3b1b narrative structures
- [references/visual-techniques.md](references/visual-techniques.md) - Effective visualization patterns
- [references/scene-examples.md](references/scene-examples.md) - Example scenes.md excerpts

## Templates

- [templates/scenes-template.md](templates/scenes-template.md) - Blank scenes.md template

Files in this skill

  • SKILL.md13.4 KB
  • references/narrative-patterns.md3.5 KB
  • references/scene-examples.md5.4 KB
  • references/visual-techniques.md5.5 KB
  • templates/scenes-template.md3.4 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…