Back to Manim

v0.21.0

docs/source/changelog/0.21.0-changelog.md

0.21.010.0 KB
Original Source

v0.21.0

Date : August 10, 2026

What's Changed

Breaking Changes ๐Ÿšจ

  • 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.

Highlights ๐ŸŒŸ

  • 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%.

New Features โœจ

  • Allow inner lines to be omitted from {class}.Table by {user}leqo-c in {pr}4731
  • Support multiple compiler passes in {class}.TexTemplate by {user}Sazzzzzz in {pr}4810
  • Add a dot_buff parameter to {class}.BulletedList by {user}GniLudio in {pr}4892

Enhancements ๐Ÿš€

  • Support tuple-based edge lookup in GenericGraph.__getitem__() by {user}HairlessVillager in {pr}3799
  • Raise a clear error when rendered glyphs do not match input characters by {user}SupernovaIa in {pr}4868
  • Avoid copying Mobject.submobjects in sequence methods by {user}nikolajmunk in {pr}4915
  • Make additional mobject methods chainable by {user}GniLudio in {pr}4913

Bug Fixes ๐Ÿ›

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

Documentation ๐Ÿ“š

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

Testing ๐Ÿงช

  • Add unit tests for color helper functions by {user}THE-RAF in {pr}4749
  • Add regression tests for four recent VMobject fixes by {user}THE-RAF in {pr}4750
  • Add tests for edge lookup in GenericGraph.__getitem__() by {user}sridhar-3009 in {pr}4753
  • Add a regression test for text stroke-width scaling in compound objects by {user}vihdutta in {pr}4703

Infrastructure & Build ๐Ÿ”จ

  • Update TinyTeX installation on Windows and macOS to fix CI failures by {user}chopan050 in {pr}4679
  • Update CI workflow dependencies by {user}behackl in {pr}4677
  • Switch package builds from Hatchling to uv-build by {user}JasonGrace2282 in {pr}4619

Code Quality & Refactoring ๐Ÿงน

  • Update the project metadata link to X (formerly Twitter) by {user}henrikmidtiby in {pr}4642
  • Replace a bare except in rate_functions.py by {user}koteshyelamati in {pr}4891
  • Simplify the {class}.Code syntax-coloring implementation by {user}GniLudio in {pr}4894
  • Update pre-commit hooks by {user}behackl in {pr}4920
  • Rename TypstMath to {class}.MathTypst to match existing {class}.Tex / {class}.MathTex coupling by {user}behackl in {pr}4925

Type Hints ๐Ÿ“

  • Add type annotations to mobject.py by {user}henrikmidtiby in {pr}4388
  • Use npt.NDArray[np.float64] for VMobject._bezier_t_values by {user}GoThrones in {pr}4675
  • Improve Callable annotations for mobject updater utilities by {user}treszkai in {pr}4728
  • Add type annotations to transform_matching_parts.py by {user}henrikmidtiby in {pr}4400
  • Fix the _on_finish annotation in Animation.__init__ by {user}GniLudio in {pr}4812
  • Add type annotations to table.py by {user}henrikmidtiby in {pr}4641

Other Changes

  • Prepare new release: v0.21.0 by {user}behackl in {pr}4919

New Contributors

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

Full Changelog: Compare view