Pulse Still · MiniMax H3
Make your MiniMax H3 reference images in the same window you use them
- model
- clip
- vae
- audio_vae
- source_image
- ref_images
- image
- plan
A reference image that was made by the same model that will use it
The most reliable way to keep a character consistent across a MiniMax H3 film is to feed it reference images. And the most reliable reference images are the ones generated through the same reference set and the same pipeline that will drive the video - not a photo you scraped, not an SDXL render from a different architecture. Pulse Still is exactly that: a still is a 5-frame H3 render where you keep one frame. Same conditioning, same compiler, same reference marshalling as the video path, just five frames and a pick.
It does two jobs, and the difference is the branch the render takes:
- Generate - leave
source_imageunconnected, wire references intoref_images, and it runs the ref2va branch (MiniMaxH3ReferenceToVideo) to produce a brand-new still in the style of your references. This is how you build the character sheet before you build the film. - Edit in place - connect
source_imageand it pins that image at frame 0, which is the fl2va branch (MiniMaxH3ImageToVideo). It takes no references, because H3's anchors and references can't coexist in one render - a hard model constraint, not a node choice.ref_imagesis ignored whilesource_imageis connected.
The inputs that matter
Most of the required set - model, clip, vae, audio_vae, prompt, sampler, scheduler, shift_video/shift_audio - is the shared H3 plumbing. The two you'll actually touch:
frame_pick(0–4) - which of the 5 rendered frames to keep. Your source (in edit mode) is pinned at frame 0, so 0 hugs the original and 4 drifts furthest. This is the edit-strength dial, exposed rather than hidden: low for a conservative touch-up, high for a real remix. In generate mode it's the same idea, just without the pinned source.canvas_from_reference(default on) - lets the source image set the canvas instead of cropping it to the chosen aspect. It fits the source's aspect into H3's 1,032,192 px budget on the /32 grid, long edge rounding down and the short edge taking the nearest step that stays inside budget. That's the same fitting theaspect_ratiopresets use, so a 1920×1080 reference and the "16:9 landscape" preset can never resolve to different canvases. Turn it off and theaspect_ratio/width/heightwidgets take over.
One quirk worth knowing: audio_vae is required even though a still discards the audio, because H3 always builds a joint audio+video latent. Yes, it's a video model's audio encoder on an image node. Plug one in anyway.
Outputs are image (the single kept frame, an IMAGE batch of one) and plan (a text readout of the canvas fitting and branch). Wire the image straight into a PulseShot's start_image - because those are real tensors, your shot can open on a still that was generated in the same graph, no file export in between.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Addis-Pulse-Studio/comfyui-pulse-studio
Restart ComfyUI. No pip install, no dependencies of its own - just what a working ComfyUI already has. Host must be ComfyUI 0.30.0+ with H3 support. Weights from Comfy-Org/MiniMax-H3 into the minimax/ subfolders: ref2va DiT (~20 GB), text encoder (~15 GB), and both VAEs; add the fl2va DiT if you edit stills in place. The weights carry the geofenced MiniMax H3 Community License (no US, EU, UK, Korea), and on Linux/macOS example-graph loaders show red until you re-pick each file.
Deliberately not a second product
It's tempting to want layers, masks, inpainting - the whole image-editing kitchen sink. The README is blunt: this is a mode, not a separate application, and "the moment it grows a brush it has become a different application." If you need surgical edits, generate here for consistency and do the surgery downstream. For making the reference sheet that holds a character across a timeline, that's exactly the job, in the same window as the film that will use it.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| vae | VAE | — | |
| audio_vae | VAE | H3 always builds a joint audio+video latent, so this is required even though a still discards the audio. | |
| schema_version | STRING | 3.0.0 | Which widget layout this node was saved with. Written by the node, read at load time to restore values by name. Do not edit. |
| prompt | STRING | — | |
| aspect_ratio | COMBO | 16:9 landscape | 7 options: custom, 16:9 landscape, 9:16 portrait, 1:1 square, 4:3 landscape, 3:4 portrait, +1 |
| width | INT | 134432–4096 | — |
| height | INT | 76832–4096 | — |
| frame_pick | INT | 00–4 | Which of the 5 rendered frames to keep. The source is pinned at frame 0, so 0 hugs the original and 4 drifts furthest. This is the edit-strength dial. |
| canvas_from_reference | BOOLEAN | true | Let the source image set the canvas instead of cropping it to the chosen aspect. Its aspect is fitted into H3's pixel budget, rounded down to multiples of 32. |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–100 | — |
| sampler_name | COMBO | res_multistep | 6 options: res_multistep, euler, euler_ancestral, dpmpp_2m, dpmpp_2m_sde, ddim |
| scheduler | COMBO | simple | 6 options: simple, normal, beta, sgm_uniform, karras, exponential |
| cfg | FLOAT | 1.01–20 | — |
| shift_video | FLOAT | 12.000.01–100 | — |
| shift_audio | FLOAT | 3.000.01–100 | — |
| source_imageopt | IMAGE | Editing a still pins this at frame 0, which is the fl2va branch -- it takes no references. Leave unconnected to generate instead. | |
| ref_imagesopt | IMAGE | Reference images for generation (ref2va). Ignored when source_image is connected, since anchors and references cannot coexist in one render. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| plan | STRING | — |