motion-canvas-rs 0.1.9

A high-performance vector animation engine inspired by Motion Canvas, built on Vello and Typst.
Documentation

Motion Canvas in Rust

Motion Canvas Banner

A high-performance vector animation engine inspired by Motion Canvas, built on Vello and Typst.

[!IMPORTANT] Prototype Status: This project is a functional prototype and proof-of-concept. It is not a 1:1 implementation of the original Motion Canvas API or features.

Links

Installation

Add the library to your Cargo.toml. To enable all features (math, code blocks, images, export), use the full flag:

# Enable everything
cargo add motion-canvas-rs --features full

# Or pick only what you need (e.g., just math, images, and audio)
cargo add motion-canvas-rs --features math,image,audio

Features

Feature Description Enables
math Typst-powered LaTeX math rendering. MathNode
code Syntax-highlighted code blocks via Syntect. CodeNode
image Bitmap (PNG, JPEG) and Vector (SVG) support. ImageNode
audio Independent audio timeline and MP3 playback. play!, AudioNode
export Headless frame rendering and video generation. project.export()
full Meta-feature that enables all of the above. Everything

Key Capabilities

  • High-performance: GPU-accelerated vector rendering via Vello.
  • Arc-length Sampling: Accurate path animations and offsets.
  • Easing Library: 30+ standardized easing functions.
  • FFmpeg Integration: Direct streaming of animation frames or merging with audio.
  • Audio Support: Synchronized MP3 playback and independent audio timelines.
  • Clean API: Streamlined prelude for high-speed prototyping.
  • Node Primitives: Built-in support for Circles, Rects, Polygons, Lines, and Groups.

Supported Nodes

Node Description Transform Properties
AudioNode Independent audio clip playback. volume, crop
CameraNode Viewport transformation (pan, zoom, rotate). position, rotation, zoom, centered
Circle Basic circle primitive. position, rotation, scale, radius, anchor
CodeNode Syntax-highlighted code with transitions. position, rotation, scale, code, anchor
GroupNode Hierarchical grouping of any nodes. position, rotation, scale, children, anchor
ImageNode Bitmap and SVG image display. position, rotation, scale, size, anchor
Line Simple line between two points. position, rotation, scale, start, end, anchor
MathNode Typst-powered mathematical formulas. position, rotation, scale, equation, anchor
PathNode Complex path sampling and animation. position, rotation, scale, arc-length, anchor
Polygon Regular and custom polygon shapes. position, rotation, scale, points, anchor
Rect Rectangle with optional corner radius. position, rotation, scale, size, radius, anchor
TextNode High-quality text rendering (skrifa). position, rotation, scale, text, anchor

Project Structure

The engine is organized into a modular structure:

  • src/lib.rs: Library entry point with clean module re-exports.
  • src/engine/nodes/: Individual node implementations.
  • src/engine/animation/: Core animation traits and flow controls.
  • src/engine/easings.rs: Comprehensive easing function library.
  • examples/: Ready-to-run demonstration scripts.

Quick Start

use motion_canvas_rs::prelude::*;
use std::time::Duration;

fn main() {
    // Project::default() uses default values (800x600, 60fps)
    let mut project = Project::default()
        .with_title("Quick Start")
        .with_background(Color::rgb8(0x1a, 0x1a, 0x1a))
        .close_on_finish();

    // Nodes support a builder pattern and Default traits
    let circle = Circle::default()
        .with_position(Vec2::new(400.0, 300.0))
        .with_radius(100.0)
        .with_fill(Color::RED);

    let text = TextNode::default()
        .with_position(Vec2::new(400.0, 150.0))
        .with_text("Hello Motion Canvas!")
        .with_font_size(48.0)
        .with_fill(Color::WHITE);

    project.scene.add(Box::new(circle.clone()));
    project.scene.add(Box::new(text.clone()));

    project.scene.video_timeline.add(all![
        circle.radius.to(100.0, Duration::from_secs(1)),
        text.position.to(Vec2::new(400.0, 400.0), Duration::from_secs(1)),
    ]);

    project.show().expect("Failed to render");
}

Running Examples

The project includes 21 examples that can be found in the examples directory.

cargo run --example advanced_flow --features=full
Preview
Advanced Flow
Advanced Flow Video
cargo run --example anchors
Preview
Anchors
Anchors Video
cargo run --example audio_demo --features audio
Preview
Audio Demo
Audio Demo Video
cargo run --example camera_demo
Preview
Camera Demo
Camera Demo Video
cargo run --example code_advanced --features code
Preview
Code Advanced
Code Advanced Video
cargo run --example code_animation --features code
Preview
Code Animation
Code Animation Video
cargo run --example color_interpolation
Preview
Color Interpolation
Color Interpolation Video
cargo run --example easing_scope
Preview
Easing Scope
Easing Scope Video
cargo run --example explainer --release --features full
Preview
Explainer
Explainer Video
cargo run --example export --features export
Preview
Export
Export Video
cargo run --example getting_started
Preview
Getting Started
Getting Started Video
cargo run --example grid
Preview
Grid
Grid Video
cargo run --example group_animation
Preview
Group Animation
Group Animation Video
cargo run --example images --features image,svg
Preview
Images
Images Video
cargo run --example math_animation --features math
Preview
Math Animation
Math Animation Video
cargo run --example math_code --features math,code
Preview
Math Code
Math Code Video
cargo run --example nested_cameras
Preview
Nested Cameras
Nested Cameras Video

Based on the "News Feed System" architecture from "System Design Interview: An Insider's Guide" (Second Edition) by Alex Xu.

cargo run --example news_feed
Preview
News Feed
News Feed Video
cargo run --example polygon
Preview
Polygon
Polygon Video
cargo run --example shapes
Preview
Shapes
cargo run --example signals
Preview
Signals
Signals Video

Requirements

  • Rust 1.75+
  • FFmpeg (optional, for direct video streaming)
  • System fonts (Inter, Fira Code, etc. for specific examples)

Credits

This project is heavily inspired by the original Motion Canvas by aarthificial.

Special thanks to:

  • easings.net for the standardized easing function library.
  • shiki-magic-move for the inspiration behind the token-based code transition logic.
  • Alex Xu for the excellent system design diagrams in "System Design Interview: An Insider's Guide", represented in the news_feed example.