Video Composite
A 39-blend-mode compositor that does keyframed transforms too
- background
- foreground
- mask
- track
- video
The moment you have more than one layer of video, you need compositing - and most ComfyUI workflows quietly fake it with a single "over" merge and no control. Video Composite is the stage that does it properly: it puts a foreground clip over a background with your choice of 39 blend modes, opacity, position, scale, and rotation, and it can animate all of that with keyframes. It's the node you reach for when a chroma key leaves you with a subject that needs to sit inside a scene, not just float on top of it.
It's a ComfyTV Compose stage, which in this pack's canvas model means: own Run button, snapshot output, and it composes in a single pass rather than re-rendering your whole graph.
The inputs that matter
- background and foreground - both required. The error message is blunt: "Video Composite needs background and foreground videos." Foreground is composited on top.
- operator - the blend mode,
overby default. ComfyTV lists 39 blend modes, so the usual suspects are all here: screen, multiply, add, overlay, and friends for the glow-and-light work. - opacity (0–1, default 1), pos_x / pos_y (−8192 to 8192), scale (0.01–10), rotation (−360 to 360) - the static transform of the foreground layer.
- keyframes - JSON
[{t,x,y,scale,rotation,opacity,interp}]for animating the transform over time. This is what turns a static overlay into a tracked, moving one. - mask (optional) - a video/alpha input that gates where the foreground shows through.
- track (optional, COMFYTV_TEXT) - accepts tracking data from a Motion Track stage and converts it into keyframes, so your overlay can follow a moving point automatically.
The project_id / parent_output_id / force_run_token inputs are internal frontend bookkeeping - ignore them.
How it works
Under the hood it calls the pack's torch-based compositor, which applies the blend operation, the transform, and any keyframed path, with the mask gating the composite. The track input is the clever bit: rather than hand-keyframing a position, you feed it a motion-track's output and it converts those points into keyframes with linear interpolation - the classic "stick an overlay to a moving face/object" move.
Install
ComfyTV ships ~190 stages in one pack; this node comes with it.
cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV
Restart ComfyUI fully and look under ComfyTV → Compose. ComfyUI Manager finds it by searching "ComfyTV". No model downloads, no extra Python dependencies. On ComfyUI Desktop or macOS, clone into the running instance's absolute path from the startup log instead of trusting the relative cd.
Troubleshooting
- "needs background and foreground videos" - you forgot one of the two inputs; both are mandatory.
- The overlay is invisible. Check
opacity(0 hides it) and that your blend mode isn't one that only shows on bright/dark pixels.overis the safe diagnostic. - Keyframed motion jumps instead of glides. Add intermediate keyframes or set the
interpfield on your keyframes to something smoother than linear.
It's not a substitute for a real NLE timeline, but for "subject over scene, moving on a tracked path" it's the right tool in this pack.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| operator | COMBO | over | 39 options: atop, average, color, color-burn, color-dodge, conjoint-over, +33 |
| opacity | FLOAT | 1.000–1 | — |
| pos_x | FLOAT | 0-8192–8192 | — |
| pos_y | FLOAT | 0-8192–8192 | — |
| scale | FLOAT | 1.000.01–10 | — |
| rotation | FLOAT | 0.0-360–360 | — |
| keyframes | STRING | JSON [{t,x,y,scale,rotation,opacity,interp}] | |
| backgroundopt | COMFYTV_VIDEO | — | |
| foregroundopt | COMFYTV_VIDEO | — | |
| maskopt | COMFYTV_VIDEO | — | |
| trackopt | COMFYTV_TEXT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | COMFYTV_VIDEO | — |