Nodes/ComfyUI-BFSNodes/BFS H3 Side Panel (virtual reference panel)
ComfyUI Node

BFS H3 Side Panel (virtual reference panel)

Pin a reference beside the latent, keep your own sampler

By alisson-anjos·Created 7 months ago·Updated about 10 hours ago· 129
BFS H3 Side Panel (virtual reference panel)
  • positive
  • latent
  • vae
  • panel
  • guide
  • positive
  • latent
  • panel_info
  • canvas_preview
  • layout_text
◄positionleft►
◄size1.00►
◄fitcontain►
◄gap0►
◄panel_noise0.00►
◄holdall frames►
◄guide_frame_idx0►

The building block, not the product

There are three ways to get the BFS pinned-panel duet. BFS H3 Duet does everything in one node. BFS H3 Duet Conditioning stops before the sampler and handles the prompt for you. This one is the lowest level of the three: it takes conditioning and an AV latent you already built with the native H3 nodes, adds the panel strip (and optionally a guide), and returns them. No prompt writing, no sampling, no decoding.

Reach for it when your H3 graph is already built the way you like it - you've done Reference to Video, you maybe have an Add Guide step, you're using a guider you trust - and you just want to staple a reference panel onto the canvas without giving up control of the rest.

What "pinning a panel" actually means

The latent doesn't grow in pixels only; it grows in RoPE, which is where H3 decides what attends to what. The node encodes the panel into the latent grid as a strip beside (or above/below) the video, then holds it there through a noise mask: the strip stays clean, at the condition timestep, so H3 treats it like its own condition rows while the video area is generated from noise. Because everything is one canvas, the video attends to the panel at the same instant - which is why it behaves like a split-screen duet and copies motion and cuts in sync.

The strip is held, not generated: hold = all frames pins it for the whole clip, first latent frame only pins the start and generates the rest of the strip (which you then crop away anyway). panel_noise is your dial for how exactly it's held - 0 is exact, and the tooltip's framing is worth repeating: the author calls the 0.05–0.15 range "TSC's SOURCE NOISE", something you reach for when the output copies the panel too literally.

Everything downstream of this is your problem, by design. Sample it, then hand your latent and the panel_info output to BFS H3 Side Panel Crop before VAE Decode, or crop decoded images with the same node. Skip the crop and you get a legitimately nice split-screen video of your reference next to your generation - which is not what you wanted.

Inputs and outputs

Required: positive (conditioning), latent (the H3 AV latent at your output size - from H3's Reference to Video, Image to Video or Empty AV Latent), vae, panel (a still for a static panel, or one image per frame for a clip), position, size, fit, gap, panel_noise, hold.

Weirdly, there's no negative input, and that's not an omission - H3 duet work here runs basically unguided, which is why the pack's own sampler wrapper uses a basic guider at CFG 1. Bring your own negative if you know something the rest of us don't.

position is top / left / right / bottom (TSC's original pins the source on the left, and most of the tuned examples assume that). size is the strip relative to the video, 1.0 being two equal halves, snapped to 32 px. fit is contain (whole panel, grey padding, nothing cropped - the sensible default), cover (fills and crops) or stretch (distorts; you probably don't want this). gap is a held grey separator measured in 32 px patches, which is the soft-landing option if panel and video bleeding into each other is the problem.

Optional: guide, an aligned latent guide placed in the video area (5, 22, 39 … frames, i.e. 17k+5, or a single image), and guide_frame_idx to choose where it starts. Guides already added with the native Add Guide node get re-encoded onto the wider canvas, so you don't have to restructure that part of the graph.

Outputs: positive, latent, panel_info (feeds the crop node), canvas_preview (an IMAGE showing the composed canvas with the panel in place - the fastest way to sanity-check a size or side before spending a render), and layout_text, a STRING with the sentence describing the current layout. That last one is for your prompt: drop {layout} in your prompt text if you're using the higher-level nodes, or paste the string in by hand here.

Install

Manager → search ComfyUI-BFSNodes, or:

cd ComfyUI/custom_nodes
git clone https://github.com/alisson-anjos/ComfyUI-BFSNodes
cd ComfyUI-BFSNodes && pip install -r requirements.txt

Restart afterwards. Your ComfyUI needs native MiniMax H3 support (comfy_extras/nodes_minimax_h3.py) and the H3 model, video VAE and text encoder, plus an audio VAE if you want sound out. The pack wholesale installs insightface==0.7.3, onnxruntime, scenedetect, librosa and opencv-python; none of them are needed for this node.

Two errors you'll see on purpose

This node validates hard, which is a feature. Hand it a latent that isn't an H3 AV latent and it says BFS H3 Side Panel expects a MiniMax H3 AV latent. Give it a video size that isn't a multiple of 32 and it says so - H3 packs in 32 px patches, so odd sizes break the grid rather than degrading gracefully. A guide that doesn't fit inside the video's frame count also raises instead of quietly truncating.

And the silent one: if the panel comes back grey, check panel is actually connected with frames in it. There's no error for an empty panel - the strip just fills with mid-grey, which is exactly what contain padding looks like too.

CategoryBFS/MiniMax H3

Inputs (12)

NameTypeDefaultDescription
positiveCONDITIONING—
latentLATENTMiniMax H3 AV latent at the output size (from Reference to Video / Image to Video / Empty AV Latent).
vaeVAE—
panelIMAGEWhat the panel shows: a reference image (static) or a clip (one image per frame).
positionCOMBOleftSide of the video the strip is added to (TSC's duet pins the source clip on the left).
sizeFLOAT1.000.1–1.5Strip size as a fraction of the video's height (top/bottom) or width (left/right), snapped to 32 px.
fitCOMBOcontaincontain keeps the whole panel on gray; cover fills the strip and crops; stretch distorts.
gapINT00–8Gray separator between panel and video, in 32 px patches (held like the panel).
panel_noiseFLOAT0.000–10 pins the panel exactly. 0.05-0.15 lets the model loosen it a little when the result copies too much of it (TSC's SOURCE NOISE).
holdCOMBOall framesall frames: the panel is held for the whole clip. first latent frame: only the start is held, the rest of the strip is generated (and cropped).
guideoptIMAGEAligned latent guide (e.g. the source video), placed in the video area. 5, 22, 39... (17k+5) frames, or one image.
guide_frame_idxoptINT0-9999–9999—

Outputs (5)

NameTypeDescription
positiveCONDITIONING—
latentLATENT—
panel_infoBFS_H3_PANEL—
canvas_previewIMAGE—
layout_textSTRING—