Step Film
Watch a sampler think, one frame per step, as video
- steps
- vae
- result
- steps_b
- result_b
- frames
Step Film takes what Record Steps recorded and turns it into video frames: each step's picture laid over a strip with a label, the step number and a progress bar, ending on the sampler's actual result. If you've ever wanted to know when a picture went wrong rather than just that it did, this is the tool.
The practical use is comparison. Two samplers, same seed, same prompt, played side by side on the same clock, and the divergence is obvious in a way two finished PNGs never are. It's also the fastest way to understand what a scheduler is doing - 4 steps versus 20 stops being an abstraction when you've watched both.
The inputs that matter
steps comes from Record Steps. result is the LATENT from the sampler that ran on Record Steps' model - it's used as the last frame, and it's also what makes Step Film wait for that run to finish, which is why it's required and not optional. vae decodes all of it, the same VAE you decoded the image with.
label is the text written under the run, so put "dpmpp 2m" or "euler, 20 steps" on it and thank yourself later.
show picks which recording you're watching. prediction (the default) is the clean image the model expects at each step - how the picture forms. noisy is the latent the sampler is actually holding, noise and all, which is noisier and much closer to what the built-in preview shows. Prediction is the one you want for understanding composition; noisy is for understanding the noise schedule.
frames_per_step and hold control the pacing. One frame per step is the default; with few steps, raise frames_per_step rather than dropping the video's frame rate, and hold (24) keeps the final result on screen long enough to actually look at it.
The optional half is the comparison: steps_b, result_b, label_b and layout. Wire a second Record Steps run into steps_b and its sampler's latent into result_b, and the two play on the same clock. layout is side by side or the stacked alternative, depending on whether you care more about width or height.
One output: frames, an IMAGE batch. Straight into core's Create Video, or Save Image if you want to inspect individual steps as stills - the last frame is the real result.
Why you still need result
The recording itself doesn't include the sampler's final output as a frame; it stops at the last prediction. The result latent is what turns "almost finished" into "finished", and it also anchors the frame count so the progress bar is honest. Anyone who's built a film from a recording without it will tell you the last frame looks slightly wrong - because it isn't the last frame.
Install
comfy node install comfyui-nynxz-nodes
Or Manager, search Nynxz, or from source - frontend build included, because the pack's editors are Vue and a half-built install causes confusion later:
cd ComfyUI/custom_nodes
git clone https://github.com/Nynxz/ComfyUI-NynxzNodes
cd ComfyUI-NynxzNodes
pnpm install && pnpm build
Restart. No Python dependencies. Nothing here needs a video library - it outputs frames, and core's Create Video does the encoding.
Practical notes
Decoding every step through the VAE is the expensive part, not the sampling. A 40-step film at 1024² is 40 decodes; on a small card that's the difference between a tool you use and a tool you avoid. Record at the resolution you're actually generating and expect it to take a while.
Empty frames or a film that's always one step: check you didn't sample a different model from the one Record Steps patched. A LoRA loader, a merge, a model-sampling patch between Record Steps and the sampler gives you a fresh model object with no recording on it - Record Steps belongs immediately before the sampler.
And if your side-by-side comparison shows two totally different films, that's usually not the node: result and result_b swapped, or the two samplers on different seeds. Set the seed fixed before you draw any conclusions.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| steps | NYNXZ_STEPS | From Record Steps. | |
| vae | VAE | — | |
| result | LATENT | The LATENT of the sampler that ran on Record Steps' model. It is the last frame, and it makes this node wait for that sampler. | |
| label | STRING | Written under this run. | |
| show | COMBO | prediction | prediction: the clean image the model expects at each step — how the picture forms. noisy: the latent the sampler actually holds, noise and all. |
| frames_per_step | INT | 11–30 | Frames each step stays on screen. With few steps, raise it instead of lowering the video's frame rate. |
| hold | INT | 240–240 | Extra frames the result stays on screen at the end. |
| steps_bopt | NYNXZ_STEPS | A second run to compare with. | |
| result_bopt | LATENT | The second run's sampler LATENT. | |
| label_bopt | STRING | — | |
| layoutopt | COMBO | side by side | 2 options: side by side, stacked |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | — |