LTX Identity Transfer
Copy any subject into an LTX-Video generation
- model
- positive
- negative
- vae
- latent
- reference_image
- model
- positive
- negative
- latent
- debug
- ref_preview
- crop_overlay
Most "identity" nodes in ComfyUI are IP-Adapter or InstantID descendants: they pull a face embedding out of your reference photo and steer a diffusion model toward it. LTX Identity Transfer is a different animal entirely. It doesn't touch CLIP or ArcFace at all - it patches the LTXV model at runtime so your reference image gets encoded as its own set of tokens, sharing the video latent's coordinate space, and the model treats it as "the thing to copy" because that's literally what it was trained to do. And critically, "identity" here isn't limited to faces - the author's own description is blunt about it: any subject works, a person, an object, an animal, whatever your checkpoint was trained on.
The catch is that this only works if you're running a checkpoint trained for it. This node is conditioning glue for a specific class of LTXV LoRA (the "reference/source_phase" style, related to the Edit Anything family this pack also ships nodes for) - load that LoRA onto your model with a standard ComfyUI LoRA loader first, then route the model through this node before your sampler.
What you actually touch
The required inputs are the usual LTXV sampling chain - model, positive, negative, vae, latent - plus reference_image, the thing you want copied in. It'll take a batch of images too, not just one: if your checkpoint was trained on multiple stacked references (layout='strata'), each image in the batch becomes its own reference block.
Three settings decide whether the transfer actually lands:
layout-overlap(default),st_drc, orstrata. This isn't a quality slider, it's a coordinate convention, and it has to match what the checkpoint was literally trained with. Get it wrong and identity transfer doesn't degrade gracefully - it just doesn't work, because the model never learned that convention.ref_resize_mode-match_targetcrops-then-resizes your reference to the output's pixel size (fine for a single centered face, but it silently discards the edges of a mismatched-aspect image like a wide character sheet).match_target_letterboxfits the whole reference in with padding instead of cropping.native_resolutionencodes the reference at its own size - required if your checkpoint trained on a fixed reference resolution (a composite sheet, say) independent of the output video's size.source_id- the training default is 2; leave it unless you know your checkpoint used something else.
There's also reference_guidance_scale, an optional reference-flavored CFG pass (ST-DRC style): at 1.0 it's off, above that it runs a third forward pass per step with the reference dropped and amplifies the reference's own contribution the same way CFG amplifies your text prompt. Start around 2-4 if the model is ignoring your reference.
Outputs are the patched model, updated positive/negative, the latent to hand to your sampler, a debug string, and two preview images worth actually looking at: ref_preview shows exactly what got encoded, and crop_overlay draws a green box over what survived a match_target crop versus what got thrown away. Don't skip checking these - it's the fastest way to catch a resize mode that's quietly eating half your reference.
Installing it
Through ComfyUI Manager, search "ComfyUI-BFSNodes" and install. 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. You'll also need a compatible reference-transfer LoRA - drop it anywhere under ComfyUI/models/loras/ (subfolders are fine) and load it onto your LTXV model with the standard LoRA loader before this node touches it. The pack's README is explicit that a plain LoRA loader by itself isn't the whole story for this conditioning style - the LoRA carries the weights, this node carries the runtime patch that makes them mean anything.
Where people get stuck
The single biggest failure mode is a layout that doesn't match the checkpoint - since it's a coordinate convention rather than a strength knob, the symptom is "nothing happens," not "it's a bit off," which throws people because it doesn't look like a normal LoRA-strength problem. Second most common: match_target's default center-crop quietly cutting off exactly the part of your reference sheet you needed (a face closeup off to one side, say) - check crop_overlay before assuming the model is broken, and switch to crop_anchor or match_target_letterbox once you see what's actually getting cropped. Because this node works by monkey-patching LTXV internals at runtime, it also wants to be the thing touching model right after your LoRA loader - don't sandwich other model-patching nodes between the two without checking they play nicely together.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| vae | VAE | — | |
| latent | LATENT | — | |
| reference_image | IMAGE | Reference to copy into the generation -- any subject (object, animal, character, person...), not just a face. Accepts a BATCH of N images (use an Image Batch node to combine several) for checkpoints trained on multiple STACKED references (layout='strata') -- each image in the batch becomes its own reference block with source_id = source_id + its index (0-based: 1st image keeps 'source_id' as-is, 2nd gets source_id+1, ...). A single image (the default/old behavior) works exactly as before. | |
| source_id | FLOAT | 20–8 | source_phase segment id (training used 2). 0 = no phase. |
| phase_scale | FLOAT | 1.00–4 | — |
| ref_resize_mode | COMBO | match_target | match_target: resize ref to the OUTPUT video's pixel size via a CENTER-CROP then resize (old single-face-crop recipes — ref resolution never mattered, but this silently discards whatever isn't in the middle of the ref for mismatched aspect ratios, e.g. a landscape character sheet used for a portrait output loses the side panels/face closeup). match_target_letterbox: same target pixel size, but fits the WHOLE ref inside it preserving aspect ratio (no crop, pads with white) -- use this for a landscape composite sheet + portrait (or any mismatched-aspect) output so no panel/face-detail gets cut off. native_resolution: encode the ref at ITS OWN size (rounded to the nearest 32px), independent of the video size — REQUIRED for checkpoints trained on a fixed ref resolution bucket that differs from the video's own bucket (e.g. the composite face+3views ref, trained at 2048x1024 regardless of output video size) -- but for aspect-mismatched outputs (e.g. portrait video) this can bias the model toward the ref's own (landscape) composition, causing an off-center/cropped-looking result; try match_target_letterbox first if you hit that. |
| debug_log | BOOLEAN | false | Print per-step [LTXIdOverlap] shape logs to the console (for debugging). |
| crop_anchoropt | COMBO | center | New in v1.10.13, optional -- old workflows without this input keep the previous always-center-crop behavior. Only used by match_target (the crop-then-resize mode). Which part of the reference survives the crop when its aspect ratio doesn't match the output -- e.g. if your sheet's face closeup is in the top row, set 'top' instead of the default center crop so it doesn't get cut off. No effect on match_target_letterbox or native_resolution (neither ever crops). |
| layoutopt | COMBO | overlap | New, optional -- old workflows without this input keep the default 'overlap' behavior (reference shares the target's own RoPE coordinate range, distinguished only by source_phase -- what every checkpoint so far was trained with). 'st_drc' shifts the WHOLE reference block past the target's coordinate extent on every axis (non-overlapping region). 'strata' shifts ONLY the temporal axis to a slot past the target's own length -- one slot per image in the reference_image batch (1st image -> slot 0, 2nd -> slot 1, ...), leaving H/W overlapping the target; this is the 'stacked references' convention (ltx_trainer TASS strata layout). Only use whichever layout the loaded checkpoint was actually trained with -- using the wrong one is not a quality hit, it's a coordinate convention the model never learned, so identity transfer likely won't work at all. |
| reference_guidance_scaleopt | FLOAT | 1.01–10 | ST-DRC-style reference-CFG (arxiv 2606.02441). 1.0 = off (identical to before this input existed). >1.0 adds a THIRD forward pass per step with the reference tokens dropped, and amplifies the reference's own contribution: denoised += (scale-1)*(with_ref - without_ref) -- the same way CFG amplifies the text prompt's. Costs one extra (cheaper, ref-token-free) forward pass per step when enabled. Start around 2-4; same units/convention as CFG scale on the sampler. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |
| debug | STRING | — |
| ref_preview | IMAGE | — |
| crop_overlay | IMAGE | — |