Nodes/Reanimator Bridge/MiniMax H3 keyframes (Reanimator)
ComfyUI Node

MiniMax H3 keyframes (Reanimator)

32 keys, one node, no spaghetti

By unluckyandlucky·Created about a month ago·Updated 11 days ago· 1
MiniMax H3 keyframes (Reanimator)
  • positive
  • latent
  • vae
  • images
  • positive
◄num_images2►
◄insert_frame_10►
◄insert_frame_20►
◄insert_frame_30►
◄insert_frame_40►
◄insert_frame_50►
◄insert_frame_60►
◄insert_frame_70►
◄insert_frame_80►
◄insert_frame_90►
◄insert_frame_100►
◄insert_frame_110►
◄insert_frame_120►
◄insert_frame_130►
◄insert_frame_140►
◄insert_frame_150►
◄insert_frame_160►
◄insert_frame_170►
◄insert_frame_180►
◄insert_frame_190►
◄insert_frame_200►
◄insert_frame_210►
◄insert_frame_220►
◄insert_frame_230►
◄insert_frame_240►
◄insert_frame_250►
◄insert_frame_260►
◄insert_frame_270►
◄insert_frame_280►
◄insert_frame_290►
◄insert_frame_300►
◄insert_frame_310►
◄insert_frame_320►

ComfyUI's own MiniMaxH3AddGuide pins one image at one frame of an H3 generation. Want five keys? Chain five of them by hand and rewire the whole thing every time the count changes. ReanimatorH3Sequencer does the chaining for you: hand it the entire keyframe batch plus the frame number for each key, and it calls the guide node once per key and returns a single CONDITIONING.

One node instead of N

This is a pattern you've seen before. Stock ComfyUI has no clean way to say "this image at this moment, that image at that moment" - that's precisely why LTX Director exists as a timeline node over LTX's own AddGuide, and why it took off. The capability was always there; the interface wasn't.

Here the interface problem is worse than usual, because the count isn't known when the graph is drawn. Reanimator's editor sends a keyframe list at run time, and a saved template can only wire the inputs it can see. So the loop lives in Python: MiniMaxH3AddGuide.execute(...) per key, feeding images[index:index+1] so each one-image slice is anchored at its own frame, in batch order.

Two details worth knowing. It anchors at most min(num_images, batch size) keys, so a mismatch silently truncates rather than erroring. And it checks the conditioning's existing minimax_keyframes metadata before anchoring, skipping any frame that's already occupied - because key 1 normally comes in through MiniMaxH3ImageToVideo's first_frame input, which also hands that frame to the text encoder. That's where identity comes from, and re-anchoring it would be doubling up.

Inputs and outputs

  • positive and latent - both from MiniMaxH3ImageToVideo. You're editing that conditioning and the latent it was built against, not starting fresh.
  • vae - the video VAE, same one the encode used.
  • images - the batch, already on the canvas the video uses. That means ReanimatorFitToGrid upstream; guides are placed in latent space, so keys on different shapes get treated differently, and only the first frame is stretched rather than cropped.
  • num_images - how many keys from the batch to anchor, 1 to 32.
  • insert_frame_1 … insert_frame_32 - the frame each key lands on, 0 to 9999. Ugly and honest: one widget per key beats a hidden text box you'd have to guess the syntax of.

The single output is positive → into your guider's conditioning (the template wires it to BasicGuider). The sampler takes its latent_image straight from MiniMaxH3ImageToVideo, so the sequencer changes when the keys land and nothing else.

Installing it

It comes with the pack, which is really the Reanimator Bridge - local GPU generation for reanimator.app - but the nodes stand alone:

cd ComfyUI/custom_nodes
git clone https://github.com/unluckyandlucky/comfyui-reanimator
pip install cryptography Pillow

Manager had it as "pending registry review" in the README, so clone or drag the ZIP in. Locate it under the Reanimator category.

What it genuinely requires is a ComfyUI new enough to ship comfy_extras.nodes_minimax_h3 - the import happens at run time, so on an older build the node appears in the menu and only explodes when you queue.

Where people get burned

Every insert_frame_N defaults to 0. Leave them there and your keys pile onto frame 0; the duplicate guard skips all but the one. Set them ascending, and remember the first key is normally frame 0 because it's the first frame of the clip.

Keys past the clip's length are wasted GPU time. The pack's own templates say it: every frame after your last key is compute spent rendering footage you'll trim off. Match length to where the last key actually lands.

Sizing your expectations to your card. The reference template for this graph wants a ~21GB int8_convrot H3 checkpoint, a 15.7GB text encoder, two VAEs and a turbo LoRA, and it calls 24GB VRAM the "full" tier. That checkpoint declares native int8_tensorwise and convrot_w4a4 ops - ComfyUI only gained official convrot int8 support in v0.27.0 (more than 2x faster than fp16 on 20/30/40/50-series), so an older build is the first suspect if the model won't load. And that nvfp4 text encoder is emulated on Ampere: fine-ish with the 8-step turbo LoRA, but run once per prompt, not per step.

The licence, before you spend an evening on it. H3's community licence excludes the US, EU, UK and South Korea from its Applicable Territory - including outputs. The keyframes pipeline is lovely. Where you live decides whether you're licensed to run it.

CategoryReanimator

Inputs (37)

NameTypeDefaultDescription
positiveCONDITIONING—
latentLATENT—
vaeVAE—
imagesIMAGE—
num_imagesINT21–32—
insert_frame_1INT00–9999—
insert_frame_2INT00–9999—
insert_frame_3INT00–9999—
insert_frame_4INT00–9999—
insert_frame_5INT00–9999—
insert_frame_6INT00–9999—
insert_frame_7INT00–9999—
insert_frame_8INT00–9999—
insert_frame_9INT00–9999—
insert_frame_10INT00–9999—
insert_frame_11INT00–9999—
insert_frame_12INT00–9999—
insert_frame_13INT00–9999—
insert_frame_14INT00–9999—
insert_frame_15INT00–9999—
insert_frame_16INT00–9999—
insert_frame_17INT00–9999—
insert_frame_18INT00–9999—
insert_frame_19INT00–9999—
insert_frame_20INT00–9999—
insert_frame_21INT00–9999—
insert_frame_22INT00–9999—
insert_frame_23INT00–9999—
insert_frame_24INT00–9999—
insert_frame_25INT00–9999—
insert_frame_26INT00–9999—
insert_frame_27INT00–9999—
insert_frame_28INT00–9999—
insert_frame_29INT00–9999—
insert_frame_30INT00–9999—
insert_frame_31INT00–9999—
insert_frame_32INT00–9999—

Outputs (1)

NameTypeDescription
positiveCONDITIONING—