oxframe vs Motion Canvas

Pick oxframe when you like the Motion Canvas model (signals, a timeline you write as code, an editor) but need server rendering, an active project and agent checks. Pick Motion Canvas when you want TypeScript and its browser editor is all the rendering you need.

At a glance

Checked against the sources below on October 22, 2026.
oxframeMotion Canvas
LanguageRustTypeScript
Animation modelAsync scene: .await, all, signalsGenerator scene: yield*, all, signals
RendererNative, CPU or GPUBrowser canvas in the editor
Render without a browserYes, CLI and CINot documented
Editoroxframe dev: timeline, markers, tunablesEditor with real-time preview and timeline
LayoutRows, columns, relative placement, wrapping textFlexbox layout
Latest release0.20.4, October 2026v3.17.2, December 2024
An agent sees the framesoxframe check with a JSON report, MCP serverYou wire that yourself
LicenseMIT or Apache-2.0MIT

One scene in both

The scene from the Motion Canvas migration guide. Motion Canvas renders from its editor in the browser, so this page has no timed render for it.

Motion Canvas

import {Circle, Txt, makeScene2D} from '@motion-canvas/2d';
import {all, createRef, createSignal, waitFor} from '@motion-canvas/core';

export default makeScene2D(function* (view) {
  const circle = createRef<Circle>();
  const count = createSignal(0);
  view.add(
    <>
      <Circle ref={circle} size={320} fill={'#e13238'} x={-300} />
      <Txt text={() => count().toFixed(0)} fontSize={80} y={300} fill={'white'} />
    </>,
  );

  yield* circle().x(300, 1);
  yield* all(circle().fill('#68abdf', 1), circle().scale(1.5, 1));
  yield* count(100, 2);
  yield* waitFor(0.5);
});

oxframe

use oxframe::prelude::*;

#[oxframe::scene]
pub async fn hello(view: View) {
    let circle = view.add(Circle::new().size(320.0).fill(color!("#e13238")).x(-300.0));
    let count = Signal::new(0.0);
    let label = view.add(Txt::new().font_size(80.0).y(300.0));
    label.text().bind({
        let count = count.clone();
        move || format!("{:.0}", count.get())
    });

    circle.x().to(300.0, 1.0).await;
    all((
        circle.fill().to(color!("#68abdf"), 1.0),
        circle.scale().to(Vec2::new(1.5, 1.5), 1.0),
    ))
    .await;
    count.to(100.0, 2.0).await;
    wait_for(0.5).await;
}

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

Familiar code, a different runtime

Motion Canvas got the model right: a scene is code that reads top to bottom, properties are signals, and all and chain compose animations. oxframe uses the same ideas with Rust's async in place of generators, so a Motion Canvas scene ports almost line for line.

The difference is around the scene. Motion Canvas renders in its browser editor; its README describes a library and an editor, and no headless path. Its last release, v3.17.2, came out in December 2024, and its main branch has had one commit since February 2025. oxframe renders from the CLI on any machine, in parallel and byte-identical, and is released every few days.

The Canvas Commons fork continues Motion Canvas in TypeScript, and Revideo forked it for headless rendering.

How the code maps

Most of a Motion Canvas scene has a direct counterpart; durations are seconds in both.

Motion Canvasoxframe
makeScene2D(function* (view) { … })#[oxframe::scene] async fn name(view: View) { … }
yield* node().x(300, 1)node.x().to(300.0, 1.0).await
createRef and ref={…}the handle that view.add(…) returns
createSignal(0), () => …Signal::new(0.0), .bind(move || …)
all(…), chain(…)all((…)).await; awaits one after another
waitFor(1), waitUntil('event')wait_for(1.0), wait_until("event")
<Layout direction="column" gap={20}>Layout::new().column().gap(20.0)
<Code> with edits and selectionCode with .code().to(next, s), insert, replace, focus_lines
slideTransition(Direction.Left)transition(Transition::slide(Dir::Left)).await
beginSlide('name') and the presenterslide_break().await and oxframe present
rendering from the editoroxframe render, headless

What does not carry over

  • LaTeX. There is no formula node in oxframe yet.
  • Custom TSX components. A component made of other nodes becomes a Rust function that adds them to a Group; a node that draws itself uses the node API.
  • Editor plugins. oxframe's editor is not extensible yet.

The editor itself carries over in spirit: oxframe dev plays the scene with a timeline, and markers keep their names, so a ported scene can be retimed by dragging them back into place.

When to pick Motion Canvas

  • You want TypeScript and the browser editor, and render by hand from it.
  • You already have a Motion Canvas project and it does what you need.

When to pick oxframe

  • You want the same model with rendering in CI and on a server.
  • An agent writes the scenes and should check its own frames.
  • You want a mixer, voice lines synced to words, video clips and 3D in the scene.
  • You want a project with regular releases.

Moving from Motion Canvas

The Motion Canvas migration guide maps makeScene2D, yield*, refs, signals and all to oxframe, and the motion-canvas-to-oxframe skill ports a scene for an agent.

FAQ

Is Motion Canvas still maintained?

Its last release is v3.17.2 from December 2024, and its main branch has had one commit (a docs domain change in July 2026) since February 2025. The Canvas Commons fork continues it.

Can Motion Canvas render on a server?

Its README describes a library and an editor with a real-time preview, and no headless render. Revideo, a fork, added headless rendering. oxframe renders from the CLI.

How close is the oxframe API to Motion Canvas?

Close: signals, all, waitFor as wait_for, refs as handles. Generators become async functions, and yield* becomes .await.

Does oxframe have an editor like Motion Canvas?

Yes: oxframe dev shows the video with a timeline, markers you drag to retime it and tunables you change while it plays.

Do I have to learn Rust?

Some. Scenes read like the TypeScript you know, and the playground runs them in the browser. An agent with the oxframe skill writes most of the Rust for you.

Sources

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

Other comparisons

Get started with oxframe