Nodes/ComfyUI-MAINodes/H3 Latent Bank (sample once, skip the pass) [alpha]
ComfyUI Node

H3 Latent Bank (sample once, skip the pass) [alpha]

Keep the pass-1 latent so window items stop re-rendering it

By matlowai·Created 17 days ago·Updated about 16 hours ago· 112
H3 Latent Bank (sample once, skip the pass) [alpha]
  • samples
  • samples
  • report
bank_keypass1
store_diroutput/h3_latent_bank
modeuse bank if present (default)
seed
fingerprint
store_dtypefloat32 (exact)

Alpha node from the rolling-window era of this pack, and it solves a very specific pain. When you split a long de-rope into windows, every window item wants the pass-1 baseline render. Requeueing an unchanged graph already hits ComfyUI's node cache, so a plain window requeue re-samples nothing - but that cache is dropped the moment you queue any other workflow in between, restart ComfyUI, or edit anything upstream. Then window item 2 re-renders the whole baseline before it can start its own window. H3 Latent Bank banks the pass-1 latent to disk, so every later item is served from the bank instead of re-running the pass.

How it works

It sits right after the pass-1 sampler, and its samples input is lazy: on a bank hit, ComfyUI never stages the sampler, which means the sigmas, the noise, the guider and the pass-1 text encode are all skipped too. Everything downstream of the bank still runs - the VAE decodes and the oracle read the banked latent and do their work again - but that's seconds against the pass they replace.

Why bank the latent and not the frames? Latents are tiny. The H3 AV latent of a 107-frame 480x832 clip is 4.8 MB, against 513 MB for the same clip decoded to float32 frames. And everyone who reads that latent - the video decode, the audio decode, and H3 Jerk Oracle which reads the latent directly - can hang off this one node.

Inputs that matter:

  • samples - the pass-1 latent from the sampler.
  • bank_key (default pass1) - names the bank. One key per pass you want to keep.
  • mode - use bank if present or refresh (re-sample, overwrite). Press refresh after you change anything the key doesn't cover.
  • seed / fingerprint - the only things folded into the filename beyond bank_key. Wire the noise seed; put steps, scheduler, LoRA strength and resolution into fingerprint yourself.
  • store_dtype - float32 (exact, default) or float16 (half the file). Float16 sits below a VAE decode's noise, but it isn't bit-identical - keep float32 while you're comparing takes.

The staleness contract is on you

The node says this plainly and you should believe it: nothing is fingerprinted for you beyond seed and fingerprint. Change a dial the key doesn't cover and you will silently ship the old take unless you change bank_key or hit refresh. That's the whole trust model.

Install

Same as the rest of the pack:

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

or ComfyUI Manager → search ComfyUI-MAINodes, restart. Category is latent/minimax.

Common gotchas

The default store_dir is output/h3_latent_bank, relative to the ComfyUI working directory - the tooltip's warning is that /tmp is a RAM disk on most Linux installs, and the whole point of the bank is surviving a reboot. Also: this is not window-specific. The author notes a seed hunt or an extension chain on the same prompt can encode once between them too. Just remember the staleness rule: when in doubt, refresh.

Categorylatent/minimax

Inputs (7)

NameTypeDefaultDescription
samplesLATENTfrom the sampler; on a bank hit this link is never evaluated, so the sampler does not run
bank_keySTRINGpass1names the bank. One key per pass you want to keep
store_dirSTRINGoutput/h3_latent_banka relative path lands inside the ComfyUI working directory. Avoid /tmp: it is a RAM disk on most Linux installs and the bank is meant to survive a reboot
modeCOMBOuse bank if present (default)2 options: use bank if present (default), refresh (re-sample, overwrite)
seedoptINT0–18446744073709550000wire the sampler's noise seed; it joins the filename, so a new seed misses the bank instead of being served the old take
fingerprintoptSTRINGanything else that decides this pass, as a string. Nothing is hashed for you except this and 'seed'
store_dtypeoptCOMBOfloat32 (exact)2 options: float32 (exact), float16 (half the file)

Outputs (2)

NameTypeDescription
samplesLATENT
reportSTRING