← Back to creating

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.

TemplateSetting
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.
vecindadA 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…

Raw schema & catalog JSON ↗

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

FieldWhat it does
templateRequired. One of the settings above.
duration_s Required. Length in seconds, from 5 to 30.
actorsRequired. At least one character; up to 6.
camera.keysRequired. 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.

FieldUse
yaw Facing direction in degrees: 0 faces +x; 90 faces +y. Default: 0.
scaleSize 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.

FieldUse
tTimestamp in seconds.
posCamera position: [x, y, z].
look_atThe 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.

FieldEach entryMax
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
sparks4
flamejets4
beams3
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.