Build video with code
Declarative HTML + CSS that renders to video. Script it, or use React. Instant preview. Parallel rendering at scale.
Just
Code
HTML and CSS are the foundation. Add scripting for animation. Use React when you want components. No proprietary system to learn.
import { Timegroup, Video, Text } from '@editframe/react'// Define your composition as a React componentconst WelcomeVideo = ({ user }) => (<Timegroup mode="fixed" duration="5s"className="w-[1920px] h-[1080px] relative"><Video src="background.mp4" className="absolute inset-0" /><imgsrc={user.avatar}className="absolute top-12 left-12 w-48 h-48 rounded-full"/><Text className="absolute top-32 left-72 text-7xl font-bold text-white">Welcome, {user.name}!</Text></Timegroup>)// Preview instantly in browser (no build, no account)<Preview><WelcomeVideo user={{ name: 'Alex', avatar: 'avatar.jpg' }} /></Preview>
HTML & CSS
The foundation. Tailwind, flexbox, grid, animations — standard web layout.
Scripting & React
Add scripting for dynamic content. Use React components when you want them.
Render Anywhere
Same code runs in browser, cloud, or local. Your choice.
Prompt it
Skills are documentation your agent can use as tools. Describe what you want. Get working code.
Render
Anywhere
One composition, three execution contexts. Choose the one that fits.
Browser
Export video directly from the browser. No server round-trip. Nothing to install.
CLI
Render from the command line. Same composition, headless Chrome under the hood.
Cloud
Parallel fragment rendering. Split your video into segments, encode concurrently, reassemble.
Under the hood
The rendering infrastructure that makes this possible.
Split, process, recombine
On-demand transcoding, zero wait
One template, infinite videos
Define your video once. Pass different data via CLI or API. Render thousands of personalized videos automatically.
Welcome
Sarah Chen!
Product Lead at Acme Corp
+47%
growth
{
"name": "Sarah Chen",
"role": "Product Lead",
"company": "Acme Corp",
"metric": "+47%",
"initials": "SC",
"color": "#E53935",
"chartData": [
0.3,
0.45,
0.38,
0.62,
0.7,
0.85,
0.92
]
}import { Timegroup, Text } from '@editframe/react';import { Canvas } from '@react-three/fiber';import { getRenderData } from '@editframe/elements';import { FloatingShapes } from './FloatingShapes';import { Avatar } from './Avatar';import { GrowthChart } from './GrowthChart';export function WelcomeVideo() {const data = getRenderData<UserData>();// Current: { name: "Sarah Chen", metric: "+47%" }return (<Timegroup mode="fixed" duration="5s"className="w-[1920px] h-[1080px] relative">{/* 3D background */}<Canvas><FloatingShapes color={data.color} /></Canvas>{/* Avatar + animated text */}<Avatar initials={data.initials} /><Text split="word" stagger="80ms"style={{ animationName: 'slideUp' }}>Welcome, {data.name}!</Text>{/* Growth chart */}<GrowthChart data={data.chartData} /><Text split="char" stagger="40ms"style={{ animationName: 'scaleIn' }}>{data.metric} growth</Text></Timegroup>);}
$ npx editframe render \--data '{"name": "Sarah Chen","role": "Product Lead","company": "Acme Corp","metric": "+47%","color": "#E53935"}' \-o welcome-sarah.mp4
Zero to video
In minutes
One command to scaffold. One command to develop. Hot reload that works.
Create project
One command. Pick a template. Start building.
Start developing
Dev server with instant preview. Edit code, see video update.
Render & deploy
Render locally, in-browser, or push to the cloud.