v0.21.0¶
- Date
August 10, 2026
What’s Changed¶
Breaking Changes 🚨¶
Delegate color handling in
Codeto Pygments and document custom styles by @Helbronner in PR #4816Codeno longer honors foreground color overrides passed throughparagraph_config={"color": ...}orCode.default_paragraph_config["color"]; syntax and line-number colors now come from the selected Pygmentsformatter_style. To customize them, pass a custom PygmentsStylesubclass throughformatter_styleand configure its token styles andline_number_color. Background colors can still be overridden withbackground_config={"fill_color": ...}; otherwise, the selected Pygments style provides the background. See the note in the documentation ofCodefor an explicit example.Speed up Cairo renderer by 2.2x on animation-heavy scenes by @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(): theconvert_from_floatsargument has been removed, and the method now always converts floats to the camera’s pixel format. Omit the argument if it was previouslyTrue; usenp.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 PR #4681
The new
TypstandTypstMathmobjects 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 withpip install "manim[typst]".Hash NumPy arrays without JSON expansion by @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 @pjfo in PR #4899
The new
max_inflight_encodersconfiguration option allows partial movie encoding to overlap with rendering while bounding the number of encoder workers. Try it withmanim render --max-inflight-encoders 4 --encoder-queue-size 8 scene.py Scene;--encoder-queue-sizelimits 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
Tableby @leqo-c in PR #4731Support multiple compiler passes in
TexTemplateby @Sazzzzzz in PR #4810Add a
dot_buffparameter toBulletedListby @GniLudio in PR #4892
Enhancements 🚀¶
Support tuple-based edge lookup in
GenericGraph.__getitem__()by @HairlessVillager in PR #3799Raise a clear error when rendered glyphs do not match input characters by @SupernovaIa in PR #4868
Avoid copying
Mobject.submobjectsin sequence methods by @nikolajmunk in PR #4915Make additional mobject methods chainable by @GniLudio in PR #4913
Bug Fixes 🐛¶
Fix OpenGL crashes in
arrange_in_grid()andget_location()by @Croustit in PR #4622Prevent
get_nth_subpath()from raisingIndexErrorand ensure it returns a NumPy array by @MqCreaple in PR #4630Preserve closed curves in
put_start_and_end_on()by @GoThrones in PR #4658Fix inconsistent stroke-width scaling for text in compound objects by @vihdutta in PR #4694
Accept a single
GrouporVGroupinCyclicReplaceandSwapby @irvanalhaq9 in PR #4211Prevent empty submobjects from distorting parent dimensions by @gvauvert in PR #4088
Honor
languagewhen constructingCodefromcode_fileby @GniLudio in PR #4706Fix
ThreeDScene.set_to_default_angled_camera_orientation()raisingAttributeErrorby @siddhu-pikachu in PR #4704Fix reversed default resolution in
manim init project --defaultby @aoxiangtianyu-go in PR #4839Prevent memoizer collisions between object hashes and IDs by @pjfo in PR #4901
Prevent
round_corners()failures for collinear vertices by @MeiSiristhebest in PR #4906Fix
checkhealthfalse positives for uv launcher shims by @srinu2003 in PR #4889Fix OpenGL triangulation errors at ring boundaries by @Theelx in PR #4819
Fix
Anglecrashes for parallel or collinear lines by @MeiSiristhebest in PR #4907Stabilize cache hashes for transient objects by @pjfo in PR #4896
Ignore SVG shape elements without points by @behackl in PR #4917
Normalize
Codebaseline alignment inParagraphby @Croustit in PR #4692Preserve z-index ordering in animation groups by @behackl in PR #4918
Let
MathTexhandle multiline strings by @henrikmidtiby in PR #4634Ensure that glyphs at end of
Codelines are no longer deleted whendisable_ligaturesisFalseby @nikolajmunk in PR #4926
Documentation 📚¶
Correct
SquareToCircleterminology in the quickstart guide by @xuruidong in PR #4631Correct angle ranges in
Spheredocumentation and add examples by @Jackyuanx in PR #3973Document edge lookup in
GenericGraph.__getitem__()by @mayank-dev-15 in PR #4761Document whitespace-stripped indexing in
Textby @SupernovaIa in PR #4866Preserve line color in the
MovingDotsexample by @shenao010415 in PR #4895Correct the font-directory lookup documented for
register_font()by @ExploreMaths in PR #4880Correct angle ordering in the
cartesian_to_spherical()andspherical_to_cartesian()docstrings by @changsheng0804-blip in PR #4764Clarify frame terminology in the
MovingCameraSceneexample by @nikolajmunk in PR #4910
Testing 🧪¶
Add unit tests for color helper functions by @THE-RAF in PR #4749
Add regression tests for four recent
VMobjectfixes by @THE-RAF in PR #4750Add tests for edge lookup in
GenericGraph.__getitem__()by @sridhar-3009 in PR #4753Add a regression test for text stroke-width scaling in compound objects by @vihdutta in PR #4703
Infrastructure & Build 🔨¶
Update TinyTeX installation on Windows and macOS to fix CI failures by @chopan050 in PR #4679
Switch package builds from Hatchling to uv-build by @JasonGrace2282 in PR #4619
Code Quality & Refactoring 🧹¶
Update the project metadata link to X (formerly Twitter) by @henrikmidtiby in PR #4642
Replace a bare
exceptinrate_functions.pyby @koteshyelamati in PR #4891Simplify the
Codesyntax-coloring implementation by @GniLudio in PR #4894Rename
TypstMathtoMathTypstto match existingTex/MathTexcoupling by @behackl in PR #4925
Type Hints 📝¶
Add type annotations to
mobject.pyby @henrikmidtiby in PR #4388Use
npt.NDArray[np.float64]forVMobject._bezier_t_valuesby @GoThrones in PR #4675Improve
Callableannotations for mobject updater utilities by @treszkai in PR #4728Add type annotations to
transform_matching_parts.pyby @henrikmidtiby in PR #4400Fix the
_on_finishannotation inAnimation.__init__by @GniLudio in PR #4812Add type annotations to
table.pyby @henrikmidtiby in PR #4641
Other Changes¶
New Contributors¶
@xuruidong made their first contribution in PR #4631
@MqCreaple made their first contribution in PR #4630
@sridhar-3009 made their first contribution in PR #4753
@mayank-dev-15 made their first contribution in PR #4761
@siddhu-pikachu made their first contribution in PR #4704
@aoxiangtianyu-go made their first contribution in PR #4839
@SupernovaIa made their first contribution in PR #4866
@koteshyelamati made their first contribution in PR #4891
@MeiSiristhebest made their first contribution in PR #4906
@shenao010415 made their first contribution in PR #4895
@ExploreMaths made their first contribution in PR #4880
@srinu2003 made their first contribution in PR #4889
@changsheng0804-blip made their first contribution in PR #4764
@dexhunter made their first contribution in PR #4883
@nikolajmunk made their first contribution in PR #4910
@Helbronner made their first contribution in PR #4816
@HamdiBarkous made their first contribution in PR #4695
Full Changelog: Compare view