Skip to main content

🎬 Animora

Declarative, High-Level Animation Framework for Python

PyPI Version CI Status Docs Python Version License: MIT Code style: ruff Checked with mypy

Quick Start • Why Animora? • Features & Examples • CLI Tooling • Architecture • Documentation


🌟 Overview

Animora is to Manim what Seaborn is to Matplotlib.

Instead of manually calculating pixel coordinates, managing low-level point arrays, and choreographing dozens of vector mobjects, Animora enables you to write clean, declarative, and composable animations for educational videos, computer science lectures, technical presentations, and data stories.

from animora.core import Scene
from animora.datastructures import BST
from animora.theme import ModernDark, use_theme

class BinarySearchTreeDemo(Scene):
    def construct(self) -> None:
        with use_theme(ModernDark):
            # 1. Declaratively initialize a Binary Search Tree
            bst = BST([50, 30, 70, 20, 40])
            self.play(bst.animate_create())

            # 2. Insert key with animated comparison path: 50 -> 30 -> 40 -> 35
            self.play(bst.animate_insert(35))

            # 3. Search target key with instant visual highlight
            self.play(bst.animate_search(35))

💡 Why Animora?

Capability Raw Manim With Animora
Programming Model Imperative, low-level coordinate positioning Declarative, component-based composition
Layouts Manual .next_to(), .shift(), and math calculations Automatic solvers (Grid, Circular, Tree, Graph, Flow)
Theming & Styling Hardcoded hex strings scattered in scripts Centralized design tokens (ModernDark, PaperLight, Cyberpunk)
Data Structures Manual construction of circles, arrows, and text Stateful Array, BST, Graph, Heap, Stack, Queue, HashTable
Algorithm Animations Ad-hoc animation choreography Traced execution (quick_sort, dijkstra, a_star, binary_search)
Extensibility Fixed to Manim APIs First-class Escape Hatch (.manim_object) on all components

🚀 Quick Start

1. Installation

Install Animora from PyPI:

pip install animora

(Optional: Install with development dependencies)

pip install "animora[dev]"

2. Verify Your Environment

Animora includes a built-in doctor to verify Python, Manim, and FFmpeg installations:

animora doctor
============================================================
 Animora System & Environment Diagnostics
============================================================
[PASS]   Python       : Python 3.11.8 (>= 3.10 supported)
[PASS]   Animora      : Animora 0.1.0 installed
[PASS]   Manim        : Manim Community 0.18.1 (compatible)
[PASS]   NumPy        : NumPy 1.26.4 installed
[PASS]   NetworkX     : NetworkX 3.2.1 installed
[PASS]   FFmpeg       : FFmpeg binary found at /usr/bin/ffmpeg
============================================================
Status: Environment is fully ready for Animora visualizations.

🛠️ CLI Tooling

Animora comes with a dedicated CLI for rapid prototyping and production export:

# 1. Scaffold a starter scene from template
animora new my_scene.py

# 2. Fast low-quality preview (instant rendering for iterative design)
animora preview my_scene.py --open

# 3. Full production quality render (1080p 60fps or 4K)
animora render my_scene.py --quality high

📦 Features & Examples

1. Visual Primitives & Container Panels

Compose shapes, text, arrows, and containers with semantic state animations:

from animora.core import Scene
from animora.components import Text, Shape, Panel, Arrow
from animora.theme import ModernDark, use_theme

class PrimitivesScene(Scene):
    def construct(self) -> None:
        with use_theme(ModernDark):
            title = Text("Visual Primitives", font_size=36)
            circle = Shape.circle(radius=0.6, fill_color="#38BDF8")
            rect = Shape.rounded_rectangle(width=2.0, height=1.2, corner_radius=0.15)
            card = Panel(circle, rect, title="Component Container")

            self.play(title.animate_fade_in())
            self.play(card.animate_create())
            self.play(circle.animate_highlight())

2. Automatic Layout Solvers

Pure geometric layout engines that automatically arrange collections of components:

from animora.components import Group, Shape
from animora.layout import GridLayout, CircularLayout

nodes = [Shape.circle(radius=0.3) for _ in range(8)]
group = Group(*nodes)

# Arrange in a 2x4 Grid
group.arrange(GridLayout(columns=4, col_spacing=0.5, row_spacing=0.5))

