Reserved Region Frame Composer
Pin a strip of faces onto every frame of your video
- frames
- face_sequence
- face_images
- frames_out
This is the payoff node for the small face-sequence pipeline this pack ships (FrameRangedFaceLoader → optionally FaceSequenceBatch → this). It takes your frames and carves out a strip along one edge - a "reserved region" - where it composites in face crops from a face_sequence or plain face_images batch, frame by frame, with a chroma-key-friendly fill in between. Think of it as a reference-face rail running alongside your main video: a common pattern in workflows that want a visible, verifiable identity anchor baked into the frame rather than relying purely on invisible conditioning.
Interestingly, this is also the node in the whole pack with the best click-through rate by a wide margin (18%) despite low raw traffic - a strong signal that the people searching for it already know exactly what they want and this page is answering it.
The controls that actually shape the result
region_position (left/right/top/bottom) and region_size_px (default 320) set where the reserved strip sits and how wide it is. face_distribution decides how faces get spread across the timeline within that strip: single_first uses only the first face for the whole clip, one_face_per_frame matches faces to frames 1:1, one_face_per_interval (the default) shows one face per chunk of interval_frames (default 12), and all_faces_every_frame stacks every available face into the region on every single frame. overflow_mode (loop/clamp/error) decides what happens when you have fewer faces than frames need - looping back to the start, holding the last face, or just failing loudly so you notice the mismatch rather than silently getting something wrong.
Layout inside the region is its own small set of controls: stack_direction (auto/vertical/horizontal/grid), face_scale_pct (default 90, leaving a little breathing room), face_padding_px and face_gap_px (both default 12), and face_align_main/face_align_cross for alignment within the region.
The chroma_r/chroma_g/chroma_b fields (defaulting to pure green, 0/255/0) are worth calling out specifically: this is a chroma-key fill color for whatever space in the reserved region isn't covered by a face, which tells you this node is meant to be composited further - either the reserved strip stays in the final output as a visible reference rail, or it's designed to be masked out downstream using that exact green (or whatever color you set) as the key.
Inputs and outputs
Required: frames plus all the layout controls above. Optional: face_sequence (a FACE_SEQUENCE from this pack's other nodes) or face_images (a plain image batch, if you don't need the frame-range metadata FACE_SEQUENCE carries). One output: frames_out.
Installing it
Search "ComfyUI-BFSNodes" in ComfyUI Manager, or clone manually:
cd ComfyUI/custom_nodes
git clone https://github.com/alisson-anjos/ComfyUI-BFSNodes.git
cd ComfyUI-BFSNodes
pip install -r requirements.txt
Restart ComfyUI. No model or LoRA required - this is a compositing node, not a generative one, so it works on any video frames and any face images you already have.
Practical gotchas
overflow_mode=error is worth using deliberately while you're first setting up a workflow, even though loop is more forgiving for production - it's the fastest way to discover that your face count and frame count don't line up the way you assumed, rather than getting a subtly-wrong composite you might not notice until much later. If the chroma-key fill is showing up unexpectedly in your final output, that's the signal you forgot the downstream keying step, not a bug in this node - the green fill is deliberate, not a placeholder that should have been transparent. And if faces look squeezed or misaligned inside the reserved strip, check stack_direction before touching the scale/padding values - auto picks a direction based on the region's own aspect ratio, which can surprise you if region_position is top or bottom (a wide, short region) versus left/right (a tall, narrow one).
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| frames | IMAGE | — | |
| region_position | COMBO | left | 4 options: left, right, top, bottom |
| region_size_px | INT | 3208–8192 | — |
| face_distribution | COMBO | one_face_per_interval | 4 options: single_first, one_face_per_frame, one_face_per_interval, all_faces_every_frame |
| interval_frames | INT | 121–1000000 | — |
| overflow_mode | COMBO | loop | 3 options: loop, clamp, error |
| stack_direction | COMBO | auto | 4 options: auto, vertical, horizontal, grid |
| face_scale_pct | FLOAT | 901–100 | — |
| face_padding_px | INT | 120–2048 | — |
| face_gap_px | INT | 120–2048 | — |
| face_align_main | COMBO | center | 3 options: start, center, end |
| face_align_cross | COMBO | center | 3 options: start, center, end |
| chroma_r | INT | 00–255 | — |
| chroma_g | INT | 2550–255 | — |
| chroma_b | INT | 00–255 | — |
| face_sequenceopt | FACE_SEQUENCE | — | |
| face_imagesopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| frames_out | IMAGE | — |