docs/source/contributing/development.md
Install git:
For instructions see https://git-scm.com/.
Fork the project:
Go to https://github.com/ManimCommunity/manim and click the "fork" button to create a copy of the project for you to work on. You will need a GitHub account. This will allow you to make a "Pull Request" (PR) to the ManimCommunity repo later on.
Clone your fork to your local computer:
git clone https://github.com/<your-username>/manim.git
GitHub will provide both a SSH ([email protected]:<your-username>/manim.git) and
HTTPS (https://github.com/<your-username>/manim.git) URL for cloning.
You can use SSH if you have SSH keys setup.
:::{WARNING} Do not clone the ManimCommunity repository. You must clone your own fork. :::
Change the directory to enter the project folder:
cd manim
Add the upstream repository, ManimCommunity:
git remote add upstream https://github.com/ManimCommunity/manim.git
Now, git remote -v should show two remote repositories named:
origin, your forked repositoryupstream the ManimCommunity repositoryInstall the Python project management tool uv, as recommended
in our {doc}installation guide for users </installation/uv>.
Let uv create a virtual environment for your development
installation by running
uv sync
In case you need (or want) to install some of the optional dependency
groups defined in our pyproject.toml,
run uv sync --all-extras, or pass the --extra flag with the
name of a group, for example uv sync --extra jupyterhub.
Install Pre-Commit:
uv run pre-commit install
This will ensure during development that each of your commits is properly formatted against our linter and formatters.
You are now ready to work on Manim!
Checkout your local repository's main branch and pull the latest
changes from ManimCommunity, upstream, into your local repository:
git switch main
git pull --rebase upstream main
Create a branch for the changes you want to work on rather than working off of your local main branch:
git switch -c <new branch name> upstream/main
This ensures you can easily update your local repository's main with the first step and switch branches to work on multiple features.
Write some awesome code!
You're ready to make changes in your local repository's branch.
You can add local files you've changed within the current directory with
git add ., or add specific files with
git add <file/directory>
and commit these changes to your local history with git commit. If you
have installed pre-commit, your commit will succeed only if none of the
hooks fail.
:::{tip} When crafting commit messages, it is highly recommended that you adhere to these guidelines. :::
Add new or update existing tests.
Depending on your changes, you may need to update or add new tests. For new
features, it is required that you include tests with your PR. Details of
our testing system are explained in the {doc}testing guide <testing>.
Update docstrings and documentation:
Update the docstrings (the text in triple quotation marks) of any functions
or classes you change and include them with any new functions you add.
See the {doc}documentation guide <docs/docstrings> for more information about how we
prefer our code to be documented. The content of the docstrings will be
rendered in the {doc}reference manual <../reference>.
:::{tip}
Use the {mod}manim directive for Sphinx <manim.utils.docbuild.manim_directive> to add examples
to the documentation!
:::
As far as development on your local machine goes, these are the main steps you should follow.
(polishing-changes-and-submitting-a-pull-request)=
As soon as you are ready to share your local changes with the community so that they can be discussed, go through the following steps to open a pull request. A pull request signifies to the ManimCommunity organization, "Here are some changes I wrote; I think it's worthwhile for you to maintain them."
:::{note} You do not need to have everything (code/documentation/tests) complete to open a pull request (PR). If the PR is still under development, please mark it as a draft. Community developers will still be able to review the changes, discuss yet-to-be-implemented changes, and offer advice; however, the more complete your PR, the quicker it will be merged. :::
Update your fork on GitHub to reflect your local changes:
git push -u origin <branch name>
Doing so creates a new branch on your remote fork, origin, with the
contents of your local repository on GitHub. In subsequent pushes, this
local branch will track the branch origin and git push is enough.
Make a pull request (PR) on GitHub.
In order to make the ManimCommunity development team aware of your changes, you can make a PR to the ManimCommunity repository from your fork.
:::{WARNING}
Make sure to select ManimCommunity/manim instead of 3b1b/manim
as the base repository!
:::
Choose the branch from your fork as the head repository - see the screenshot below.
:align: center
Please make sure you follow the template (this is the default text you are shown when first opening the 'New Pull Request' page).
Your changes are eligible to be merged if:
You can check for merge conflicts between the current upstream/main and
your branch by executing git pull upstream main locally. If this
generates any merge conflicts, you need to resolve them and push an
updated version of the branch to your fork of the repository.
Our pipeline consists of a series of different tests that ensure that Manim still works as intended and that the code you added sticks to our coding conventions.
black <file or directory> and isort <file or directory>.
To fix code style problems, run flake8 <file or directory> for a style report, and then fix the problems
manually that were detected by flake8.uv run pytest
and uv run pytest --doctest-modules manim, respectively, from the
root directory of your cloned fork.make html from the docs directory. Make sure you have Graphviz
installed locally in order to build the inheritance diagrams. See {doc}docs for
more information.Finally, if the pipeline passes and you are satisfied with your changes: wait for feedback and iterate over any requested changes. You will likely be asked to edit or modify your PR in one way or another during this process. This is not an indictment of your work, but rather a strong signal that the community wants to merge your changes! Once approved, your changes may be merged!
You can find examples for the docs in several places:
the {doc}Example Gallery <../examples>, {doc}Tutorials <../tutorials/index>,
and {doc}Reference Classes <../reference>.
Thank you for contributing!