docs/source/changelog/0.21.0-changelog.md
Date : August 10, 2026
Delegate color handling in {class}.Code to Pygments and document custom styles by {user}Helbronner in {pr}4816
{class}.Code no longer honors foreground color overrides passed through
paragraph_config={"color": ...} or Code.default_paragraph_config["color"];
syntax and line-number colors now come from the selected Pygments
formatter_style. To customize them, pass a custom Pygments Style subclass
through formatter_style and configure its token styles and
line_number_color. Background colors can still be overridden with
background_config={"fill_color": ...}; otherwise, the selected Pygments
style provides the background. See the note in the documentation of {class}.Code
for an explicit example.
Speed up Cairo renderer by 2.2x on animation-heavy scenes by {user}HamdiBarkous in {pr}4695
Cairo path construction now uses vectorized subpath splitting, and pixel-array
handling avoids redundant copies while producing pixel-identical output. This
changes Camera.convert_pixel_array(): the convert_from_floats argument has
been removed, and the method now always converts floats to the camera's pixel
format. Omit the argument if it was previously True; use
np.array(pixel_array) instead if relying on the old default copying behavior.
Introduce first-class support for rendering text and markup via Typst (optional dependency) by {user}behackl in {pr}4681
The new {class}.Typst and {class}.TypstMath mobjects compile Typst markup
and mathematical expressions directly to SVG without requiring a TeX
installation. They support label-based subgroup selection, {{ ... }}
expression grouping, and integration with existing label APIs. Install the
optional dependency with pip install "manim[typst]".
Hash NumPy arrays without JSON expansion by {user}dexhunter in {pr}4883
NumPy arrays in scene cache keys are now represented by deterministic hashes of their complete logical contents instead of sampled JSON data. This prevents stale cache hits when visible image data changes and reduces hashing CPU time by roughly 94โ98% in representative benchmarks.
Add support for encoding partial movie files in parallel by {user}pjfo in {pr}4899
The new max_inflight_encoders configuration option allows partial movie
encoding to overlap with rendering while bounding the number of encoder
workers. Try it with
manim render --max-inflight-encoders 4 --encoder-queue-size 8 scene.py Scene;
--encoder-queue-size limits the pending frame buffers held by each encoder.
The default of one in-flight encoder preserves serial behavior; higher values
reduced an encoding-heavy benchmark by 56% and larger real-world renders by
roughly 8โ11%.
.Table by {user}leqo-c in {pr}4731.TexTemplate by {user}Sazzzzzz in {pr}4810dot_buff parameter to {class}.BulletedList by {user}GniLudio in {pr}4892GenericGraph.__getitem__() by {user}HairlessVillager in {pr}3799SupernovaIa in {pr}4868Mobject.submobjects in sequence methods by {user}nikolajmunk in {pr}4915GniLudio in {pr}4913arrange_in_grid() and get_location() by {user}Croustit in {pr}4622get_nth_subpath() from raising IndexError and ensure it returns a NumPy array by {user}MqCreaple in {pr}4630put_start_and_end_on() by {user}GoThrones in {pr}4658vihdutta in {pr}4694Group or VGroup in CyclicReplace and Swap by {user}irvanalhaq9 in {pr}4211gvauvert in {pr}4088language when constructing Code from code_file by {user}GniLudio in {pr}4706ThreeDScene.set_to_default_angled_camera_orientation() raising AttributeError by {user}siddhu-pikachu in {pr}4704manim init project --default by {user}aoxiangtianyu-go in {pr}4839pjfo in {pr}4901round_corners() failures for collinear vertices by {user}MeiSiristhebest in {pr}4906checkhealth false positives for uv launcher shims by {user}srinu2003 in {pr}4889Theelx in {pr}4819.Angle crashes for parallel or collinear lines by {user}MeiSiristhebest in {pr}4907pjfo in {pr}4896behackl in {pr}4917.Code baseline alignment in {class}.Paragraph by {user}Croustit in {pr}4692behackl in {pr}4918.MathTex handle multiline strings by {user}henrikmidtiby in {pr}4634.Code lines are no longer deleted when disable_ligatures is False by {user}nikolajmunk in {pr}4926SquareToCircle terminology in the quickstart guide by {user}xuruidong in {pr}4631.Sphere documentation and add examples by {user}Jackyuanx in {pr}3973GenericGraph.__getitem__() by {user}mayank-dev-15 in {pr}4761.FadeOut example name by {user}GniLudio in {pr}4832.Text by {user}SupernovaIa in {pr}4866MovingDots example by {user}shenao010415 in {pr}4895register_font() by {user}ExploreMaths in {pr}4880cartesian_to_spherical() and spherical_to_cartesian() docstrings by {user}changsheng0804-blip in {pr}4764.MovingCameraScene example by {user}nikolajmunk in {pr}4910THE-RAF in {pr}4749VMobject fixes by {user}THE-RAF in {pr}4750GenericGraph.__getitem__() by {user}sridhar-3009 in {pr}4753vihdutta in {pr}4703chopan050 in {pr}4679behackl in {pr}4677JasonGrace2282 in {pr}4619henrikmidtiby in {pr}4642except in rate_functions.py by {user}koteshyelamati in {pr}4891.Code syntax-coloring implementation by {user}GniLudio in {pr}4894behackl in {pr}4920TypstMath to {class}.MathTypst to match existing {class}.Tex / {class}.MathTex coupling by {user}behackl in {pr}4925mobject.py by {user}henrikmidtiby in {pr}4388npt.NDArray[np.float64] for VMobject._bezier_t_values by {user}GoThrones in {pr}4675Callable annotations for mobject updater utilities by {user}treszkai in {pr}4728transform_matching_parts.py by {user}henrikmidtiby in {pr}4400_on_finish annotation in Animation.__init__ by {user}GniLudio in {pr}4812table.py by {user}henrikmidtiby in {pr}4641v0.21.0 by {user}behackl in {pr}4919Croustit made their first contribution in {pr}4622xuruidong made their first contribution in {pr}4631MqCreaple made their first contribution in {pr}4630vihdutta made their first contribution in {pr}4694THE-RAF made their first contribution in {pr}4749leqo-c made their first contribution in {pr}4731treszkai made their first contribution in {pr}4728gvauvert made their first contribution in {pr}4088sridhar-3009 made their first contribution in {pr}4753GniLudio made their first contribution in {pr}4706mayank-dev-15 made their first contribution in {pr}4761siddhu-pikachu made their first contribution in {pr}4704Sazzzzzz made their first contribution in {pr}4810aoxiangtianyu-go made their first contribution in {pr}4839SupernovaIa made their first contribution in {pr}4866koteshyelamati made their first contribution in {pr}4891pjfo made their first contribution in {pr}4901MeiSiristhebest made their first contribution in {pr}4906shenao010415 made their first contribution in {pr}4895ExploreMaths made their first contribution in {pr}4880srinu2003 made their first contribution in {pr}4889changsheng0804-blip made their first contribution in {pr}4764Theelx made their first contribution in {pr}4819dexhunter made their first contribution in {pr}4883nikolajmunk made their first contribution in {pr}4910Helbronner made their first contribution in {pr}4816HamdiBarkous made their first contribution in {pr}4695Full Changelog: Compare view