Multi-format and data-driven renders
One spec, every size
cleya render --scene promo.json --brand brand.json \
--format og,square,story --output promo.mp4
Presets cover the usual sizes (og, square, story, landscape, reel, twitter, …) and
you can pass raw WxH. Layers auto-scale, and any layer can carry per-format overrides when a
size needs its own answer:
{
"id": "h1",
"type": "text",
"text": "MAKE IT MOVE",
"style": { "size": 104 },
"formats": { "story": { "style": { "size": 72 }, "at": { "x": 80, "y": 400 } } }
}
Set safe: true on layers that must clear platform chrome, and check the result with
review --platform.
Data binding
--data resolves $data.<dot.path> tokens across the spec, preserving types — a counter's
"to": "$data.days" becomes a number, not a string:
cleya render --scene stat.json --data metrics.json --output stat.mp4
Batch
--data-each takes an array and renders one output per row:
cleya render --scene promo.json --data-each rows.json --output promo.mp4
# → promo.alice.mp4, promo.bob.mp4, …
Naming uses each row's _name or $output, falling back to the index. It composes with
--format, so N rows × M sizes comes out of one command.
Static sizes
For a set of exact-dimension static ads, responsive HTML plus screenshot often beats the
scene system — CSS already does per-size layout, and screenshot gives you lossless PNGs with no
video encode:
cleya screenshot --html ad.html --width 300 --height 250 --output ad-300x250.png