LTX-2.3 Video to Video (IC-LoRA) ⚡
LTX-2.3 video-to-video in one node instead of ten
- model
- clip
- vae
- audio_vae
- images
- video
- reference_audio
- model
- positive
- negative
- latent
- frame_rate
The official LTX-2.3 video-to-video workflow is a ~10-node tangle: ResizeImageMaskNode → GetImageSize → EmptyLTXVLatentVideo → LTXVConditioning → LTXAddVideoICLoRAGuide → VAEEncodeAudio → LTXVSetAudioRefTokens → LTXVConcatAVLatent, all hand-wired. This node is that entire subgraph collapsed into one prep step, with LoRA selection and EditAnything reference-conditioning built straight in. It's the highest-leverage node in the LTX-2.3 section of this pack.
LTX-2.3 is Lightricks' 22B joint audio-video model (March 2026) - the release the community finally called the best locally-run video model overall, not just the fastest. Its vid2vid mechanism is genuinely different from the img2img you know: the source video's frames get VAE-encoded and appended as extra reference tokens the model cross-attends to at the same timeline position as what it's generating (comfy-core's keyframe_idxs RoPE mechanism), then cropped back off after sampling. Not partially denoised, not held as a first frame. The IC-LoRA task adapter you select (beard removal, HDR grading, motion tracking - anything trained on whole-video reference conditioning) is what makes those guide tokens mean something.
The inputs that matter
mode(required) -t2v,i2v, orv2v, validated against what's actually connected.i2vneedsimages;v2vneedsvideo;t2vrejects either.imagesandvideocan still layer on top of each other - a still for identity/framing plus a clip for the transform.video+ic_lora- the vid2vid core.ic_loraloads the task adapter ontomodelinside this node (stockLoraLoaderModelOnly, no external wiring) atic_lora_strength(default 1.0), then injects the video as guide tokens. Withic_lora="none", a connectedvideoonly supplies length/frame_rate/audio - useful for A/B-ing whether the adapter is doing anything.guide_strength(1.0) is how hard the reference is held.keep_original_audio(on) - keeps the source clip's own audio untouched; off lets the model generate new audio.latent_downscale_factor(1.0) - only for rare IC-LoRAs trained on a downscaled reference grid. Check the LoRA's card; every official example uses 1.0. Except - and this is a real trap - the union-control LoRAs withref0.5in the name want 2.0, and the width/height must be divisible by 64 so the half-res guide lands on whole latents.editanything_lora+editanything_module_path- the EditAnything subject-injection path (see the standalone patch node). Must be set together; mutually exclusive withic_lora. With it active,images[0]becomes the reference photo to inject (plain/white background strongly recommended), and the prompt is an imperative ADD instruction: "Add a detailed appearance, placement in frame, relation to the scene." Sample at half your target resolution, then upscale and refine - at full res the source-video guide dominates and the add never appears.
Outputs are model, positive, negative, latent, frame_rate. The model comes out possibly patched - always take it from this node when a selector is set. Feed into LTX-2.3 KSampler (distilled), then LTX-2.3 Crop Video Guide (strips the appended frames) before LTX-2.3 AV Decode. Wire frame_rate into every decode fps.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/ChrisColeTech/ComfyUI-GGUF-Loader
pip install --upgrade gguf
Restart. You'll also want the LTX-2.3 A/V kit files (GGUF DiT or fp8 safetensors, Gemma-3-12B encoder, both VAEs) from the model links in the README, plus the IC-LoRAs you use (from Lightricks or DeepBeepMeep/LTX-2). Under 🤖 CCTech/LTX-2.3.
Gotchas
The frame math is non-negotiable: width/height divisible by 32, frame count divisible by 8 plus 1 (121 is the default for a reason). When video is connected, length and frame_rate are taken from it, overriding your widgets. And if a v2v output looks like the adapter isn't firing, first check ic_lora isn't none, then check latent_downscale_factor against the LoRA's card.
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| mode | COMBO | t2v | Which base behavior this call is. t2v: images/video must be disconnected. i2v: images required (video may still layer on top as an IC-LoRA guide). v2v: video required (images may still layer on top as a first-frame hold). |
| vae | VAE | The loader's video_vae output. | |
| audio_vae | VAE | The loader's audio_vae output. | |
| prompt | STRING | With ic_lora set: describe the OUTPUT you want - most IC-LoRAs are trained on an instruction-style caption describing the transformed result. With EditAnything: an imperative ADD instruction, e.g. 'Add a <detailed appearance> <placement in frame> <relation to the scene>' (the official trained format - the reference photo supplies identity, the prompt supplies placement/attributes). Otherwise: describe the scene and its motion, a caption not an instruction. | |
| negative_prompt | STRING | — | |
| width | INT | 76864–16384 | — |
| height | INT | 51264–16384 | — |
| length | INT | 1219–16384 | Frames; 8k+1 tiles exactly. Ignored (taken from the clip instead) when video is connected. |
| frame_rate | FLOAT | 24.001–120 | Ignored (taken from the clip instead) when video is connected. |
| batch_size | INT | 11–4096 | — |
| imagesopt | IMAGE | First frame(s) for image-to-video (ordinary i2v hold, independent of video/ic_lora below) - resized and CENTER-CROPPED to width x height. With EditAnything active, images is instead the REFERENCE photo (the subject to inject - one photo, plain/white background strongly recommended, that's what the mechanism was trained on): appended as clean reference tokens the model attends to, NOT held as a first frame (image_strength is ignored under EditAnything). | |
| image_strengthopt | FLOAT | 0.700–1 | images only. How much of the init image(s) to keep. 0.7 is the official value; 1.0 locks the first frames hard. |
| videoopt | VIDEO | Source clip for IC-LoRA video-to-video (see ic_lora) and/or its original audio (see keep_original_audio). Sets length/frame_rate from itself. | |
| ic_loraopt | COMBO | none | video only. The IC-LoRA task adapter (beard removal, HDR grading, motion tracking, ...) - loaded onto model HERE (no external LoraLoaderModelOnly needed) at ic_lora_strength, then drives the actual vid2vid guide-injection mechanism. "none" = video is used only for length/frame_rate/original audio, ignored for guidance - useful for A/B-ing whether the IC-LoRA is doing anything. |
| ic_lora_strengthopt | FLOAT | 1.00-100–100 | ic_lora only. Same as LoraLoaderModelOnly's strength_model. |
| guide_strengthopt | FLOAT | 1.000–1 | ic_lora only. How strongly the reference is held. 1.0 = fully held (official default). |
| keep_original_audioopt | BOOLEAN | true | video only. On = output keeps the source clip's own audio unchanged. Off = the model generates new audio from scratch instead. |
| latent_downscale_factoropt | FLOAT | 11–10 | ic_lora only. Only for IC-LoRAs trained on a downscaled reference grid (rare - check the LoRA's model card / reference_downscale_factor metadata; most, including every official example, use 1.0). |
| reference_audioopt | AUDIO | Drive generation from a voice/sound clip with no source video (LTXV23ImgToVideo's A2V path). Not meant to be combined with video+keep_original_audio. | |
| length_from_audioopt | BOOLEAN | true | With reference_audio and no video: size the video to the clip. |
| editanything_loraopt | COMBO | none | The EditAnything .standard.safetensors LoRA half - loaded onto model HERE at editanything_lora_strength (no external LoraLoaderModelOnly needed). "none" = off. Needs editanything_module_path set too - either alone does nothing useful, they're trained jointly. |
| editanything_lora_strengthopt | FLOAT | 1.00-100–100 | editanything_lora only. Same as LoraLoaderModelOnly's strength_model. |
| editanything_module_pathopt | COMBO | none | The EditAnything .module.safetensors file (NOT a LoRA - real extra layers, loaded by this pack's own patch mechanism), from the loras folder. "none" = off. Needs editanything_lora and `images` connected too. |
| reference_modeopt | COMBO | first_frame_only | Needs editanything_module_path set. Controls how `images`'s batch is used as the EditAnything reference (independent of its ordinary i2v-hold use). per_batch_item: each image in the batch is encoded and used as its OWN distinct reference (not blended) - image i drives sample i of the sampling batch, tiled/truncated if the counts don't match. first_frame_only (default here): use only images[0], ignore the rest - the vid2vid recipe (one clean reference identity against a single video). |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |
| frame_rate | FLOAT | — |