ComfyUI Node

LTX Keyframer

Drop keyframes into any video latent, without the guesswork

By WhatDreamsCost·Created 5 months ago·Updated 26 days ago· 1,996
LTX Keyframer
  • vae
  • latent
  • multi_input
  • latent
num_images1
insert_frame_10
strength_11.00
insert_frame_20
strength_21.00
insert_frame_30
strength_31.00
insert_frame_40
strength_41.00
insert_frame_50
strength_51.00
insert_frame_60
strength_61.00
insert_frame_70
strength_71.00
insert_frame_80
strength_81.00
insert_frame_90
strength_91.00
insert_frame_100
strength_101.00
insert_frame_110
strength_111.00
insert_frame_120
strength_121.00
insert_frame_130
strength_131.00
insert_frame_140
strength_141.00
insert_frame_150
strength_151.00
insert_frame_160
strength_161.00
insert_frame_170
strength_171.00
insert_frame_180
strength_181.00
insert_frame_190
strength_191.00
insert_frame_200
strength_201.00
insert_frame_210
strength_211.00
insert_frame_220
strength_221.00
insert_frame_230
strength_231.00
insert_frame_240
strength_241.00
insert_frame_250
strength_251.00
insert_frame_260
strength_261.00
insert_frame_270
strength_271.00
insert_frame_280
strength_281.00
insert_frame_290
strength_291.00
insert_frame_300
strength_301.00
insert_frame_310
strength_311.00
insert_frame_320
strength_321.00
insert_frame_330
strength_331.00
insert_frame_340
strength_341.00
insert_frame_350
strength_351.00
insert_frame_360
strength_361.00
insert_frame_370
strength_371.00
insert_frame_380
strength_381.00
insert_frame_390
strength_391.00
insert_frame_400
strength_401.00
insert_frame_410
strength_411.00
insert_frame_420
strength_421.00
insert_frame_430
strength_431.00
insert_frame_440
strength_441.00
insert_frame_450
strength_451.00
insert_frame_460
strength_461.00
insert_frame_470
strength_471.00
insert_frame_480
strength_481.00
insert_frame_490
strength_491.00
insert_frame_500
strength_501.00

LTX Keyframer is the pack's overhaul of the older LTXVImgToVideoInplaceKJ node, and it exists to solve one thing: getting your images into the right frames of a video latent without doing manual math. LTX video is a first-frame/last-frame conditioning model at heart - you tell it where a still must appear and it fills in the motion around it. This node is how you place those stills.

It belongs to the WhatDreamsCost-ComfyUI collection, the same free LTX-focused pack that grew into LTX Director. And here's the honest part before we go any further: the author recommends you use LTX Sequencer instead of this node. His own words - "after further testing it seems superior in at pretty much everything." Keyframer is still in the pack because people were already using it and it does one job slightly differently. Knowing that up front saves you a migration later.

How it works

The mechanism is straightforward and worth understanding because it's the same idea that powers the bigger LTX nodes: you feed it a video latent, a batch of images, and a set of (frame, strength) pairs, and it VAE-encodes each image and writes it into the latent at the specified position. Where it differs from the Sequencer is how it inserts: Keyframer replaces the latent frames at that location with the encoded image, and marks those frames in the noise mask with 1 - strength. Frames at strength 1.0 are frozen solid - the model regenerates nothing there, which is exactly what you want for a hard first/last frame. Lower the strength and the model gets room to reinterpret.

A couple of details in the source are worth knowing:

  • Negative frame values work. insert_frame is in pixel space, and negatives index from the end of the video - so -1 reliably means "the very last frame," which is the classic last-frame trick without computing frame counts.
  • It upscales your images to match the latent's resolution (bilinear) before encoding, so mismatched input sizes don't crash it.
  • num_images dynamically configures how many insert_frame_* / strength_* widget pairs you see - up to 50. You don't have to scroll through all of them.

