*******
v0.19.0
*******

:Date: January 20, 2025

Major Changes
=============

With the release of Manim v0.19.0, we've made lots of progress with making
Manim easier to install!

One of the biggest changes in this release is the replacement of the external
``ffmpeg`` dependency with the ``pyav`` library. This means that users no longer
have to install ``ffmpeg`` in order to use Manim - they can just ``pip install manim``
and it will work!

In light of this change, we also rewrote our :ref:`installation docs <local-installation>`
to recommend using a new tool called `uv <https://docs.astral.sh/uv/>`_ to install Manim.

.. note::

   Do not worry if you installed Manim with any previous methods, like homebrew, pip,
   choco, or scoop. Those methods will still work, and are not deprecated. However,
   the recommended way to install Manim is now with `uv <https://docs.astral.sh/uv/>`_.

Contributors
============

A total of 54 people contributed to this
release. People with a '+' by their names authored a patch for the first
time.

* Aarush Deshpande
* Abulafia
* Achille Fouilleul +
* Benjamin Hackl
* CJ Lee +
* Cameron Burdgick +
* Chin Zhe Ning
* Christopher Hampson +
* ChungLeeCN +
* Eddie Ruiz +
* F. Muenkel +
* Francisco Manríquez Novoa
* Geoo Chi +
* Henrik Skov Midtiby +
* Hugo Chargois +
* Irvanal Haq +
* Jay Gupta +
* Laifsyn +
* Larry Skuse +
* Nemo2510 +
* Nikhil Iyer
* Nikhila Gurusinghe +
* Rehmatpal Singh +
* Romit Mohane +
* Saveliy Yusufov +
* Sir James Clark Maxwell
* Sophia Wisdom +
* Tristan Schulz
* VPC +
* Victorien
* Xiuyuan (Jack) Yuan +
* alembcke
* anagorko +
* czuzu +
* fogsong233 +
* jkjkil4 +
* modjfy +
* nitzanbueno +
* yang-tsao +


The patches included in this release have been reviewed by
the following contributors.

* Aarush Deshpande
* Achille Fouilleul
* Benjamin Hackl
* Christopher Hampson
* Eddie Ruiz
* Francisco Manríquez Novoa
* Henrik Skov Midtiby
* Hugo Chargois
* Irvanal Haq
* Jay Gupta
* Jérome Eertmans
* Nemo2510
* Nikhila Gurusinghe
* OliverStrait
* Saveliy Yusufov
* Sir James Clark Maxwell
* Tristan Schulz
* VPC
* Victorien
* Xiuyuan (Jack) Yuan
* alembcke
* github-advanced-security[bot]

Pull requests merged
====================

A total of 138 pull requests were merged for this release.

Highlights
----------

* :pr:`3501`: Replaced external ``ffmpeg`` dependency with ``pyav``
   This change removes the need to have ``ffmpeg`` available as a command line tool
   when using Manim. While ``pyav`` technically also uses ``ffmpeg`` internally,
   the maintainers of ``pyav`` distribute it in their binary wheels.


* :pr:`3518`: Created a :class:`.HSV` color class, and added support for custom color spaces
   This extends the color system of Manim and adds support to implement custom color spaces.
   See the implementation of :class:`.HSV` for a practical example.


* :pr:`3930`: Completely reworked the installation instructions
   As a consequence of removing the need for the external ``ffmpeg`` dependency,
   we have reworked and massively simplified the installation instructions. Given
   that practically, user-written scenes are effectively small self-contained Python
   projects, the new instructions strongly recommend using the
   `project and dependency management tool uv <https://docs.astral.sh/uv/>`__ to ensure
   a consistent and reproducible environment.


* :pr:`3967`: Added support for Python 3.13
   This adds support for Python 3.13, which brings the range of currently supported
   Python versions to 3.9 -- 3.13.


* :pr:`3966`: :class:`.VGroup` can now be initialized with :class:`.VMobject` iterables
   Groups of Mobjects can now be created by passing an iterable to the :class:`.VGroup`
   constructors::

      my_group = VGroup(Dot() for _ in range(10))


Breaking changes
----------------

