ComfyUI Node

Record Steps

Keep every prediction the sampler made, without changing the run

By Nynxz·Created 12 months ago·Updated 9 days ago· 4
Record Steps
  • model
  • model
  • steps

ComfyUI already shows you the denoising preview. It's a low-res, lossy, mixed-up view of something you'd probably like to see properly: what the model thought the picture was at step 4, and step 7, and step 11. Record Steps captures exactly that, at full latent resolution, and hands it to Step Film so you can watch it back as video.

Why you'd want it: to diagnose. When a composition is right at the halfway point and rubbish at the end, you want to see where it went wrong. When two samplers produce very different images from the same seed, you want to watch them diverge side by side. No amount of staring at the finished render answers either question.

What it does

model in, model out, plus a steps output. It patches the model with a sampler wrapper that tees ComfyUI's per-step preview callback - the same (step, x0, x, total) callback the built-in preview uses - into a recording. Two things get kept, per step and on the CPU: the model's clean prediction (x0, i.e. what the sampler thinks the finished image is) and the noisy latent the sampler is actually holding, plus the sigma.

Crucially, sampling is unchanged. The callback is passed straight through afterwards, so the previews still work and the result is bit-identical to a run without the node. It works with any sampler on that model - KSampler, SamplerCustom, the pack's own SoftPaint Sampler - because it hooks the sampler interface rather than any one sampler's internals.

steps goes into Step Film, and that's the only consumer. There's no preview output on this node: it's a recorder, and the frames are somebody else's job.

The one real gotcha

One recording per model. The recording lives on the patched model, and a second sampler running on the same patched model starts the recording over - so the second run's steps replace the first's. Which is fine if you have one sampler, and a silent source of wrong data the moment you don't.

The fix is mechanical: give each run its own Record Steps. Two samplers, two recorders, each feeding its own steps socket into Step Film. The author says this plainly and it's the first thing to check if your film's frames belong to the wrong run.

The other thing to know: frames are kept in CPU RAM as float tensors at full latent size. A 30-step run is 30 latents - on a 1024² model that's not nothing, and a long high-res video run can add up. It's cleared when a new recording starts, so it won't leak across runs, but it does exist while the graph is live.

Install

Same pack:

comfy node install comfyui-nynxz-nodes

Or Manager, search Nynxz, or:

cd ComfyUI/custom_nodes
git clone https://github.com/Nynxz/ComfyUI-NynxzNodes
cd ComfyUI-NynxzNodes
pnpm install && pnpm build

Restart afterwards. No Python dependencies - it uses ComfyUI's own sampler extension points, which is also why it works on samplers that don't know this pack exists.

Wiring it

Load Checkpoint → Record Steps → (model) KSampler → VAE Decode
                        └─ steps ─→ Step Film

The steps wire goes to Step Film, which also wants the sampler's LATENT and a vae. That JSON result input on Film is what makes it wait for the run to finish; Record Steps on its own doesn't force execution order beyond the model it patched.

If the film comes out empty, you almost certainly sampled a different model than the one you recorded - a ModelSamplingSD3, a LoRA loader or a merge between Record Steps and the sampler creates a new model object with no recording attached. Put Record Steps last in the model chain, immediately before the sampler, and it behaves.

CategoryNynxz/Diagnostics

Inputs (1)

NameTypeDefaultDescription
modelMODEL—

Outputs (2)

NameTypeDescription
modelMODEL—
stepsNYNXZ_STEPS—