The inputs that matter

  • vae - the video VAE (LTX's), used to encode your images.
  • latent - the video latent you're inserting into.
  • multi_input - the batched images, typically from the pack's own Multi Image Loader, which feeds every image down one wire and auto-updates the widget count.
  • num_images - how many insert slots to configure.
  • For each image: insert_frame_N (pixel-space position, negatives = from the end) and strength_N (0–1, how frozen that frame is).

Outputs

Just one: latent, with the images baked in and the noise mask updated. That goes straight into the sampler. The conditioning side - telling the model what each keyframe is - is handled by pairing this with a guide/conditioning node, which is exactly why the Sequencer's extra outputs (positive/negative conditioning) make it the better all-round choice.

Install

Standard for the pack:

cd ComfyUI/custom_nodes
git clone https://github.com/WhatDreamsCost/WhatDreamsCost-ComfyUI

Or search WhatDreamsCost in ComfyUI Manager, install, restart. No model downloads; it uses ComfyUI's own VAE and tensor utilities. Keep ComfyUI-LTXVideo current if you're pairing it with LTX 2.3 workflows.

Gotchas

The insertion model (replace + mask) means ordering matters: if two images land on the same frame, the later one wins. And remember it's frame positions in pixel space - if your latent was downscaled, the frame index you type needs to be the pixel-space frame (multiplied by the VAE's temporal scale factor), which is exactly the kind of arithmetic the Sequencer and Director were built to spare you. Use those, honestly.

CategoryWhatDreamsCost

Inputs (104)