* :pr:`3797`: Replaced ``Code.styles_list`` with :meth:`.Code.get_styles_list`
   The ``styles_list`` attribute of the :class:`.Code` class has been replaced with
   a class method :meth:`.Code.get_styles_list`. This method returns a list of all
   available values for the ``formatter_style`` argument of :class:`.Code`.


* :pr:`3884`: Renamed parameters and variables conflicting with builtin functions
   To avoid having keyword arguments named after builtin functions, the following
   two changes were made to user-facing functions:

   - ``ManimColor.from_hex(hex=...)`` is now  ``ManimColor.from_hex(hex_str=...)``
   - ``Scene.next_section(type=...)`` is now ``Scene.next_section(section_type=...)``


* :pr:`3922`: Removed ``inner_radius`` and ``outer_radius`` from :class:`.Sector` constructor
   To construct a :class:`.Sector`, you now need to specify a ``radius`` (and an ``angle``).
   In particular, :class:`.AnnularSector` still accepts both ``inner_radius`` and ``outer_radius``
   arguments.


* :pr:`3964`: Allow :class:`.SurroundingRectangle` to accept multiple Mobjects
   This changes the signature of :class:`.SurroundingRectangle` to accept
   a sequence of Mobjects instead of a single Mobject. As a consequence, other
   arguments that could be specified as positional ones before now need to be
   specified as keyword arguments::

      SurroundingRectangle(some_mobject, RED, 0.3)  # raises error now
      SurroundingRectangle(some_mobject, color=RED, buff=0.3)  # correct usage


* :pr:`4115`: Completely rewrite the implementation of the :class:`.Code` mobject
   This includes several breaking changes to the interface of the class to make it
   more consistent. See the documentation of :class:`.Code` for a detailed description
   of the new interface, and the description of the pull request :pr:`4115` for
   an overview of changes to the old keyword arguments.


New features
------------

* :pr:`3148`: Added a ``colorscale`` argument to :meth:`.CoordinateSystem.plot`


* :pr:`3612`: Add three animations that together simulate a typing animation


* :pr:`3754`: Add ``@`` shorthand for :meth:`.Axes.coords_to_point` and :meth:`.Axes.point_to_coords`


* :pr:`3876`: Add :meth:`.Animation.set_default` class method


* :pr:`3903`: Preserve colors of LaTeX coloring commands


* :pr:`3913`: Added :mod:`.DVIPSNAMES` and :mod:`.SVGNAMES` color palettes


* :pr:`3933`: Added :class:`.ConvexHull`, :class:`.ConvexHull3D`, :class:`.Label` and :class:`.LabeledPolygram`


* :pr:`3992`: Add darker, lighter and contrasting methods to :class:`.ManimColor`


* :pr:`3997`: Add a time property to scene (:attr:`.Scene.time`)


* :pr:`4039`: Added the ``delay`` parameter to :func:`.turn_animation_into_updater`


Enhancements
------------

* :pr:`3829`: Rewrite :func:`~.bezier.get_quadratic_approximation_of_cubic` to produce smoother animated curves


* :pr:`3855`: Log execution time of sample scene in the ``manim checkhealth`` command


* :pr:`3888`: Significantly reduce rendering time with a separate thread for writing frames to stream


* :pr:`3890`: Better error messages for :class:`.DrawBorderThenFill`


* :pr:`3893`: Improve line rendering performance of :class:`.Cylinder`


* :pr:`3901`: Changed :attr:`.Square.side_length` attribute to a property


* :pr:`3965`: Added the ``scale_stroke`` boolean parameter to :meth:`.VMobject.scale`


* :pr:`3974`: Made videos embedded in Google Colab by default


* :pr:`3982`: Refactored ``run_time`` validation for :class:`.Animation` and :meth:`.Scene.wait`


* :pr:`4017`: Allow animations with ``run_time=0`` and implement convenience :class:`.Add` animation


* :pr:`4034`: Draw more accurate circular :class:`.Arc` mobjects for large angles


* :pr:`4051`: Add ``__hash__`` method to :class:`.ManimColor`


* :pr:`4108`: Remove duplicate declaration of ``__all__`` in :mod:`.vectorized_mobject`


