Documentation

Python scene-writing docs for Manim Web

Learn the authoring model, follow actual Manim constraints, and copy known-good patterns that compile cleanly in Manim Web.

Actual Manim semanticsGuides for scene authorsNarrative-first scene design
GuideMedia And Audio4 sections

Text And Visual Assets

Build readable, media-aware scenes with Text, Tex, MathTex, Tabler icons, uploaded images, SVGs, and videos. Audio has its own focused guide.

Text Objects

Use Text for general labels, Tex and MathTex for LaTeX-style math and typeset expressions, and group them like any other mobject.

title = Text("Vector text", font_size=56, color=BLUE)formula = MathTex(r"e^{i\pi} + 1 = 0") content = VGroup(title, formula).arrange(DOWN, buff=0.5)self.play(Write(title), Write(formula))self.play(content.animate.scale(0.85).to_edge(UP)) 

Image Assets

Use ImageMobject and SVGMobject for image-backed scenes. In practice, stable IDs and predictable asset naming make scripts easier to maintain than hardcoded ad hoc paths. A positional value such as ImageMobject("car") resolves an uploaded image with the ID car. You may also use a scene-relative path or a workspace-root path beginning with /.

# Stable uploaded image ID from the Image Assets panel.car = ImageMobject("car").set(width=5) # Or an explicit path rooted inside your own workspace.logo = ImageMobject("/data/shared/images/logo.png").set(height=1) layout = Group(car, logo).arrange(RIGHT, buff=0.75)self.play(FadeIn(layout)) 

Tabler Icons

TablerIcon loads an icon by its canonical lowercase kebab-case name from the Tabler pack bundled with both the development and production renderers. Import it through from manim import *; no extra Python import, uploaded SVG, or network request is required.

from manim import * class IconScene(Scene):    def construct(self):        rocket = TablerIcon(            "rocket",            color=BLUE,            stroke_width=5,        ).set_fill(YELLOW, opacity=0.18)         heart = TablerIcon(            "heart",            variant="filled",            color=RED,        )         icons = VGroup(rocket, heart).arrange(RIGHT)        self.play(Create(rocket), FadeIn(heart))        self.play(icons.animate.scale(0.8).rotate(PI / 8)) 

TablerIcon is an SVGMobject subclass. Methods such as scale,rotate, move_to, next_to, set_fill,set_stroke, set_opacity, animate, and updaters behave as they do for any other Manim SVG object. The SVG geometry goes directly through the real Manim renderer into the final MP4.

ArgumentContract
nameRequired exact lowercase kebab-case Tabler name, for example rocket or brand-github.
variantoutline by default; filled only when Tabler publishes that icon in the filled style.
colorPrimary paint color: stroke for outline icons and fill for filled icons.
fill_* / stroke_*Normal SVGMobject fill, stroke, opacity, and stroke-width controls.
height / widthNormal SVGMobject sizing controls; height defaults to 2 Manim units.
use_svg_cacheEnabled by default so repeated instances can reuse parsed SVG geometry.
Names and compilation errors
Browse names on tabler.io/icons. You can also inspect TablerIcon.available_names() or pass "filled" to list only filled names. Unknown names return a compilation error with close-name suggestions. For security, paths, URLs, raw SVG/XML, non-string values, file_name, and image_id are rejected before filesystem access, and the error points to the line that called TablerIcon.

Video Assets

Upload a source in the editor's Video Assets panel, then create a VideoMobject with the filename stem as its stable ID. It behaves like an image mobject for transforms and layout while its frames advance on the scene timeline.

clip = VideoMobject(    video_id="demo_clip",    include_audio=True,).set(width=8) self.add(clip)clip.play(from_time=1.0, volume=0.7)self.wait(2) clip.pause()self.play(clip.animate.scale(0.7).to_corner(DR)) clip.seek(0.5)clip.resume(rate=1.25, loop=True)self.wait(3)clip.stop(fade_out=0.2) 

play, pause, resume, seek, stop, playback rate, looping, volume, mute, and unmute are supported. Source audio is synchronized and mixed into the final rendered scene unless include_audio=False. Frames are decoded lazily, so uploaded video bytes are not copied into scene metadata or retained in browser memory.

Looking for audio?
Voiceovers, background audio, and bundled sound effects have different timing and security contracts. Use the Audio And Sound Effects guide to choose the right API and see complete runnable examples.