Thermal Latenator
Be the resolution and seed master of your whole workflow
- First_Seed
- Reseed_Latents
- Latents
- Seeds
- Seed String
- Width
- Height
The Thermal Latenator is the node that makes "one knob for everything" workflows possible. It's a latent and seed and resolution controller in one: it hands you empty latents at an SDXL-native resolution, a batch of seeds to go with them, a seed string for chaining, and the width and height it chose - all from one node at the top of your graph. The idea is that a single master node feeds your KSampler chain, so changing resolution or seed happens in exactly one place instead of scattered across five nodes.
The inputs that matter
- Ratio_Selected - a dropdown of SDXL-native resolutions, like "1:1 1024x1024", "16:9 1344x768", "21:9 1536x640". Pick the ratio, get the correct MP size for free.
- Width_Override / Height_Override - set either above 0 to override the ratio's size. 0 means "use the ratio."
- Batch_Count - how many seeded latents to produce (each is one "batch").
- Batch_Size - how many sub-images inside each latent.
- First_Seed - the starting seed, the thing you randomize when you want variety.
- Batch_Seeds - a seed override. It handles hyphen ranges (
1234-1235) and line breaks, so you can paste a whole seed list. - Reseed_Latents (optional) - feed a latent in here and it gets rebatched by Batch_Size, with its resolution derived from the latent rather than the ratio.
How it works
The function literally creates torch.zeros([Batch_Size, 4, height//8, width//8]) latents - it's an EmptyLatentImage with extra opinions. For each batch it picks a seed: yours from Batch_Seeds if you gave one, else First_Seed, else a random one for any overflow. The Seed String output gives you a hyphen-separated string of all the chosen seeds, so you can paste it into the next Latenator's Batch_Seeds and reproduce a multi-stage chain exactly. That's the "thermal" part - the whole point is chaining upscale passes where every stage uses the same seeds, so the final image is comparable to the first pass.
A real gotcha from the changelog: if you put anything in Batch_Seeds, its first entry overrides First_Seed. The node doesn't merge them; the explicit list wins. And if you list fewer seeds than Batch_Count, the rest are filled with random values - so a short list gives you a reproducible start and a chaotic tail.
Outputs and wiring
- Latents (list) and Seeds (list) - one latent and seed per batch. At Batch_Count 1, life is simple: wire Latents into your KSampler's latent input and Seeds into its seed input. At higher counts you're producing lists, which want list-aware samplers or a list index node in front - ComfyUI won't silently feed a list into a scalar seed input.
- Seed String - the chaining tool, paste it into the next Latenator.
- Width / Height - plain integers describing what the Latenator chose. Wire these into anything that needs to know the resolution (a conditioning encoder's width/height, for instance) so you never type 1024 twice.
Installing it
This is one node in Hellrunner's Magical Nodes. Install the pack once via ComfyUI Manager (search "Hellrunner's Magical Nodes") or:
cd ComfyUI/custom_nodes
git clone https://github.com/Hellrunner2k/ComfyUI-HellrunnersMagicalNodes.git
Restart after. No extra pip dependencies - it only needs torch, which ComfyUI already has. Note the README's install path says custom-nodes/ with a hyphen; the real folder is custom_nodes.
Troubleshooting
- Resolution came out wrong? Check whether Width_Override or Height_Override is stuck above 0 - a leftover override silently beats the ratio dropdown.
- Seed chaining not reproducing results? Make sure every stage's Latenator has the same Batch_Count and Batch_Size; the seed string encodes seeds but not batch layout.
- Feeding Reseed_Latents changes width/height to the incoming latent's size and ignores the ratio entirely - that's by design for upscale chains, not a bug.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| Ratio_Selected | COMBO | 1:1 1024x1024 1MP # | SDXL Native resolution selection |
| Width_Override | INT | 00–16384 | >0 Overrides Width |
| Height_Override | INT | 00–16384 | >0 Overrides Height |
| Batch_Count | INT | 11–1125899906842624 | Number of seeded batches |
| Batch_Size | INT | 11–64 | Number of batched sub-images |
| First_Seed | INT:seed | 11–1125899906842624 | Initial seed |
| Batch_Seeds | STRING | Seed Override for easy chaining. Can deal with hyphen separation (1234-1235) and line breaks. | |
| Reseed_Latentsopt | LATENT | Input latents to be rebatched and reseeded with current seed options |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| Latents | LATENT | Latents |
| Seeds | INT | Batch Seeds |
| Seed String | STRING | Seed String for easy chaining |
| Width | INT | Latent Width |
| Height | INT | Latent Height |