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.
| Argument | Contract |
|---|---|
| name | Required exact lowercase kebab-case Tabler name, for example rocket or brand-github. |
| variant | outline by default; filled only when Tabler publishes that icon in the filled style. |
| color | Primary paint color: stroke for outline icons and fill for filled icons. |
| fill_* / stroke_* | Normal SVGMobject fill, stroke, opacity, and stroke-width controls. |
| height / width | Normal SVGMobject sizing controls; height defaults to 2 Manim units. |
| use_svg_cache | Enabled by default so repeated instances can reuse parsed SVG geometry. |
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.