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
| oxframe | Motion Canvas | |
|---|---|---|
| Language | Rust | TypeScript |
| Animation model | Async scene: .await, all, signals | Generator scene: yield*, all, signals |
| Renderer | Native, CPU or GPU | Browser canvas in the editor |
| Render without a browser | Yes, CLI and CI | Not documented |
| Editor | oxframe dev: timeline, markers, tunables | Editor with real-time preview and timeline |
| Layout | Rows, columns, relative placement, wrapping text | Flexbox layout |
| Latest release | 0.20.4, October 2026 | v3.17.2, December 2024 |
| An agent sees the frames | oxframe check with a JSON report, MCP server | You wire that yourself |
| License | MIT or Apache-2.0 | MIT |
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 Canvas | oxframe |
|---|---|
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 selection | Code with .code().to(next, s), insert, replace, focus_lines |
slideTransition(Direction.Left) | transition(Transition::slide(Dir::Left)).await |
beginSlide('name') and the presenter | slide_break().await and oxframe present |
| rendering from the editor | oxframe 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.
- Motion Canvas on GitHub
- Motion Canvas releases
- Motion Canvas commits
- Canvas Commons
- oxframe license and what leaves your machine
- oxframe-sdk on GitHub