Murali
Murali is a Rust-based animation engine for semantic graphics and mathematical scenes. It is built around deterministic timelines, a frontend scene model, CPU-side projection, and a GPU-backed runtime.
Documentation and cookbook
- Project overview: Project Overview
- Scene and app docs: Scene and App
- Internal architecture: Architecture Overview
- AI visualization roadmap: AI Visualization
- Youtube showcase Murali Youtube Channel
- Reference examples in this repo: examples/README.md
- Collection category architecture: src/frontend/collection
Goals
- Predictable, explicit animation behavior
- World-space authoring instead of pixel-first APIs
- Clear separation between authored scene state and render/runtime state
- A modern GPU path built on
wgpu
Building Blocks And Comfort Tattvas
Murali is primarily a framework of building blocks. The stable core should make primitives, text, timelines, layouts, camera movement, and rendering expressive enough that users can assemble most visual elements on the fly.
Murali also intentionally includes a small number of opinionated composite tattvas. These are comfort tattvas: higher-level components that make common video-making scenes easier to author, especially for AI explainers, mathematical storytelling, and reusable visual UI.
That convenience has a cost. Too many composites can make the library bloated or too prescriptive, so new opinionated components usually live in beta first. They may change quickly, move, be renamed, or be removed while their ergonomics and visual language are tested in real productions. Components are promoted into stable sections only after they prove mature and broadly useful.
Current Shape
src/frontend/contains user-facing tattvas, animations, layout helpers, and scene authoring APIssrc/projection/contains backend-neutral render primitives and meshessrc/backend/contains the sync boundary, ECS cache, and renderersrc/engine/contains scene ownership, app lifecycle, timeline stepping, export, and configdocs/contains the longer-form documentation siteexamples/contains the reference runnable examples for the crate
Getting Started
The public authoring path is Python. Install Murali Kit, which pulls in a compatible engine:
python3 -m pip install murali-kit==0.3.0
from murali_engine import Circle, Label, Scene, Timeline
from murali_kit.colors import GREEN_D, WHITE
from murali_kit.themes import DarkTheme, apply_theme
scene = apply_theme(Scene(), DarkTheme())
scene.add(Label("Hello Murali", height=0.38, color=WHITE), at=(0.0, 2.4, 0.0))
scene.add(Circle(radius=1.2, color=GREEN_D).with_stroke(0.04, WHITE))
scene.preview()
Prebuilt murali-engine wheels cover macOS arm64 and x86_64, Linux x86_64 and aarch64, and Windows
x86_64. Those installs do not need a local Rust toolchain.
python3 -m pip install murali-engine==0.3.0
Python examples live in murali-kit. Docs:
muraliengine.com.
Local engine development
python3 -m venv .venv
.venv/bin/python -m pip install maturin
.venv/bin/maturin develop --features python
source .venv/bin/activate
python python/examples/hello_shapes.py
Rust crate
Use the murali crate when you are working on the runtime:
[dependencies]
murali = "0.3.0"
anyhow = "1"
glam = "0.33"
git clone https://github.com/murali-engine/murali
cd murali
cargo run --example hello_shapes --release -- --preview
The published crate excludes examples/**. Reference Rust examples are in this repository. You need
Rust 1.85 or newer, a graphics environment for preview, and ffmpeg for video export.
Some in-progress APIs are feature-gated. For example, the linear-algebra visual toolkit currently
requires the experimental feature:
[dependencies]
murali = { version = "0.3.0", features = ["experimental"] }
Repository examples that use that API should be run with the feature enabled:
cargo run --features experimental --example linear_algebra_vectors
Quickly inspect a GLB/GLTF asset before using it in a scene:
cargo run --example model_inspector -- demo-apple
cargo run --example model_inspector -- /absolute/path/to/model.glb --rot-x -20
The inspector centers and frames the model automatically. Pass --help to see scale, rotation,
camera, and continuous-preview controls.
Some useful places to start:
- Documentation
- Your first scene
- Murali Kit examples
- Release (crates.io + PyPI wheels)
- Future roadmap
- YouTube showcase
Who It's For
Murali is for people who want authored, programmatic control over mathematical, AI, and explainer-style visuals in Rust.
If you like the kind of mathematical storytelling associated with Manim and want a Rust-native workflow, Murali is built in that spirit.
Murali is also being grown as a long-term AI visualization engine. The collection category architecture names the math, probability, statistics, calculus, optimization, information theory, deep learning, LLM, and agentic-AI components that will be developed steadily through the end of 2030.
Preview And Export Config
Murali looks for the nearest murali.toml next to a Cargo.toml. If no config file is present, sensible defaults are used.
Example config:
[preview]
fps = 60
[export]
fps = 60
width = 1920
The scene owns its aspect ratio. Landscape is the default; portrait and square scenes are explicit:
let portrait = Scene::new().with_frame(Frame::portrait());
let square = Scene::new().with_frame(Frame::square());
Export width is literal pixel width. Murali derives height from the scene frame, so a portrait scene at width = 1080 exports at 1080 × 1920.
A sample file is included at murali.toml.example.
Examples
Shapes
Animation showcase
Status
Murali is under active development. The repository already includes:
- scene and timeline infrastructure
- preview and headless export paths
- text, LaTeX, and Typst support
- primitives, layout helpers, tables, graph tattvas, and utility tattvas
- write/unwrite, transform, text, and surface animation building blocks
- semantic tensor snapshots, operations, slicing, transitions, and versioned AI trace ingestion
- context-window, next-token sampling, KV-cache, and LayerNorm/RMSNorm teaching views
License
Murali is dual-licensed under either the MIT License or the Apache License, Version 2.0.
Release files for murali-engine 0.3.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 | |
|---|---|---|---|
| murali_engine-0.3.0.tar.gz | 4.9 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| murali_engine-0.3.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| murali_engine-0.3.0-cp310-abi3-manylinux_2_28_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| murali_engine-0.3.0-cp310-abi3-manylinux_2_28_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| murali_engine-0.3.0-cp310-abi3-macosx_11_0_x86_64.whl | CPython 3.10 | abi3 | macOS 11.0+ x86-64 | Details |
| murali_engine-0.3.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
Total release size: 145.0 MB
Release files / murali_engine-0.3.0.tar.gz
| Download URL | murali_engine-0.3.0.tar.gz |
|---|---|
| Size | 4.9 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b661aa741dea038cd8bf97b049e5d3624278defce1992b0c2c4af7d4d3bf1471
|
|
BLAKE2b-256 checksum How to use checksums |
2a49184b6492106fbb23f98c14118f788302384bb00a3ae09f51b09b7af124bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / murali_engine-0.3.0-cp310-abi3-win_amd64.whl
| Download URL | murali_engine-0.3.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 26.8 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
2e47e985ac9554d99cc5c1a808ce1a1f5aac135516a404395bf63c2d728af997
|
|
BLAKE2b-256 checksum How to use checksums |
f6190a6b7b2dc776f5bb046537163ce4bb75e6be54a8cc6edfe17c62c183e9dc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / murali_engine-0.3.0-cp310-abi3-manylinux_2_28_x86_64.whl
| Download URL | murali_engine-0.3.0-cp310-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 29.3 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
a9b385abafab7ab469ebd5611df5532a00c001c82b5c0785e3be1e01c8f7ffc0
|
|
BLAKE2b-256 checksum How to use checksums |
9bbaccff76d69ef37895a19fc6d9825e5b2be4b29a74ad4e9850356c3f880bd7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / murali_engine-0.3.0-cp310-abi3-manylinux_2_28_aarch64.whl
| Download URL | murali_engine-0.3.0-cp310-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 30.3 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
e0d278596601228fed48b31fbdf219037a7047a0da5592c2f3b01d4620b6931d
|
|
BLAKE2b-256 checksum How to use checksums |
994f0035455f0951358c5bff51fd98518245dccf3e05ec01d1e90bee27a9bc18
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / murali_engine-0.3.0-cp310-abi3-macosx_11_0_x86_64.whl
| Download URL | murali_engine-0.3.0-cp310-abi3-macosx_11_0_x86_64.whl |
|---|---|
| Size | 27.1 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
8f987c0836e2d78b490d1880b32a1fd7a876d3a971d95b94d60058c7cbfd46ac
|
|
BLAKE2b-256 checksum How to use checksums |
9828dbfd228a0bf7bc8113829a469a9991ae27b5588720b353c47cb58b7af742
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / murali_engine-0.3.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | murali_engine-0.3.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 26.6 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
a9c47ed91fe262adb2638c70f7f2f00b8ffded1c776fed65d3172923fabdeed4
|
|
BLAKE2b-256 checksum How to use checksums |
dafa4d5e14a675e39d2be4b5d417d3a6d4803cd29d66bafb12a49074ec861dc3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|