Published August 10, 2026 | Version v0.21.0

Manim โ€“ Mathematical Animation Framework

Description

See our rendered changelog.

What's Changed

Breaking Changes ๐Ÿšจ

  • Delegate color handling in Code to Pygments and document custom styles by @Helbronner in https://github.com/manimcommunity/manim/pull/4816

    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 Code for an explicit example.

  • Speed up Cairo renderer by 2.2x on animation-heavy scenes by @HamdiBarkous in https://github.com/manimcommunity/manim/pull/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.

Highlights ๐ŸŒŸ

  • Introduce first-class support for rendering text and markup via Typst (optional dependency) by @behackl in https://github.com/manimcommunity/manim/pull/4681

    The new Typst and 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 @dexhunter in https://github.com/manimcommunity/manim/pull/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 @pjfo in https://github.com/manimcommunity/manim/pull/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%.

New Features โœจ

  • Allow inner lines to be omitted from Table by @leqo-c in https://github.com/manimcommunity/manim/pull/4731
  • Support multiple compiler passes in TexTemplate by @Sazzzzzz in https://github.com/manimcommunity/manim/pull/4810
  • Add a dot_buff parameter to BulletedList by @GniLudio in https://github.com/manimcommunity/manim/pull/4892

Enhancements ๐Ÿš€

  • Support tuple-based edge lookup in GenericGraph.__getitem__() by @HairlessVillager in https://github.com/manimcommunity/manim/pull/3799
  • Raise a clear error when rendered glyphs do not match input characters by @SupernovaIa in https://github.com/manimcommunity/manim/pull/4868
  • Avoid copying Mobject.submobjects in sequence methods by @nikolajmunk in https://github.com/manimcommunity/manim/pull/4915
  • Make additional mobject methods chainable by @GniLudio in https://github.com/manimcommunity/manim/pull/4913

Bug Fixes ๐Ÿ›

  • Fix OpenGL crashes in arrange_in_grid() and get_location() by @Croustit in https://github.com/manimcommunity/manim/pull/4622
  • Prevent get_nth_subpath() from raising IndexError and ensure it returns a NumPy array by @MqCreaple in https://github.com/manimcommunity/manim/pull/4630
  • Preserve closed curves in put_start_and_end_on() by @GoThrones in https://github.com/manimcommunity/manim/pull/4658
  • Fix inconsistent stroke-width scaling for text in compound objects by @vihdutta in https://github.com/manimcommunity/manim/pull/4694
  • Accept a single Group or VGroup in CyclicReplace and Swap by @irvanalhaq9 in https://github.com/manimcommunity/manim/pull/4211
  • Prevent empty submobjects from distorting parent dimensions by @gvauvert in https://github.com/manimcommunity/manim/pull/4088
  • Honor language when constructing Code from code_file by @GniLudio in https://github.com/manimcommunity/manim/pull/4706
  • Fix ThreeDScene.set_to_default_angled_camera_orientation() raising AttributeError by @siddhu-pikachu in https://github.com/manimcommunity/manim/pull/4704
  • Fix reversed default resolution in manim init project --default by @aoxiangtianyu-go in https://github.com/manimcommunity/manim/pull/4839
  • Prevent memoizer collisions between object hashes and IDs by @pjfo in https://github.com/manimcommunity/manim/pull/4901
  • Prevent round_corners() failures for collinear vertices by @MeiSiristhebest in https://github.com/manimcommunity/manim/pull/4906
  • Fix checkhealth false positives for uv launcher shims by @srinu2003 in https://github.com/manimcommunity/manim/pull/4889
  • Fix OpenGL triangulation errors at ring boundaries by @Theelx in https://github.com/manimcommunity/manim/pull/4819
  • Fix Angle crashes for parallel or collinear lines by @MeiSiristhebest in https://github.com/manimcommunity/manim/pull/4907
  • Stabilize cache hashes for transient objects by @pjfo in https://github.com/manimcommunity/manim/pull/4896
  • Ignore SVG shape elements without points by @behackl in https://github.com/manimcommunity/manim/pull/4917
  • Normalize Code baseline alignment in Paragraph by @Croustit in https://github.com/manimcommunity/manim/pull/4692
  • Preserve z-index ordering in animation groups by @behackl in https://github.com/manimcommunity/manim/pull/4918
  • Let MathTex handle multiline strings by @henrikmidtiby in https://github.com/manimcommunity/manim/pull/4634
  • Ensure that glyphs at end of Code lines are no longer deleted when disable_ligatures is False by @nikolajmunk in https://github.com/manimcommunity/manim/pull/4926

Documentation ๐Ÿ“š

  • Correct SquareToCircle terminology in the quickstart guide by @xuruidong in https://github.com/manimcommunity/manim/pull/4631
  • Correct angle ranges in Sphere documentation and add examples by @Jackyuanx in https://github.com/manimcommunity/manim/pull/3973
  • Document edge lookup in GenericGraph.__getitem__() by @mayank-dev-15 in https://github.com/manimcommunity/manim/pull/4761
  • Correct the FadeOut example name by @GniLudio in https://github.com/manimcommunity/manim/pull/4832
  • Document whitespace-stripped indexing in Text by @SupernovaIa in https://github.com/manimcommunity/manim/pull/4866
  • Preserve line color in the MovingDots example by @shenao010415 in https://github.com/manimcommunity/manim/pull/4895
  • Correct the font-directory lookup documented for register_font() by @ExploreMaths in https://github.com/manimcommunity/manim/pull/4880
  • Correct angle ordering in the cartesian_to_spherical() and spherical_to_cartesian() docstrings by @changsheng0804-blip in https://github.com/manimcommunity/manim/pull/4764
  • Clarify frame terminology in the MovingCameraScene example by @nikolajmunk in https://github.com/manimcommunity/manim/pull/4910

