VAE Decode
The only way to actually see what you made
- samples
- vae
- IMAGE
Every ComfyUI graph that produces a picture ends in the same place. The sampler hands you a latent - a compressed tensor the model actually denoised - and VAE Decode is what turns that back into pixels you can save. If you've ever built a workflow and got a black preview or nothing at all, nine times out of ten this node is missing from the chain or fed the wrong VAE.
The mechanism is deceptively simple: it runs the VAE's decoder over the samples latent and returns an IMAGE. The reason it's a separate node at all is that the latent is not an image - it's a tiny, channel-packed representation (typically 8× smaller per side, and 16 or 128 channels deep for modern models) that only makes sense to the model that trained with it. The VAE is the "unzip" step, and it has to match the checkpoint that produced the latent.
The two inputs that matter
- samples - the LATENT straight off the KSampler (or after any latent-space edits).
- vae - the VAE model. Load it with a
VAE Loader(aCheckpoint Loaderalso exposes the one baked into the checkpoint).
Output is a single IMAGE. Wire it into Save Image or Preview Image and you're done. The source also quietly handles the video case: if the latent is 5D (video, batch × channels × frames × height × width), it flattens to a normal 4D image batch so the same node works for frames. It'll even unbind the video stream of a packed AV latent for you - you just won't hear anything.
Why your output is grey, washed out, or noise
This is the classic failure, and it's a VAE mismatch. The model's VAE defines the latent space - channel count, scaling, the whole coordinate system. Feed a latent made by an SD 1.5 model into an SDXL VAE and you get grey mush or flat colour, not a subtly wrong image. If your renders look washed out or desaturated, your checkpoint's VAE was never baked in and you're decoding with the wrong one; vae-ft-mse-840000-ema-pruned is the usual fix for SD 1.5. If you're on a modern model, don't mix families - each architecture has its own VAE and swapping them across channel counts produces noise, not a style choice.
The other trap is newer: some 2026 models have no VAE at all. HiDream-O1, Chroma Radiance and friends work in pixel space directly - there's no encoder, no decoder, no VAE loader in their workflows, and the "missing VAE" error people report is actually them adding one that doesn't exist. If you're on a pixel-space model, decode isn't your job; the sampler's output already is pixels.
Quick wins
- Decode is fast and cheap. Put it as late as you can - edit latents before decoding, not the image after, if you're doing math (see Latent Add/Subtract/Multiply).
- For huge images,
VAE Decode (Tiled)exists precisely because one-shot decode blows up VRAM on big latents - reach for it over this node past ~2K. - If you're looping a workflow and the image looks identical every run, check that decode isn't happening before your latent edits.
It ships with ComfyUI core - nothing to install. There's no versioning story worth telling: this node has been the terminal step of basically every workflow since day one, and that's exactly what makes it worth understanding.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| samples | LATENT | The latent to be decoded. | |
| vae | VAE | The VAE model used for decoding the latent. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | The decoded image. |