What's Changed
Breaking Changes ๐จ
-
Delegate color handling in
Codeto Pygments and document custom styles by @Helbronner in #4816Codeno longer honors foreground color overrides passed through
paragraph_config={"color": ...}orCode.default_paragraph_config["color"];
syntax and line-number colors now come from the selected Pygments
formatter_style. To customize them, pass a custom PygmentsStylesubclass
throughformatter_styleand 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 ofCode
for an explicit example. -
Speed up Cairo renderer by 2.2x on animation-heavy scenes by @HamdiBarkous in #4695
Cairo path construction now uses vectorized subpath splitting, and pixel-array
handling avoids redundant copies while producing pixel-identical output. This
changesCamera.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; 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 #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 #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 #4899
The new
max_inflight_encodersconfiguration 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-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 #4731 - Support multiple compiler passes in
TexTemplateby @Sazzzzzz in #4810 - Add a
dot_buffparameter toBulletedListby @GniLudio in #4892
Enhancements ๐
- Support tuple-based edge lookup in
GenericGraph.__getitem__()by @HairlessVillager in #3799 - Raise a clear error when rendered glyphs do not match input characters by @SupernovaIa in #4868
- Avoid copying
Mobject.submobjectsin sequence methods by @nikolajmunk in #4915 - Make additional mobject methods chainable by @GniLudio in #4913
Bug Fixes ๐
- Fix OpenGL crashes in
arrange_in_grid()andget_location()by @Croustit in #4622 - Prevent
get_nth_subpath()from raisingIndexErrorand ensure it returns a NumPy array by @MqCreaple in #4630 - Preserve closed curves in
put_start_and_end_on()by @GoThrones in #4658 - Fix inconsistent stroke-width scaling for text in compound objects by @vihdutta in #4694
- Accept a single
GrouporVGroupinCyclicReplaceandSwapby @irvanalhaq9 in #4211 - Prevent empty submobjects from distorting parent dimensions by @gvauvert in #4088
- Honor
languagewhen constructingCodefromcode_fileby @GniLudio in #4706 - Fix
ThreeDScene.set_to_default_angled_camera_orientation()raisingAttributeErrorby @siddhu-pikachu in #4704 - Fix reversed default resolution in
manim init project --defaultby @aoxiangtianyu-go in #4839 - Prevent memoizer collisions between object hashes and IDs by @pjfo in #4901
- Prevent
round_corners()failures for collinear vertices by @MeiSiristhebest in #4906 - Fix
checkhealthfalse positives for uv launcher shims by @srinu2003 in #4889 - Fix OpenGL triangulation errors at ring boundaries by @Theelx in #4819
- Fix
Anglecrashes for parallel or collinear lines by @MeiSiristhebest in #4907 - Stabilize cache hashes for transient objects by @pjfo in #4896
- Ignore SVG shape elements without points by @behackl in #4917
- Normalize
Codebaseline alignment inParagraphby @Croustit in #4692 - Preserve z-index ordering in animation groups by @behackl in #4918
- Let
MathTexhandle multiline strings by @henrikmidtiby in #4634 - Ensure that glyphs at end of
Codelines are no longer deleted whendisable_ligaturesisFalseby @nikolajmunk in #4926
Documentation ๐
- Correct
SquareToCircleterminology in the quickstart guide by @xuruidong in #4631 - Correct angle ranges in
Spheredocumentation and add examples by @Jackyuanx in #3973 - Document edge lookup in
GenericGraph.__getitem__()by @mayank-dev-15 in #4761 - Correct the
FadeOutexample name by @GniLudio in #4832 - Document whitespace-stripped indexing in
Textby @SupernovaIa in #4866 - Preserve line color in the
MovingDotsexample by @shenao010415 in #4895 - Correct the font-directory lookup documented for
register_font()by @ExploreMaths in #4880 - Correct angle ordering in the
cartesian_to_spherical()andspherical_to_cartesian()docstrings by @changsheng0804-blip in #4764 - Clarify frame terminology in the
MovingCameraSceneexample by @nikolajmunk in #4910
Testing ๐งช
- Add unit tests for color helper functions by @THE-RAF in #4749
- Add regression tests for four recent
VMobjectfixes by @THE-RAF in #4750 - Add tests for edge lookup in
GenericGraph.__getitem__()by @sridhar-3009 in #4753 - Add a regression test for text stroke-width scaling in compound objects by @vihdutta in #4703
Infrastructure & Build ๐จ
- Update TinyTeX installation on Windows and macOS to fix CI failures by @chopan050 in #4679
- Update CI workflow dependencies by @behackl in #4677
- Switch package builds from Hatchling to uv-build by @JasonGrace2282 in #4619
Code Quality & Refactoring ๐งน
- Update the project metadata link to X (formerly Twitter) by @henrikmidtiby in #4642
- Replace a bare
exceptinrate_functions.pyby @koteshyelamati in #4891 - Simplify the
Codesyntax-coloring implementation by @GniLudio in #4894 - Update pre-commit hooks by @behackl in #4920
- Rename
TypstMathtoMathTypstto match existingTex/MathTexcoupling by @behackl in #4925
Type Hints ๐
- Add type annotations to
mobject.pyby @henrikmidtiby in #4388 - Use
npt.NDArray[np.float64]forVMobject._bezier_t_valuesby @GoThrones in #4675 - Improve
Callableannotations for mobject updater utilities by @treszkai in #4728 - Add type annotations to
transform_matching_parts.pyby @henrikmidtiby in #4400 - Fix the
_on_finishannotation inAnimation.__init__by @GniLudio in #4812 - Add type annotations to
table.pyby @henrikmidtiby in #4641
Other Changes
New Contributors
- @Croustit made their first contribution in #4622
- @xuruidong made their first contribution in #4631
- @MqCreaple made their first contribution in #4630
- @vihdutta made their first contribution in #4694
- @THE-RAF made their first contribution in #4749
- @leqo-c made their first contribution in #4731
- @treszkai made their first contribution in #4728
- @gvauvert made their first contribution in #4088
- @sridhar-3009 made their first contribution in #4753
- @GniLudio made their first contribution in #4706
- @mayank-dev-15 made their first contribution in #4761
- @siddhu-pikachu made their first contribution in #4704
- @Sazzzzzz made their first contribution in #4810
- @aoxiangtianyu-go made their first contribution in #4839
- @SupernovaIa made their first contribution in #4866
- @koteshyelamati made their first contribution in #4891
- @pjfo made their first contribution in #4901
- @MeiSiristhebest made their first contribution in #4906
- @shenao010415 made their first contribution in #4895
- @ExploreMaths made their first contribution in #4880
- @srinu2003 made their first contribution in #4889
- @changsheng0804-blip made their first contribution in #4764
- @Theelx made their first contribution in #4819
- @dexhunter made their first contribution in #4883
- @nikolajmunk made their first contribution in #4910
- @Helbronner made their first contribution in #4816
- @HamdiBarkous made their first contribution in #4695
Full Changelog: Compare view