Optimizations
-------------

* :pr:`3760`: Optimize :meth:`.VMobject.pointwise_become_partial`


* :pr:`3765`: Optimize :class:`.VMobject` methods which append to ``points``


* :pr:`3766`: Created and optimized Bézier splitting functions such as :func:`~.utils.bezier.partial_bezier_points()` in :mod:`manim.utils.bezier`


* :pr:`3767`: Optimized :func:`manim.utils.bezier.get_smooth_cubic_bezier_handle_points()`


* :pr:`3768`: Optimized :func:`manim.utils.bezier.is_closed`


* :pr:`3960`: Optimized :func:`~.bezier.interpolate` and :func:`~.bezier.bezier` in :mod:`manim.utils.bezier`



Fixed bugs
----------

* :pr:`3706`: Fixed :meth:`.Line.put_start_and_end_on` to use the actual end of an :class:`.Arrow3D`


* :pr:`3732`: Fixed infinite loop in OpenGL :meth:`.BackgroundRectangle.get_color`


* :pr:`3756`: Fix assertions and improve error messages when adding submobjects


* :pr:`3778`: Fixed :func:`.there_and_back_with_pause` rate function behaviour with different ``pause_ratio`` values


* :pr:`3786`: Fix :class:`.DiGraph` edges not fading correctly on :class:`.FadeIn` and :class:`.FadeOut`


* :pr:`3790`: Fixed the :func:`.get_nth_subpath` function expecting a numpy array


* :pr:`3832`: Convert audio files to ``.wav`` before passing to pydub


* :pr:`3680`: Fixed behavior of ``config.background_opacity < 1``


* :pr:`3839`: Fixed :attr:`.ManimConfig.format` not updating movie file extension


* :pr:`3885`: Fixed :meth:`.OpenGLMobject.invert` not reassembling family


* :pr:`3951`: Call :meth:`.Animation.finish` for animations in an :class:`.AnimationGroup`


* :pr:`4013`: Fixed scene skipping for :attr:`ManimConfig.upto_animation_number` set to 0


* :pr:`4089`: Fixed bug with opacity of :class:`.ImageMobject`


* :pr:`4091`: Fixed :meth:`.VMobject.add_points_as_corners` to safely handle empty ``points`` parameter


Documentation-related changes
-----------------------------

* :pr:`3669`: Added a :mod:`manim.typing` guide


* :pr:`3715`: Added docstrings to Brace


* :pr:`3745`: Underline tag should be ``<u></u>`` in the documentation


* :pr:`3818`: Automatically document usages of :class:`typing.TypeVar`


* :pr:`3849`: Fix incorrect ``versionadded`` version number in plugin section in docs


* :pr:`3851`: Rename ``manim.typing.Image`` type aliases to :class:`.PixelArray` to avoid conflict with ``PIL.Image``


* :pr:`3857`: Update installation instructions for MacOS (via dedicated brew formula)


* :pr:`3878`: Fixed typehint in ``types.rst`` and replaced outdated reference to ``manim.typing.Image`` with :class:`manim.typing.PixelArray`


* :pr:`3924`: Fix ``SyntaxWarning`` when building docs + use Python 3.13 for readthedocs build


* :pr:`3958`: Fix: ``.to_edge``'s example demonstration in docs


* :pr:`3972`: Refining documentations for :mod:`.moving_camera_scene` module


* :pr:`4032`: Bump version and create changelog for ``v0.19.0``


* :pr:`4044`: Added support for autodocumenting type aliases that use the ``type`` syntax


* :pr:`4065`: Polish documentation of :mod:`.utils.color.core` and remove ``interpolate_array`` function


* :pr:`4077`: Update README and documentation landing page, improve way how 3b1b is credited


* :pr:`4100`: Add wavy square example to :class:`.Homotopy`


* :pr:`4107`: Corrected a typo in the deep dive guide


* :pr:`4116`: Fix broken link to Poetry installation in contribution docs


Type Hints
----------

* :pr:`3751`: Added typehints to :mod:`manim.utils.iterables`


* :pr:`3803`: Added typings to :class:`.OpenGLMobject`


