> ## Documentation Index
> Fetch the complete documentation index at: https://docs.orisu.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Composer

> Lay out image, text, and video layers on a canvas and export an image or video.

Composer arranges multiple image, text, and video layers on a canvas with control over position, size, rotation, and opacity. Each connected input becomes a draggable layer in the visual editor. Composer emits an image when the composition is fully static, or a video when any video layer is present.

## When to use

* Social media templates with brand overlays
* Product images with text and badges
* Multi-layer video compositions
* Branded content with logo placement

Common patterns: `upload_image + text_prompt → composer`, or `upload_video + text_prompt + upload_image → composer`.

## Inputs

<ParamField body="Images" type="image">
  Image layers. Accepts multiple inputs and supports loop mode.
</ParamField>

<ParamField body="Texts" type="text">
  Text layers. Accepts multiple inputs and supports loop mode.
</ParamField>

<ParamField body="Videos" type="video">
  Video layers. Accepts multiple inputs and supports loop mode.
</ParamField>

<ParamField body="Audios" type="audio">
  Audio tracks. Accepts multiple inputs and supports loop mode. Connecting audio makes the composition render as a video.
</ParamField>

Connect at least one image, text, video, or audio layer.

### How connections become layers

One connection is one layer. Wire three images into Images and you get a single composition with three stacked layers, not three separate images.

A connection can carry several values at once, like a Split Text node feeding many captions or an upload holding several files. The layer previews the first value, and the Layers panel marks it `1 of N`. To render the composition once per value instead, turn on **Loop** for that connection in the node's port manager. Only the looping layer advances between renders; every other layer stays where you put it, including other connections on the same port. Two product shots looping under one logo give you two images, each with the logo. Turn Loop on for a second connection as well and you get every combination of the two.

The **Loop** switch on the port itself is a different thing: it runs the composition once per *connection* rather than once per value, so three wired images become three separate renders. Leave it off when you want the connections layered together.

New layers stack video at the back, images above it, and text in front, so a caption never ends up buried under a full-frame clip. Within one type, the connection you wired first sits on top. Drag rows in the Layers panel to reorder.

## Outputs

<ParamField body="Image" type="image">
  The composed image. Emitted when the composition has no video layers.
</ParamField>

<ParamField body="Video" type="video">
  The composed video. Emitted when any video layer is present.
</ParamField>

## Configuration

<ParamField body="canvasPreset" type="string" default="instagram_post">
  A preset canvas size for common social media and e-commerce formats (Instagram, TikTok, YouTube, and more). Choosing a preset updates the canvas dimensions. Use `custom` to set your own size.
</ParamField>

<ParamField body="backgroundColor" type="string" default="#FFFFFF">
  The canvas background fill, as a hex color. Visible where no layer covers it.
</ParamField>

<ParamField body="arrangement" type="string" default="overlay">
  `overlay` times each layer with its own start/end; `sequence` plays video clips back-to-back in layer order, with lengths resolved from the real clips at render time.
</ParamField>

<ParamField body="duration" type="number">
  Total exported video length in seconds. Omit for automatic (covers every clip and timed layer); a shorter value trims the output, a longer one extends it. Ignored for image-only compositions.
</ParamField>

<ParamField body="outputStart" type="number">
  Where the exported video begins, in composition seconds (omit for 0). Trims the whole output, picture and audio together.
</ParamField>

