---
title: 'Compose Video'
description: 'Create branded videos from Remotion templates'
updated: 2026-07-11
---

# Compose Video

**Node type:** `video:remotion`  
**Category:** `Editing`

## Description

Create branded videos from Remotion templates

## Canvas ports

These appear as port handles on the left side of the node.

| ID            | Label     | Details |
| ------------- | --------- | ------- |
| `hookImage`   | **Image** | `IMAGE` |
| `avatarVideo` | **Video** | `VIDEO` |
| `text`        | **Text**  | `TEXT`  |

## Sidebar config

These render as form fields in the right-side config panel when the node is selected.

_No sidebar config fields._

## Outputs

| ID          | Label         | Type    |
| ----------- | ------------- | ------- |
| `video`     | **Video**     | `VIDEO` |
| `thumbnail` | **Thumbnail** | `IMAGE` |

## Verify before you render

Preview any scene graph for cents (no credits) before a full render: `POST /api/v1/render/remotion/preview` with `{"sceneGraph": {...}}` responds with `{ "data": { "frames": [{frame, url}], "issues": [...], "warnings": [...], "diagnostics": {...}, "renderable": bool } }`. Default samples land on scene boundaries and midpoints (up to 5); pass `"frames": [0, 150, 450]` for exact frames. Fix every `data.issues` entry, re-preview, and only then run the paid render.

For side-by-side or video-over-video edits inside this node, use a `split` scene (50/50, `top`/`bottom` keys) or a `composite` scene (positioned layers). For one-shot compositing of separately generated clips, use the Video Composite node instead.

## Delivery size

By default the render is encoded at high quality, and a grain-heavy 10s
1080x1350 cut comes out around 20 MB. Ad uploads and email attachments want
under 8 MB, so set the node's `config.output`:

- `"ad"` or `"email"`: the file lands under 8 MB.
- `"high"`, or nothing: today's default quality.
- `{ "maxSizeMB": 15 }`, `{ "crf": 28 }` (1 to 51, higher is smaller, default 18) or `{ "videoBitrate": "4000k" }`, ONE of them, for anything else.

In the Video Editor this is the **Delivery** select next to Render. A size
target is turned into a video bitrate from the render's duration, with 15%
kept back for the container and rate-control overshoot and 320k for audio, so
it is the duration that limits it: 8 MB holds a watchable cut of up to about
95 seconds. A longer one, or a bad value, fails the run with the reason before
anything is rendered, shadow runs included. If the finished file still comes
out over its target, the result says so: `sizeBytes`, `overTarget: true` and
a warning, never a silent success. `POST /api/v1/render/remotion/render`
takes the same `output` field.

## Thumbnail

Every successful run of the node also fills the `thumbnail` output with a JPG still of
the composition, stored on the CDN, so a wire from it reaches an image node
without a frame extractor. By default the still is the frame at 10% of the
duration, which skips a black intro. Set `config.thumbnailFrame` to a frame
number (from 0, clamped to the last frame), `"first"` or `"middle"` to pick
another. A bad value fails the run before anything is rendered. The still costs
no credits, and if it fails the video is still delivered: `thumbnail` is left
empty and a warning says why.

---

_Auto-generated from the Wireflow node registry._

---

Documentation index: fetch https://www.wireflow.ai/llms.txt for the full list of Wireflow docs.