* :pr:`3902`: fixed a wrong type hint in :meth:`.Scene.restructure_mobjects`


* :pr:`3916`: fixed type hint in :meth:`.DrawBorderThenFill.interpolate_submobject`


* :pr:`3926`: Fixed some typehints of :class:`.ParametricFunction`


* :pr:`3940`: Fixed ``np.float_`` to ``np.float64`` while using numpy versions above 2.0


* :pr:`3961`: Added typehints to :mod:`manim.mobject.geometry`


* :pr:`3980`: Added new :class:`.PointND` and :class:`.PointND_Array` type aliases


* :pr:`3988`: Added type hints to :mod:`manim.cli` module


* :pr:`3999`: Add type annotations to :mod:`manim.utils`


* :pr:`4006`: Stopped ignoring :mod:`manim.plugins` errors in ``mypy.ini``


* :pr:`4007`: Added typings to :mod:`manim.__main__`


* :pr:`4027`: Rename ``InternalPoint3D`` to :class:`~.typing.Point3D`, ``Point3D`` to :class:`~.Point3DLike` and other point-related type aliases


* :pr:`4038`: Fixed type hint of :meth:`.Scene.play` to allow :attr:`.Mobject.animate`


Internal Improvements and Automation
------------------------------------

* :pr:`3737`: Fixed action for building downloadable documentation


* :pr:`3761`: Use ``--py39-plus`` in pre-commit


* :pr:`3777`: Add pyproject for ruff formatting


* :pr:`3779`: Switch pre-commit to use ``ruff`` for linting


* :pr:`3795`: Replace Pyupgrade with Ruff rule


* :pr:`3812`: Fix MacOS LaTeX CI


* :pr:`3853`: Change from tempconfig to a config fixture in tests


* :pr:`3858`: Update docker to use ENV x=y instead of ENV x y


* :pr:`3872`: Use ruff for pytest style


* :pr:`3873`: Use ruff instead of flake8-simplify


* :pr:`3877`: Fix pre-commit linting


* :pr:`3780`: Add Ruff Lint


* :pr:`3781`: Ignore Ruff format in git blame


* :pr:`3881`: Standardize docstrings with ruff pydocstyle rules


* :pr:`3882`: Change flake8-comprehensions and flake8-bugbear to ruff


* :pr:`3887`: Fix typo from HSV PR


* :pr:`3923`: Use Ruff pygrep rules


* :pr:`3925`: Use Github Markdown on README


* :pr:`3955`: Use ``subprocess`` instead of ``os.system``.


* :pr:`3956`: Set AAC codec for audio in mp4 files, add transcoding utility


* :pr:`4069`: Include Noto fonts in Docker image


* :pr:`4102`: Remove PT004 from Ruff ignore rules


Dependencies
------------

* :pr:`3739`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3746`: Bump tqdm from 4.66.1 to 4.66.3


* :pr:`3750`: Bump jinja2 from 3.1.3 to 3.1.4


* :pr:`3776`: Bump requests from 2.31.0 to 2.32.0


* :pr:`3784`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3794`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3796`: Bump tornado from 6.4 to 6.4.1


* :pr:`3801`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3809`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3810`: Bump urllib3 from 2.2.1 to 2.2.2


* :pr:`3823`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3827`: Fix docker build


* :pr:`3834`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3835`: Bump docker/build-push-action from 5 to 6


* :pr:`3841`: Bump certifi from 2024.2.2 to 2024.7.4


* :pr:`3844`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3847`: Bump zipp from 3.18.2 to 3.19.1


* :pr:`3865`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3880`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3889`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3895`: Lock `poetry.lock`


* :pr:`3896`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3904`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3911`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3918`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3929`: [pre-commit.ci] pre-commit autoupdate


* :pr:`3931`: Bump cryptography from 43.0.0 to 43.0.1


* :pr:`3987`: [pre-commit.ci] pre-commit autoupdate


* :pr:`4023`: Bump tornado from 6.4.1 to 6.4.2


* :pr:`4035`: [pre-commit.ci] pre-commit autoupdate


* :pr:`4037`: Cap ``pyav`` version
