LTX-2.3 Remove Person (inpaint) ⚡
Remove a person from a video without wrecking the scene
- model
- clip
- vae
- audio_vae
- video
- mask
- start_image
- model
- positive
- negative
- latent
- frame_rate
- source_frames
- blend_mask
Videos, unlike photos, come with motion - and removing a person from a moving clip is the kind of task that shows exactly why LTX-2.3's masked inpainting is built the way it is. This node is stage one of the pack's verified person-replacement pipeline: it regenerates the masked region (typically a person) using the official LTX-2.3 in/outpainting IC-LoRA, following the recipe Wan2GP proved out. The result is a clean plate: your person gone, the background reconstructed, and - because of the blend step that follows - every pixel outside the mask left pixel-identical.
The mechanism is worth understanding because it's nothing like img2img inpainting. The per-frame mask gets dilated 5px, painted chroma green (#66FF00), green-padded at the tail, and appended as clean guide tokens at strength exactly 1.0, alongside the ltx-2.3-22b-ic-lora-in-outpainting-0.9 LoRA (loaded in-node from your loras folder). The LoRA learned "green = regenerate"; the mask deliberately never touches the denoise mask. Sample, crop the guides, decode, and the green silhouette is what tells the model where to rebuild.
The inputs that matter
video,vae/audio_vae(the loader'svideo_vaeandaudio_vaeoutputs),model,clip- the kit stack.videosets length and frame rate from itself.mask- per-frame mask, white = regenerate. Produce it with comfy-core's SAM3 nodes (SAM3_Detectwith a prompt like "woman", orSAM3_VideoTrack→SAM3_TrackToMask); a single-frame mask tiles across the clip. You'll needsam3.1_multiplex_fp16.safetensorsfrom Comfy-Org/sam3 inmodels/checkpoints.prompt- describe the scene without the removed subject: "An empty room with a wooden floor and beige walls, doorway in the background, static camera." This is where people trip up - describe what should fill the gap, not the person you're erasing.inpaint_lora- the outpainting IC-LoRA, loaded at its trained strength 1.0.nonedisables the whole mechanism (for A/B only - the green fill would just be reproduced verbatim).keep_original_audio(on) - keeps the source clip's own audio; off lets the model generate new audio.mask_dilation(default 5) - the pre-fill dilation radius in pixels; the trained default.start_image- optional identity anchor: becomes the control video's first frame verbatim (no green fill on frame 0). For person replacement, that's an image of the new person in the same scene and starting pose - the green silhouette carries the motion, this frame carries who fills it, and the prompt should then describe the scene with the new subject.
Outputs: model, positive, negative, latent, frame_rate for the sampler, plus source_frames and blend_mask, which you feed straight into LTX-2.3 Mask Blend afterward.
The chain
LTX-2.3 Remove Person → LTX-2.3 KSampler (distilled) → LTX-2.3 Crop Video Guide → LTX-2.3 AV Decode → LTX-2.3 Mask Blend (with source_frames/blend_mask). Decode's video → GetVideoComponents → Mask Blend's images. Then mux the original clip's audio into the final CreateVideo rather than the decoded audio latent - the round-trip through the audio VAE is lossy, and keep_original_audio only holds audio for conditioning, it doesn't guarantee the output track is bit-perfect.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/ChrisColeTech/ComfyUI-GGUF-Loader
pip install --upgrade gguf
Restart. You need the LTX-2.3 A/V kit (DiT, Gemma-3 encoder, video + audio VAEs), the outpainting IC-LoRA, and the SAM3 checkpoint. Node under 🤖 CCTech/LTX-2.3.
Gotchas
Frame math again: width/height divisible by 32, frames divisible by 8 plus 1. If the removed-person region looks like it's being filled with the same content, check the mask isn't all-black (white = regenerate) and that inpaint_lora isn't none. And this node alone is not the whole job - without the Mask Blend stage, you'll see the regenerated region but also the subtle changes everywhere else.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| vae | VAE | The loader's video_vae output. | |
| audio_vae | VAE | The loader's audio_vae output. | |
| video | VIDEO | Source clip. Sets length/frame_rate from itself, same as LTXV23VidToVideo. | |
| mask | MASK | Per-frame mask, white = regenerate (the person/object to remove). SAM3_Detect / SAM3_VideoTrack + SAM3_TrackToMask produce this. A 1-frame mask is tiled across the clip. | |
| prompt | STRING | Describe the scene WITHOUT the removed subject - what the regenerated region should contain. | |
| negative_prompt | STRING | — | |
| width | INT | 76864–16384 | — |
| height | INT | 51264–16384 | — |
| batch_size | INT | 11–4096 | — |
| inpaint_lora | COMBO | none | The official ltx-2.3-22b-ic-lora-in-outpainting LoRA - loaded onto model HERE at strength 1.0 (the trained value). "none" disables the whole mechanism (for A/B only - the green fill would just be reproduced verbatim). |
| keep_original_audioopt | BOOLEAN | true | On = output keeps the source clip's own audio unchanged. Off = the model generates new audio. |
| mask_dilationopt | INT | 50–128 | Pre-fill mask dilation radius in pixels (trained default 5). |
| start_imageopt | IMAGE | Optional identity anchor: becomes the control video's FIRST frame verbatim (no green fill on frame 0). For person replacement: an image of the NEW person in the same scene and starting pose - the green silhouette in later frames carries the motion, this frame carries who fills it. The prompt should then describe the scene WITH the new subject. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |
| frame_rate | FLOAT | — |
| source_frames | IMAGE | — |
| blend_mask | MASK | — |