Skip to content
Back to skills

Manim

ASecurity

Animate explanations with Manim Community — proofs, transforms, algorithms, graphs, data — as Python scenes rendered to MP4, and keep the pane playing the latest render. Use for any request that ends in an animation or an explainer video.

  • 1,124 stars
  • 0 votes
  • 2 copies
  • 50 views
  • Added September 19, 2026
ai-agentspythongobash

Works with

  • cli

Security analysis

A100/100

Scanned September 19, 2026

npx -y skills add autonomous-ai/openharness --skill manim --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Manim?

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

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

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
description: Animate explanations with Manim Community — proofs, transforms, algorithms, graphs, data — as Python scenes rendered to MP4, and keep the pane playing the latest render. Use for any request that ends in an animation or an explainer video.
---

# manim

Manim (Manim Community edition) renders animations from Python: a `Scene` subclass whose
`construct()` plays animations on mobjects. The render lands as MP4 under `out/`. Tools: `$MANIM`
(the pinned CLI), `$MANIM_PYTHON` (its interpreter). Never install another.

## Render (the verdict comes with it)

```bash
"$MANIM_PYTHON" "$MANIM_TOOLCHAIN/render.py" scenes/intro.py Intro            # quick: 480p15, the default
"$MANIM_PYTHON" "$MANIM_TOOLCHAIN/render.py" -qm scenes/intro.py Intro        # medium: 720p30
"$MANIM_PYTHON" "$MANIM_TOOLCHAIN/render.py" -qh scenes/intro.py Intro        # final: 1080p60
"$MANIM_PYTHON" "$MANIM_TOOLCHAIN/render.py" --format gif scenes/x.py Name    # a gif instead
```

`render.py` is `manim render` with the same flags, output and tracebacks, plus what the pane needs:
`--media_dir out --save_sections`, a live progress file (the pane plays each animation as it is
written and shows a failure with its line), a record of the render's animations and chapters, and
the verdict at the end. Use it for every render; plain `$MANIM render` still works but the pane sees
less. Renders go to `out/videos/<file>/<quality>/<Scene>.mp4`. Render at `-ql` while iterating
(fast), `-qh` once at the end.

## Chapters

The pane shows a scene's sections as chapters — on the timeline, in a list, as `1`…`9` keys. Mark
every beat of the storyboard with a section, named the way a chapter title reads:

```python
def construct(self):
    self.next_section("The question")
    ...
    self.next_section("Squares on the sides")
    ...
    self.next_section("9 + 16 = 25")
```

Three to eight sections for a 20–60 s scene; a name is two to five words; the first call comes before
the first `play`. A section with no animation is dropped. Keep names stable between renders: the pane
marks a chapter "changed" or "new" by its name.

## Writing scenes

- One file per scene under `scenes/`; class name = the scene's name; a docstring says what it shows.
- **Mobjects**: `Text`, `MathTex` (needs LaTeX — check `command -v latex` first; without it, formulas
  are `Text(...)` with Unicode superscripts and the render still lands), `Circle`, `Square`, `Rectangle`, `Line`, `Arrow`, `Dot`, `Axes`, `NumberPlane`, `VGroup`,
  `Table`, `BarChart`, `ImageMobject`.
- **Animations**: `Create`, `Write`, `FadeIn/FadeOut` (with `shift=`), `Transform`, `ReplacementTransform`,
  `MoveToTarget`, `Indicate`, `Circumscribe`, `LaggedStart`, `AnimationGroup`, `.animate` (e.g.
  `self.play(dot.animate.shift(RIGHT * 2))`), `run_time=`, `rate_func=`.
- **Layout**: `.next_to(other, DOWN, buff=0.3)`, `.to_edge(UP)`, `.move_to(ORIGIN)`, `.scale()`,
  `.arrange(RIGHT)` on groups. The frame is 14.2 × 8 units; keep text within ±6 horizontally.
- **Timing**: 0.6–1.2 s per beat, `self.wait(0.5)` between ideas, never more than one new idea on
  screen at a time. A 60-second explainer is 8–12 beats.
- **Look**: dark background (`self.camera.background_color = "#0b0b0c"`), one accent colour, a
  sans-serif via `Text(..., font="Helvetica Neue")`, big type (scale 0.8–1.4).
- **Graphs and data**: `Axes(x_range=[0, 10, 1], y_range=[0, 5, 1])`, `axes.plot(lambda x: ...)`,
  `axes.get_graph_label`, `BarChart(values, bar_names=...)`.
- **Camera moves**: subclass `MovingCameraScene` and animate `self.camera.frame`.

## Rules

- Save early: a first render within the first minute (title + one beat), then add beats.
- Every beat is a section (see Chapters): a proof or an explainer arrives chaptered.
- Every request that says "explain" is a sequence: what it is, why it matters, the mechanism, the
  result. One scene, or one scene per section for long ones.
- Assets (images, data) live under `assets/`; reference them relatively.
- A render that fails prints a Python traceback (and the pane shows the error and its line); fix
  the line it names, render again. The pane keeps playing the last good render meanwhile.

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…