The guide
Start with a prompt, or write your own scene JSON.
Start simple. Add what matters.
Pick a subject, an action and a place. You can stop there.
One clear idea
An ogre waits on a rainy rooftop at night.
A little more direction
A 10-second rooftop scene. An ogre kneels in heavy rain. Purple sky, green light, quiet mood. Slowly move the camera closer. No captions.
Build in layers: action → setting → mood → camera. Change one thing at a time when trying again.
- Give short clips one main action.
- Name a setting below, and a character from the catalog.
- Ask for text only if you want it on screen.
Hit Generate, follow the progress, then open your video. Finished videos are public and appear in Latest videos.
Available settings
Mention a setting in your prompt. For JSON, use its exact template name.
| Template | Setting |
|---|---|
rooftop | A wet city rooftop at night. Rain, neon and a purple sky. |
test-lot | A dim parking garage. Good for trying characters and camera moves. |
vecindad | A creepy version of Chavo’s courtyard. |
Stay within the available sets and cast. Rain and lightning work in outdoor settings.
Browse the catalog
Find a setting, character, prop or animation. Use the exact names in JSON.
Loading catalog…
Give the camera a plan
“Wide shot,” “close-up,” “slow push-in” and “pull back” are useful directions. For multiple shots, say when to cut.
A more detailed example
A 15-second film on the rooftop. One ogre kneels in heavy rain, under a purple sky. 0–5 seconds: start wide, showing the roof and skyline, and slowly move closer. At 5 seconds, cut to a close-up of its face. Hold that shot until 10 seconds. At 10 seconds, cut to a high angle and pull back to reveal the empty roof. Keep the mood quiet and the camera steady. No captions.
Two or three shots are plenty for a short film. Prompt timing is direction. If you’re writing your own JSON scene, camera keys give you explicit timestamps.
Scene JSON
This is a separate way to start a video. Paste your own scene JSON, or start from the example below.
The app doesn’t currently show or let you edit the scene JSON created from a prompt.
This 10-second example starts wide, moves closer, then pulls back.
{
"template": "rooftop",
"duration_s": 10,
"weather": "heavy_rain",
"actors": [
{
"id": "ogroy",
"model": "ogre",
"pos": [60, 110, 24],
"yaw": 90,
"anims": [
{
"t": 0,
"clip": "kneel_hold"
}
]
}
],
"camera": {
"keys": [
{
"t": 0,
"pos": [200, 0, 80],
"look_at": [60, 110, 45],
"fov": 65
},
{
"t": 5,
"pos": [160, 50, 70],
"look_at": [60, 110, 45],
"fov": 45,
"ease": true
},
{
"t": 10,
"pos": [100, -100, 100],
"look_at": [60, 110, 45],
"fov": 65,
"ease": true
}
]
}
}
Paste the scene itself in the form. The API
wraps it in a scene
field.
The main fields
| Field | What it does |
|---|---|
template | Required. One of the settings above. |
duration_s | Required. Length in seconds, from 5 to 30. |
actors | Required. At least one character; up to 6. |
camera.keys | Required. Between 3 and 16 camera keys. |
props | Up to 4 objects, using the same fields as actors. |
weather |
none, light_rain
or heavy_rain. Default: none.
|
fog |
none, light or thick. Default: none.
|
text, lights, effects | Optional. See the examples and limits below. |
Times are seconds from the start. Positions are [x, y, z]: x and y move across the scene, z moves up. Use the
catalog
for model names and animation clips, and the raw schema
for each set’s position bounds.
Characters & movement
Each actor needs a unique id, a catalog model
and a starting pos.
| Field | Use |
|---|---|
yaw | Facing direction in degrees: 0 faces +x; 90 faces +y. Default: 0. |
scale | Size from 0.5 to 3. Default: 1. |
anims |
Animation keys with t, clip
and optional loop
(default: true). Empty means idle.
|
path |
Movement keys with t, pos, optional yaw
and ease. Empty means stay put.
|
Use loop: false
for a one-off action like a bow or fall. Use the exact clip name listed for that model. Actor and prop IDs must all be different.
Camera keys
Start at t: 0
and finish at your scene’s duration. Between keys, the camera moves toward the next position.
| Field | Use |
|---|---|
t | Timestamp in seconds. |
pos | Camera position: [x, y, z]. |
look_at | The point the camera looks toward. |
fov | Field of view. Try 30–50 for close-ups, 70–90 for wide shots. Allowed: 20–110; 0 keeps the previous value. |
cut |
true starts a new shot at this key. Default: false.
|
ease |
true smooths the move into this key. Default: false.
|
sway | Handheld movement: 0 is steady; try 1–2 for a little motion. Maximum: 4. |
track |
An actor’s ID to follow. Then look_at
becomes an offset from that actor, e.g. [0, 0, 30].
|
Give cuts distinct timestamps. End the previous shot at 5 seconds, for example, then put the cut at 5.01. Keep some distance between the camera and its target.
Effects & captions
Add only the lists you need. Leave the rest out.
| Field | Each entry | Max |
|---|---|---|
lightning |
t — flash time. Outdoors only.
| 8 |
explosions |
t, dur, pos; optional follow
actor ID. When following, position is an offset from that actor.
| 6 |
sparks | 4 | |
flamejets | 4 | |
beams | 3 | |
lights |
pos, RGB color
values from 0 to 1, and light
strength from 100 to 600.
| 6 |
text |
t, duration, msg. Up to 2 lines of 40 characters; use
\n
for a new line.
| 6 |
Keep events inside the scene duration. Captions display in uppercase; plain letters, numbers and punctuation work best.
Using the API
Send POST /api/jobs
with JSON containing either prompt
or scene.
{"prompt": "A 10-second scene: an ogre waits on a rainy rooftop."}
For a JSON scene, put the full scene object under scene. If your code already has a variable called scene:
const response = await fetch("/api/jobs", {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({scene})
});
const job = await response.json();
An accepted request returns 202
and a job id. Check GET /api/jobs/<id>
every 2–3 seconds. When its status is done, open /v/<id>
or the returned video_url.
If a scene is rejected, the response includes an errors
list to help fix it.
Download the current schema & catalog ↓
Current limits
5–30 seconds per video. Prompts: 3–5,000 characters. Up to 6 characters, 4 props and 16 camera keys.
Creation limits also apply. If you hit one, the app tells you when to try again. You can still watch existing videos.