🎬 Animora
Declarative, High-Level Animation Framework for Python
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)
🎨 Example Gallery
Check out runnable examples located in the examples/ directory:
01_basics_and_shapes.py— Visual primitives & container panels.02_layout_and_grouping.py— Automatic layout solvers.03_themes_and_styling.py— Multi-theme scoping.04_dataviz_charts.py— Bar charts & data visualization.05_datastructures_bst.py— Binary Search Tree with path tracing.06_algorithms_sorting.py— Quick Sort animation.07_pathfinding_dijkstra.py— Dijkstra graph shortest path.
🤝 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)
| File | Size | Uploaded | |
|---|---|---|---|
| animora-0.1.0.tar.gz | 105.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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 logRelease 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