NameTypeDefaultDescription
vaeVAEVideo VAE used to encode the images
latentLATENTVideo latent to insert images into
multi_inputIMAGEBatched images from MultiImageLoader
num_imagesINT10–50Select how many index/strength widgets to configure.
insert_frame_1optINT0-9999–9999Frame insert_frame for image 1 (in pixel space).
strength_1optFLOAT1.000–1Strength for image 1.
insert_frame_2optINT0-9999–9999Frame insert_frame for image 2 (in pixel space).
strength_2optFLOAT1.000–1Strength for image 2.
insert_frame_3optINT0-9999–9999Frame insert_frame for image 3 (in pixel space).
strength_3optFLOAT1.000–1Strength for image 3.
insert_frame_4optINT0-9999–9999Frame insert_frame for image 4 (in pixel space).
strength_4optFLOAT1.000–1Strength for image 4.
insert_frame_5optINT0-9999–9999Frame insert_frame for image 5 (in pixel space).
strength_5optFLOAT1.000–1Strength for image 5.
insert_frame_6optINT0-9999–9999Frame insert_frame for image 6 (in pixel space).
strength_6optFLOAT1.000–1Strength for image 6.
insert_frame_7optINT0-9999–9999Frame insert_frame for image 7 (in pixel space).
strength_7optFLOAT1.000–1Strength for image 7.
insert_frame_8optINT0-9999–9999Frame insert_frame for image 8 (in pixel space).
strength_8optFLOAT1.000–1Strength for image 8.
insert_frame_9optINT0-9999–9999Frame insert_frame for image 9 (in pixel space).
strength_9optFLOAT1.000–1Strength for image 9.
insert_frame_10optINT0-9999–9999Frame insert_frame for image 10 (in pixel space).
strength_10optFLOAT1.000–1Strength for image 10.
insert_frame_11optINT0-9999–9999Frame insert_frame for image 11 (in pixel space).
strength_11optFLOAT1.000–1Strength for image 11.
insert_frame_12optINT0-9999–9999Frame insert_frame for image 12 (in pixel space).
strength_12optFLOAT1.000–1Strength for image 12.
insert_frame_13optINT0-9999–9999Frame insert_frame for image 13 (in pixel space).
strength_13optFLOAT1.000–1Strength for image 13.
insert_frame_14optINT0-9999–9999Frame insert_frame for image 14 (in pixel space).
strength_14optFLOAT1.000–1Strength for image 14.
insert_frame_15optINT0-9999–9999Frame insert_frame for image 15 (in pixel space).
strength_15optFLOAT1.000–1Strength for image 15.
insert_frame_16optINT0-9999–9999Frame insert_frame for image 16 (in pixel space).
strength_16optFLOAT1.000–1Strength for image 16.
insert_frame_17optINT0-9999–9999Frame insert_frame for image 17 (in pixel space).
strength_17optFLOAT1.000–1Strength for image 17.
insert_frame_18optINT0-9999–9999Frame insert_frame for image 18 (in pixel space).
strength_18optFLOAT1.000–1Strength for image 18.
insert_frame_19optINT0-9999–9999Frame insert_frame for image 19 (in pixel space).
strength_19optFLOAT1.000–1Strength for image 19.
insert_frame_20optINT0-9999–9999Frame insert_frame for image 20 (in pixel space).
strength_20optFLOAT1.000–1Strength for image 20.
insert_frame_21optINT0-9999–9999Frame insert_frame for image 21 (in pixel space).
strength_21optFLOAT1.000–1Strength for image 21.
insert_frame_22optINT0-9999–9999Frame insert_frame for image 22 (in pixel space).
strength_22optFLOAT1.000–1Strength for image 22.
insert_frame_23optINT0-9999–9999Frame insert_frame for image 23 (in pixel space).
strength_23optFLOAT1.000–1Strength for image 23.
insert_frame_24optINT0-9999–9999Frame insert_frame for image 24 (in pixel space).
strength_24optFLOAT1.000–1Strength for image 24.
insert_frame_25optINT0-9999–9999Frame insert_frame for image 25 (in pixel space).
strength_25optFLOAT1.000–1Strength for image 25.
insert_frame_26optINT0-9999–9999Frame insert_frame for image 26 (in pixel space).
strength_26optFLOAT1.000–1Strength for image 26.
insert_frame_27optINT0-9999–9999Frame insert_frame for image 27 (in pixel space).
strength_27optFLOAT1.000–1Strength for image 27.
insert_frame_28optINT0-9999–9999Frame insert_frame for image 28 (in pixel space).
strength_28optFLOAT1.000–1Strength for image 28.
insert_frame_29optINT0-9999–9999Frame insert_frame for image 29 (in pixel space).
strength_29optFLOAT1.000–1Strength for image 29.
insert_frame_30optINT0-9999–9999Frame insert_frame for image 30 (in pixel space).
strength_30optFLOAT1.000–1Strength for image 30.
insert_frame_31optINT0-9999–9999Frame insert_frame for image 31 (in pixel space).
strength_31optFLOAT1.000–1Strength for image 31.
insert_frame_32optINT0-9999–9999Frame insert_frame for image 32 (in pixel space).
strength_32optFLOAT1.000–1Strength for image 32.
insert_frame_33optINT0-9999–9999Frame insert_frame for image 33 (in pixel space).
strength_33optFLOAT1.000–1Strength for image 33.
insert_frame_34optINT0-9999–9999Frame insert_frame for image 34 (in pixel space).
strength_34optFLOAT1.000–1Strength for image 34.
insert_frame_35optINT0-9999–9999Frame insert_frame for image 35 (in pixel space).
strength_35optFLOAT1.000–1Strength for image 35.
insert_frame_36optINT0-9999–9999Frame insert_frame for image 36 (in pixel space).
strength_36optFLOAT1.000–1Strength for image 36.
insert_frame_37optINT0-9999–9999Frame insert_frame for image 37 (in pixel space).
strength_37optFLOAT1.000–1Strength for image 37.
insert_frame_38optINT0-9999–9999Frame insert_frame for image 38 (in pixel space).
strength_38optFLOAT1.000–1Strength for image 38.
insert_frame_39optINT0-9999–9999Frame insert_frame for image 39 (in pixel space).
strength_39optFLOAT1.000–1Strength for image 39.
insert_frame_40optINT0-9999–9999Frame insert_frame for image 40 (in pixel space).
strength_40optFLOAT1.000–1Strength for image 40.
insert_frame_41optINT0-9999–9999Frame insert_frame for image 41 (in pixel space).
strength_41optFLOAT1.000–1Strength for image 41.
insert_frame_42optINT0-9999–9999Frame insert_frame for image 42 (in pixel space).
strength_42optFLOAT1.000–1Strength for image 42.
insert_frame_43optINT0-9999–9999Frame insert_frame for image 43 (in pixel space).
strength_43optFLOAT1.000–1Strength for image 43.
insert_frame_44optINT0-9999–9999Frame insert_frame for image 44 (in pixel space).
strength_44optFLOAT1.000–1Strength for image 44.
insert_frame_45optINT0-9999–9999Frame insert_frame for image 45 (in pixel space).
strength_45optFLOAT1.000–1Strength for image 45.
insert_frame_46optINT0-9999–9999Frame insert_frame for image 46 (in pixel space).
strength_46optFLOAT1.000–1Strength for image 46.
insert_frame_47optINT0-9999–9999Frame insert_frame for image 47 (in pixel space).
strength_47optFLOAT1.000–1Strength for image 47.
insert_frame_48optINT0-9999–9999Frame insert_frame for image 48 (in pixel space).
strength_48optFLOAT1.000–1Strength for image 48.
insert_frame_49optINT0-9999–9999Frame insert_frame for image 49 (in pixel space).
strength_49optFLOAT1.000–1Strength for image 49.
insert_frame_50optINT0-9999–9999Frame insert_frame for image 50 (in pixel space).
strength_50optFLOAT1.000–1Strength for image 50.

Outputs (1)

NameTypeDescription
latentLATENTThe video latent with the images inserted and latent noise mask updated.