oxframe vs Manim

Pick oxframe when you want a live editor with a timeline, a browser playground with nothing to install, and video, sound and charts in one scene. Pick Manim when the video is a math lecture with typeset formulas, or the Python ecosystem around it is the point.

At a glance

Checked against the sources below on October 22, 2026.
oxframeManim
LanguageRustPython
RendererOwn renderer, CPU or GPUCairo, or OpenGL
InstallRust and ffmpeg; or nothing, in the browser playgroundPython with Cairo and Pango; LaTeX for formulas
FormulasNot yet: no LaTeX or TypstLaTeX, and Typst as an optional extra
Plots and axesAxes, plot, point_on, bars, scatterAxes, plot, ValueTracker, many more
Morphing shapesAny path into any path, and textTransform between mobjects
Editoroxframe dev: timeline, markers, tunablesNo timeline editor
Sound and voiceMixer, sounds on cues, TTS synced to wordsPlugins (manim-voiceover)
An agent sees the framesoxframe check with a JSON report, MCP serverYou wire that yourself
Frame shapes16:9, 9:16 and 1:1 from one sceneThe scene size
LicenseMIT or Apache-2.0MIT
CommunityNewLarge: 3Blue1Brown style, years of examples

One scene in both

The two scenes from the Manim migration guide: a circle drawn on and turned into a square, then a sine curve with a dot that rides it. 1080p at 60 fps.

Manim

from manim import *


class Hello(Scene):
    def construct(self):
        circle = Circle(radius=1.5, color=RED)
        self.play(Create(circle))
        self.play(Transform(circle, Square(side_length=3, color=BLUE)))
        self.play(circle.animate.shift(RIGHT * 2))
        self.wait()


class Graph(Scene):
    def construct(self):
        axes = Axes(x_range=[-3, 3], y_range=[-1.5, 1.5])
        sine = axes.plot(lambda x: np.sin(x), color=BLUE)
        self.add(axes)
        self.play(Create(sine))
        x = ValueTracker(-3)
        dot = always_redraw(lambda: Dot(axes.i2gp(x.get_value(), sine)))
        self.add(dot)
        self.play(x.animate.set_value(3), run_time=2)
        self.wait(0.5)

oxframe

use oxframe::prelude::*;

fn circle(r: f64) -> BezPath {
    use oxframe::core::kurbo::Shape;
    oxframe::core::kurbo::Circle::new((0.0, 0.0), r).to_path(0.1)
}

#[oxframe::scene]
pub async fn hello(view: View) {
    let shape = view.add(
        Path::new()
            .data(circle(150.0))
            .fill(Color::TRANSPARENT)
            .stroke(color!("#e13238"))
            .line_width(6.0)
            .end(0.0),
    );
    shape.draw_on().await; // Create(circle)
    all((
        // Transform(circle, Square(...)): any path morphs into any other
        shape.data().to(BezPath::from_svg("M-150 -150 H150 V150 H-150 Z").unwrap(), 1.0),
        shape.stroke().to(color!("#68abdf"), 1.0),
    ))
    .await;
    shape.x().to(300.0, 1.0).await; // circle.animate.shift(RIGHT * 2)
    wait_for(1.0).await; // self.wait()
}

#[oxframe::scene]
pub async fn graph(view: View) {
    let axes = view.add(
        Axes::new()
            .x_range(-3.0..3.0)
            .y_range(-1.5..1.5)
            .width(pct(80))
            .height(pct(60)),
    );
    let sine = axes.plot(|x| x.sin()).stroke(Accent);
    sine.draw_on().await; // Create(sine)
    let x = Signal::new(-3.0); // ValueTracker(-3)
    axes.point_on(&sine, x.clone()); // the dot follows x, like always_redraw
    x.to(3.0, 2.0).await; // x.animate.set_value(3), run_time=2
    wait_for(0.5).await;
}

pub fn project() -> Project {
    Project::new("hello").scene(hello()).scene(graph())
}

Render time

7.13 s of 1920 × 1080 video, median of three runs after a warm-up, 2026-10-22, Intel(R) Core(TM) Ultra 7 255H, 16 threads, Linux.
ToolCommandTime
Manim 0.22.0manim render -r 1920,1080 --fps 60 -a scene.py (both scenes)4.30 s
oxframe 0.20.4render --cpu1.30 s
oxframe 0.20.4render (GPU)3.42 s

Each time is the whole render command, start to file. oxframe's scene is already compiled; after a one-line edit, cargo build adds about 0.6 s. On a scene this short the GPU spends more time starting than drawing, so the CPU renderer wins. The script is bench/vs/measure.sh: run it to time both on your machine.

Where each one is strong

Manim is the tool behind the 3Blue1Brown style, and its community has years of scenes, plugins and answers. If the video is about equations, Manim's LaTeX and Typst support is the reason to use it: oxframe does not typeset formulas yet.

oxframe's case is the workflow around the scene. oxframe dev shows the video with a timeline, markers you drag to retime it, and tunables you change without rebuilding; the playground runs the same scene in a browser with nothing to install. One scene can hold a plot, a code block, a video clip and a voice line, and render 16:9, 9:16 and 1:1. And oxframe check tells an agent what is wrong in a frame before you watch it.

Cairo is quick on simple scenes; most of the gap below is start-up and encoding. Manim's real cost is its install, which the playground avoids altogether.

When to pick Manim

  • The video is about formulas and needs LaTeX or Typst.
  • You write Python and want its scientific libraries in the scene.
  • You want the 3Blue1Brown look and the largest set of examples to learn from.

When to pick oxframe

  • You want a timeline editor, or a playground in the browser with nothing to install.
  • The video mixes plots with code, clips, sound and a voice.
  • An agent writes the scenes and should check them itself.
  • You need vertical and square versions of the same scene.

Moving from Manim

The Manim migration guide maps Scene, self.play, Transform, Axes and ValueTracker to oxframe and ports both scenes above. Formulas do not carry over yet.

FAQ

Can oxframe render LaTeX formulas?

Not yet. Typst formulas are planned but postponed while their cost to the browser playground is weighed. For formula-heavy videos, Manim is the better fit today.

Do I need to install anything to try oxframe?

No. The playground on oxframe.dev compiles and plays a scene in the browser. To render video locally you need Rust and ffmpeg.

What does Manim need installed?

Python with Cairo and Pango development libraries (pkg-config, cairo and pango on Linux and macOS) and, for typeset formulas, a LaTeX distribution. Typst support is an optional Python extra.

Does oxframe have something like ValueTracker?

Yes: signals. A Signal holds a value that animates over time, and other properties can be bound to it, as the dot bound to the sine curve in the scene above.

Is oxframe faster than Manim?

On the guide scenes on one laptop, oxframe is faster; the numbers and the script are on this page. For long scenes with many objects, measure your own: Manim's OpenGL renderer and caching change the picture.

Can I make a 3Blue1Brown-style video in oxframe?

The parts are there: axes, plots, morphing paths, a moving camera, transforms of the plane. Typeset formulas are the missing piece.

Sources

Checked on October 22, 2026. Found something out of date? Open an issue on oxframe-web.

Other comparisons

Get started with oxframe