Testing ๐Ÿงช

  • Add unit tests for color helper functions by @THE-RAF in https://github.com/manimcommunity/manim/pull/4749
  • Add regression tests for four recent VMobject fixes by @THE-RAF in https://github.com/manimcommunity/manim/pull/4750
  • Add tests for edge lookup in GenericGraph.__getitem__() by @sridhar-3009 in https://github.com/manimcommunity/manim/pull/4753
  • Add a regression test for text stroke-width scaling in compound objects by @vihdutta in https://github.com/manimcommunity/manim/pull/4703

Infrastructure & Build ๐Ÿ”จ

  • Update TinyTeX installation on Windows and macOS to fix CI failures by @chopan050 in https://github.com/manimcommunity/manim/pull/4679
  • Update CI workflow dependencies by @behackl in https://github.com/manimcommunity/manim/pull/4677
  • Switch package builds from Hatchling to uv-build by @JasonGrace2282 in https://github.com/manimcommunity/manim/pull/4619

Code Quality & Refactoring ๐Ÿงน

  • Update the project metadata link to X (formerly Twitter) by @henrikmidtiby in https://github.com/manimcommunity/manim/pull/4642
  • Replace a bare except in rate_functions.py by @koteshyelamati in https://github.com/manimcommunity/manim/pull/4891
  • Simplify the Code syntax-coloring implementation by @GniLudio in https://github.com/manimcommunity/manim/pull/4894
  • Update pre-commit hooks by @behackl in https://github.com/manimcommunity/manim/pull/4920
  • Rename TypstMath to MathTypst to match existing Tex / MathTex coupling by @behackl in https://github.com/manimcommunity/manim/pull/4925

Type Hints ๐Ÿ“

  • Add type annotations to mobject.py by @henrikmidtiby in https://github.com/manimcommunity/manim/pull/4388
  • Use npt.NDArray[np.float64] for VMobject._bezier_t_values by @GoThrones in https://github.com/manimcommunity/manim/pull/4675
  • Improve Callable annotations for mobject updater utilities by @treszkai in https://github.com/manimcommunity/manim/pull/4728
  • Add type annotations to transform_matching_parts.py by @henrikmidtiby in https://github.com/manimcommunity/manim/pull/4400
  • Fix the _on_finish annotation in Animation.__init__ by @GniLudio in https://github.com/manimcommunity/manim/pull/4812
  • Add type annotations to table.py by @henrikmidtiby in https://github.com/manimcommunity/manim/pull/4641

Other Changes

  • Prepare new release: v0.21.0 by @behackl in https://github.com/manimcommunity/manim/pull/4919

New Contributors

  • @Croustit made their first contribution in https://github.com/manimcommunity/manim/pull/4622
  • @xuruidong made their first contribution in https://github.com/manimcommunity/manim/pull/4631
  • @MqCreaple made their first contribution in https://github.com/manimcommunity/manim/pull/4630
  • @vihdutta made their first contribution in https://github.com/manimcommunity/manim/pull/4694
  • @THE-RAF made their first contribution in https://github.com/manimcommunity/manim/pull/4749
  • @leqo-c made their first contribution in https://github.com/manimcommunity/manim/pull/4731
  • @treszkai made their first contribution in https://github.com/manimcommunity/manim/pull/4728
  • @gvauvert made their first contribution in https://github.com/manimcommunity/manim/pull/4088
  • @sridhar-3009 made their first contribution in https://github.com/manimcommunity/manim/pull/4753
  • @GniLudio made their first contribution in https://github.com/manimcommunity/manim/pull/4706
  • @mayank-dev-15 made their first contribution in https://github.com/manimcommunity/manim/pull/4761
  • @siddhu-pikachu made their first contribution in https://github.com/manimcommunity/manim/pull/4704
  • @Sazzzzzz made their first contribution in https://github.com/manimcommunity/manim/pull/4810
  • @aoxiangtianyu-go made their first contribution in https://github.com/manimcommunity/manim/pull/4839
  • @SupernovaIa made their first contribution in https://github.com/manimcommunity/manim/pull/4866
  • @koteshyelamati made their first contribution in https://github.com/manimcommunity/manim/pull/4891
  • @pjfo made their first contribution in https://github.com/manimcommunity/manim/pull/4901
  • @MeiSiristhebest made their first contribution in https://github.com/manimcommunity/manim/pull/4906
  • @shenao010415 made their first contribution in https://github.com/manimcommunity/manim/pull/4895
  • @ExploreMaths made their first contribution in https://github.com/manimcommunity/manim/pull/4880
  • @srinu2003 made their first contribution in https://github.com/manimcommunity/manim/pull/4889
  • @changsheng0804-blip made their first contribution in https://github.com/manimcommunity/manim/pull/4764
  • @Theelx made their first contribution in https://github.com/manimcommunity/manim/pull/4819
  • @dexhunter made their first contribution in https://github.com/manimcommunity/manim/pull/4883
  • @nikolajmunk made their first contribution in https://github.com/manimcommunity/manim/pull/4910
  • @Helbronner made their first contribution in https://github.com/manimcommunity/manim/pull/4816
  • @HamdiBarkous made their first contribution in https://github.com/manimcommunity/manim/pull/4695

Full Changelog: Compare view

Notes

We acknowledge the importance of good software to support research, and we note that research becomes more valuable when it is communicated effectively. To demonstrate the value of Manim, we ask that you cite Manim in your work.

Files

ManimCommunity/manim-v0.21.0.zip

Files (7.6 MB)

Name Size Download all
md5:6266854ddbd36fe97069bae8f1762314
7.6 MB Preview Download

Additional details

Related works