Nodes/ComfyUI/VAE Decode
ComfyUI Node Runs on cloud

VAE Decode

The only way to actually see what you made

By Comfy-Org·Created 4 years ago·Updated 32 minutes ago· 129,926
VAE Decode
  • 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 (a Checkpoint Loader also 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.

Categorymodel/latent

Inputs (2)

NameTypeDefaultDescription
samplesLATENTThe latent to be decoded.
vaeVAEThe VAE model used for decoding the latent.

Outputs (1)

NameTypeDescription
IMAGEIMAGEThe decoded image.