<ParamField body="outputEnd" type="number">
  Where the exported video ends, in composition seconds (omit for the composition's end).
</ParamField>

<ParamField body="sequenceCrossfade" type="number" default="0">
  Only used when `arrangement` is `sequence`. Seconds of cross-dissolve between consecutive clips (0 = hard cuts).
</ParamField>

<ParamField body="layers" type="array">
  Per-layer configuration (position, size, fit/crop, timing, trims, animations, motion, volume, text styling), one entry per connected input. Normally managed in the visual editor; for the full JSON shape see [Composing video → For agents and the API](/guides/composing-video#for-agents-and-the-api).
</ParamField>

<Note>
  Per-layer position, size, rotation, opacity, borders, and text styling are set in the visual editor on the node. For programmatic use (API, MCP, or the in-app copilot), pass the same fields as JSON; the [Composing video guide](/guides/composing-video#for-agents-and-the-api) has a complete worked example.
</Note>

## Editing on the canvas

Open the editor from the node to arrange layers visually:

* **Drag to position, handles to resize/rotate.** Arrow keys nudge the selected layer (hold Shift for 10px steps); Escape deselects.
* **Snapping.** While dragging, a layer snaps to the canvas's edges and center and to other layers' edges, with blue guide lines showing the alignment.
* **Align buttons.** The Layout panel has one-click align to the canvas left / center / right and top / middle / bottom, on each axis.
* **Crop.** Select an image or video layer and click **✂ Crop** to drag a marquee over the full source; trimmed edges dim as you go. Click **Done cropping** or press Escape to finish. Exact `Crop %` fields are also in the Appearance panel.
* **Rich text.** Text layers support alignment (left / center / right), line height, an outline (color + width), and a drop shadow (color + blur) alongside font, size, weight, color, and background.
* **Frames.** Every layer is a frame that holds content, and the **Frame** panel controls both halves of that. **Frame size** says how the container sizes itself: *Hug* takes the text's or the source's own size, *Fixed width* wraps text at a width you set, *Fixed* pins both width and height. **Content fit** says how the content sits in a fixed frame — *Fill*, *Fit* or *Stretch* for pictures and clips, *Shrink text to fit* for captions, which steps the font down until the text fits, stopping only at a legibility floor.
* **Anchor.** A nine-square grid picks where content sits in its frame: which part of a picture survives a Fill crop, or where a caption sits vertically. Cropping a landscape clip into a vertical ad, the default centre often cuts the subject's head off; choose the top-centre square to keep it.
* **Lock frame.** Locks a frame's position and size so it can't be moved or resized on the canvas. Content keeps reflowing inside it, which is what makes a placeholder useful: place the frame once, and whatever text or picture arrives fits into it. Select the layer in the Layers panel to unlock it.
* **Overset.** If a caption still doesn't fit its frame at the smallest size allowed, the frame is outlined in red so you find out in the editor rather than in the finished render.
* **Preview each variant.** When a connection carries several values and Loop is on, the composition renders once per value. A **Variant 1 of N** control appears above the canvas so you can page through them and see how every render looks — useful for checking that the longest caption still fits before you spend the encodes.
* **Resizable panels.** Drag the dividers beside the Layers and Properties panels to resize them, or double-click a divider to collapse / restore it. This gives the canvas and timeline more room.
* **Space to play.** When the composition has video or audio, the spacebar toggles timeline playback (unless you're typing in a field).

## Timing video layers

When a composition includes video, a timeline appears below the canvas in the visual editor, one row per layer. Drag a bar's edges to set when the layer appears and disappears (in seconds), drag the bar to move its window, or double-click it to make the layer visible for the whole video again. You can also type exact `Start s` / `End s` values in the layer's Layout panel.

Press **play** on the timeline to watch the composition: video layers play their actual frames (with sound), audio tracks come in on cue, and fades happen in place. Scrub the ruler above the rows to preview which layers are on screen at any moment. The output video runs long enough to cover the latest-ending layer, even past the end of the source clips. Layers without timing stay visible for the entire composition, and timing has no effect on still-image outputs.

Video and audio bars show the full source clip: the bright region plays, the darker head/tail are trimmed away. Drag the bright region's edges to trim, or type **Trim in s** / **Trim out s** in the Layout panel. A timed clip plays from its trim-in point at its start time, and a clip with no end time plays out its full length, read from the real media at render time.

The video's length is automatic unless you set **Duration s** in the canvas panel. It runs to the end of your footage. A caption or logo sitting on top of a clip doesn't make it longer, since there would be nothing but background colour after the last frame. An image or text placed *after* the clips does extend the video, so a still outro works. The timeline keeps hatched headroom past the end so you can extend by dragging, and blue snap guides appear when edges align.

To trim the **whole exported video** (not a layer), drag the bracket handles on the timeline ruler, or set **Video Range** in the canvas panel; everything outside the range is cut from the output, picture and audio together.

## Sequencing clips

To play videos one after another, switch the timeline's **Arrangement** toggle to **Sequence**: video clips chain back-to-back in layer order (top row first), each sized by its real duration at render time. Because timing resolves when the composition renders, sequencing works even before upstream videos exist, and regenerated clips of a different length can never drift out of sync. Images and text keep their own timing for persistent overlays like logos and captions.

Until the upstream nodes have run, the timeline shows clip lengths as estimates (dashed bars, with a note below the timeline) based on each source node's settings. Run the workflow once to load real durations. In Overlay mode, bars snap to other layers' edges while dragging, making manual back-to-back placement easy too.

## Animations

Every visual layer can animate in when it appears and out when it disappears: pick **Animate in** / **Animate out** in the layer's Layout panel (Fade, or Slide left/right/up/down), each with its own duration (0.25 to 2s). Animations anchor to the layer's timing window, so an exit finishes exactly at the layer's end time, and the preview shows them in place.

## Audio

Connect audio nodes to add music or voice-over tracks, timed on the same timeline rows as visual layers. A video layer's own sound is included automatically and gated to its timing window; everything is mixed into the output. Each audio track and video layer has a **Volume** control (0 to 200%), and a composition with audio always renders as a video, even if every visual layer is a still image.
