Manim Scene Craft
Use before writing a scene or changing render, font, arrow, or layout
constants. Skip this skill for changelog, documentation, or non-visual code.
Core invariants
The five rules below are non-negotiable. Detailed rationale + code lives in
rules/.
- Single text entry point. All
Text(...) calls go through _make_text
so the EN/KO font + weight=NORMAL lock can't slip. Raw Text( is a
regression. See rules/scene-skeleton.md.
- Padding safe zones. Box + header + outline lines arrange as a single
VGroup(...).arrange(DOWN, buff=...).next_to(body.get_top(), DOWN, buff=...)
— never as separate move_to calls. See rules/safe-zones.md.
- Section transitions in one play.
_set_section_title bundles
FadeOut(prior title) + FadeOut(prior content) + FadeIn(new title) into a
single self.play(...) so transitions don't show a 0.5–0.8 s empty frame.
See rules/scene-skeleton.md.
- Arrow labels perpendicular. Arrow labels offset ≥ 0.5 perpendicular to
the arrow direction.
UP * 0.25 from center is forbidden — near-vertical
dashed lines slice through the glyphs. See rules/safe-zones.md.
- Layout ratchet on every box. Every new container + text pair gets a
Site(...) entry in verify_hero_layout.py. Run --update-baseline
locally, commit layout_baseline.json. See rules/layout-ratchet.md.
File map
| File |
Purpose |
| rules/scene-skeleton.md |
Imports, palette, _t, _make_text, _set_section_title, Bit construction order |
| rules/safe-zones.md |
Padding rules, arrow geometry, canvas edge limits, _dashed_arrow_with_head |
| rules/multilingual-render.md |
EN/KO lang switch, render commands, output paths, ~/Downloads/ copy |
| rules/layout-ratchet.md |
verify_hero_layout.py SITES + baseline JSON + CI step |
| references/data-sot.md |
Which markdown SoT each scene reads from + parity rules |
| references/pre-pr-checklist.md |
5-item grep checklist before pushing |
| references/external-oss.md |
adithya-s-k/manim_skill (mobject API reference) + other OSS, with stars / last-push verified 2026-05-21 |
Pre-flight
uv add manim --dev && uv sync
brew install pkg-config cmake # macOS, for pycairo
brew install --cask font-pretendard # KO font
uv run python scripts/visualizations/verify_hero_layout.py --static-check
--static-check validates the committed layout_baseline.json without
importing Manim — fast CI gate.
Standard render
uv run manim -qh -o <Name>-EN scripts/visualizations/<file>.py <SceneClass>
GEODE_HERO_LANG=ko uv run manim -qh -o <Name>-KO scripts/visualizations/<file>.py <SceneClass>
cp media/videos/<file>/1080p60/<Name>-{EN,KO}.mp4 ~/Downloads/
After render, run the post-mortem audit workflow in [[viz-frame-audit]].
Workflow differentiator
adithya-s-k/manim_skill (874★) is the recommended external reference for
the general ManimCE API. This skill layers GEODE-specific patterns on top
that the external skill does not cover: EN/KO lang switch, Helvetica Neue +
Pretendard pairing with weight=NORMAL lock, Anthropic-style 6-color palette,
verify_hero_layout.py ratchet, _dashed_arrow_with_head stage-coupled head
tinting, and the 12+ defect catalogue from four validated scenes.
The defect catalogue (filewalk × 5, hero × 7) lives in
[[viz-frame-audit]]'s references/defect-catalogue.md.
1---2name: manim-scene-craft3description: Trigger when: (1) the user mentions "manim", "scene", "video", "EN/KO render", "GEODE_HERO_LANG", "1080p60", or (2) editing files under `scripts/visualizations/` ending in `.py`, or (3) the user asks to render, re-render, or extend any of the four validated scenes (`geode_hero.py`, `autoresearch_filewalk.py`, `autoresearch_compare.py`, `critical_floor.py`). GEODE Manim Scene authoring standard. Locks the patterns the four validated scenes already share — Anthropic-style palette, Helvetica Neue + Pretendard font pairing with weight=NORMAL, EN/KO multilingual lang via `GEODE_HERO_LANG` env, `_dashed_arrow_with_head` stage-coupled tinting, `verify_hero_layout.py` ratchet — so the next scene does not re-discover the kerning / padding / transition regressions catalogued in [[viz-frame-audit]].4---56# Manim Scene Craft78Use before writing a scene or changing render, font, arrow, or layout9constants. Skip this skill for changelog, documentation, or non-visual code.1011## Core invariants1213The five rules below are non-negotiable. Detailed rationale + code lives in14`rules/`.15161. **Single text entry point.** All `Text(...)` calls go through `_make_text`17 so the EN/KO font + `weight=NORMAL` lock can't slip. Raw `Text(` is a18 regression. See [rules/scene-skeleton.md](rules/scene-skeleton.md).192. **Padding safe zones.** Box + header + outline lines arrange as a single20 `VGroup(...).arrange(DOWN, buff=...).next_to(body.get_top(), DOWN, buff=...)`21 — never as separate `move_to` calls. See [rules/safe-zones.md](rules/safe-zones.md).223. **Section transitions in one play.** `_set_section_title` bundles23 FadeOut(prior title) + FadeOut(prior content) + FadeIn(new title) into a24 single `self.play(...)` so transitions don't show a 0.5–0.8 s empty frame.25 See [rules/scene-skeleton.md](rules/scene-skeleton.md).264. **Arrow labels perpendicular.** Arrow labels offset ≥ 0.5 perpendicular to27 the arrow direction. `UP * 0.25` from center is forbidden — near-vertical28 dashed lines slice through the glyphs. See [rules/safe-zones.md](rules/safe-zones.md).295. **Layout ratchet on every box.** Every new container + text pair gets a30 `Site(...)` entry in `verify_hero_layout.py`. Run `--update-baseline`31 locally, commit `layout_baseline.json`. See [rules/layout-ratchet.md](rules/layout-ratchet.md).3233## File map3435| File | Purpose |36|------|---------|37| [rules/scene-skeleton.md](rules/scene-skeleton.md) | Imports, palette, `_t`, `_make_text`, `_set_section_title`, Bit construction order |38| [rules/safe-zones.md](rules/safe-zones.md) | Padding rules, arrow geometry, canvas edge limits, `_dashed_arrow_with_head` |39| [rules/multilingual-render.md](rules/multilingual-render.md) | EN/KO lang switch, render commands, output paths, `~/Downloads/` copy |40| [rules/layout-ratchet.md](rules/layout-ratchet.md) | `verify_hero_layout.py` SITES + baseline JSON + CI step |41| [references/data-sot.md](references/data-sot.md) | Which markdown SoT each scene reads from + parity rules |42| [references/pre-pr-checklist.md](references/pre-pr-checklist.md) | 5-item grep checklist before pushing |43| [references/external-oss.md](references/external-oss.md) | adithya-s-k/manim_skill (mobject API reference) + other OSS, with stars / last-push verified 2026-05-21 |4445## Pre-flight4647```bash48uv add manim --dev && uv sync49brew install pkg-config cmake # macOS, for pycairo50brew install --cask font-pretendard # KO font5152uv run python scripts/visualizations/verify_hero_layout.py --static-check53```5455`--static-check` validates the committed `layout_baseline.json` without56importing Manim — fast CI gate.5758## Standard render5960```bash61uv run manim -qh -o <Name>-EN scripts/visualizations/<file>.py <SceneClass>62GEODE_HERO_LANG=ko uv run manim -qh -o <Name>-KO scripts/visualizations/<file>.py <SceneClass>63cp media/videos/<file>/1080p60/<Name>-{EN,KO}.mp4 ~/Downloads/64```6566After render, run the post-mortem audit workflow in [[viz-frame-audit]].6768## Workflow differentiator6970`adithya-s-k/manim_skill` (874★) is the recommended external reference for71the general ManimCE API. This skill layers GEODE-specific patterns on top72that the external skill does not cover: EN/KO lang switch, Helvetica Neue +73Pretendard pairing with `weight=NORMAL` lock, Anthropic-style 6-color palette,74`verify_hero_layout.py` ratchet, `_dashed_arrow_with_head` stage-coupled head75tinting, and the 12+ defect catalogue from four validated scenes.7677The defect catalogue (filewalk × 5, hero × 7) lives in78[[viz-frame-audit]]'s `references/defect-catalogue.md`.