# Rearrange into a Circle
group.arrange(CircularLayout(radius=2.0))

3. Data Visualization

Mathematically rigorous chart components featuring dual-correctness:

from animora.core import Scene
from animora.dataviz import BarChart, Table

class ChartScene(Scene):
    def construct(self) -> None:
        chart = BarChart(
            data=[("MergeSort", 45), ("QuickSort", 30), ("BubbleSort", 120)],
            bar_width=0.7,
        )
        self.play(chart.animate_grow())
        self.play(chart.animate_highlight_bar(1, color="#10B981"))

4. Algorithm Visualizations & Tracing

Generate step-by-step algorithm animations directly from real execution traces:

from animora.core import Scene
from animora.datastructures import Array
from animora.algorithms import quick_sort

class SortingScene(Scene):
    def construct(self) -> None:
        arr = Array([45, 12, 89, 33, 7, 56])
        self.play(arr.animate_create())

        # Returns a sequence of step-by-step animations (compares, swaps, highlights)
        self.play(*quick_sort(arr))

5. Multi-Theme Scoping

Dynamically switch between built-in design systems (ModernDark, PaperLight, Cyberpunk, Monokai):

from animora.components import Text, Shape, Panel
from animora.theme import Cyberpunk, PaperLight, use_theme

with use_theme(Cyberpunk):
    neon_box = Panel(Shape.circle(), title=Text("Cyberpunk"))

with use_theme(PaperLight):
    clean_box = Panel(Shape.circle(), title=Text("Paper Light"))

🏗️ Architecture & Escape Hatch

Animora follows a strict 4-layer decoupled architecture:

┌────────────────────────────────────────────────────────┐
│ Layer 4: Algorithms & Data Visualization               │
│          (Sorting, Pathfinding, Charts, Trees, Tables) │
├────────────────────────────────────────────────────────┤
│ Layer 3: Layout Engines & Theme System                 │
│          (Grid, TreeLayout, ModernDark, Cyberpunk)     │
├────────────────────────────────────────────────────────┤
│ Layer 2: Visual Primitives & Containers                │
│          (Text, Shape, Connector, Arrow, Group, Panel) │
├────────────────────────────────────────────────────────┤
│ Layer 1: Core Abstractions & Manim Bridge              │
│          (Component, Scene, Animation, .manim_object)  │
└────────────────────────────────────────────────────────┘

The Native Manim Escape Hatch

You are never locked into Animora's abstractions. Every single component exposes its underlying Manim vector entity through .manim_object:

import manim
from animora.components import Shape

circle = Shape.circle(radius=1.0)
native_mobject = circle.manim_object  # Access raw Manim VMobject

# Use raw Manim shaders, gradients, or updaters freely
native_mobject.set_color_by_gradient(manim.BLUE, manim.PINK)

Check out runnable examples located in the examples/ directory:


🤝 Contributing

We welcome community contributions! Please read our Contributing Guide and review our Code of Conduct before submitting pull requests.

Development Setup

git clone https://github.com/himanshu-jadhav108/Animora.git
cd Animora
pip install -e ".[dev]"
pytest
ruff check src/
mypy src/

📄 License

Animora is open-source software licensed under the MIT License.

Metadata

Release files for animora 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for animora 0.1.0
File Size Uploaded
animora-0.1.0.tar.gz 105.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for animora 0.1.0
File Interpreter ABI Platform
animora-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 195.2 kB

Release files / animora-0.1.0.tar.gz

Download URL animora-0.1.0.tar.gz
Size 105.1 kB
Tags Source
SHA-256 checksum
How to use checksums
d7b8687040c853f301fe0de38c1d1350602f1d58746ffa6b2b255f23bb1e6a0f
BLAKE2b-256 checksum
How to use checksums
d7fb61cbb7f6ac5f1001215d5861798ec4e302d38769f196335cfe39ab77c004
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.

Transparency log

Release files / animora-0.1.0-py3-none-any.whl

Download URL animora-0.1.0-py3-none-any.whl
Size 90.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9bc0983a9c1ddf4ddbf0c1654704ae13d0266170da36330ecfe49ffd579d3682
BLAKE2b-256 checksum
How to use checksums
498342d513d3b786242085d7e3b2e30cc01fa861cddf17b5a807b0c5859da25b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 31, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page