VAE Scale FLUX Block
The most fine-grained knob in this VAE-surgery kit
- vae
- VAE
The FLUX VAE is a different animal from SDXL's. It still downsamples 8× per side, but it carries 16 latent channels instead of 4 - four times as much information per latent, which is a big part of why Flux images hold fine texture through img2img chains that smear on older models. VAE Scale FLUX Block gives you per-block weight scaling on that VAE, and it's the most granular of the pack's VAE-scale nodes.
Where the SDXL scale node offers one widget per broad stage, this one drills down to individual blocks: each down and up stage is split into its three block sub-units, and the downsample / upsample convs get their own widgets too. So you can attenuate just decoder.up.0.block.1. while leaving everything else at 1.0. Not that you'll usually want to - this is pure anatomy-class tinkering - but it's the tool that lets you ask "which block actually carries what" about a 2024-era autoencoder and get an answer.
What you're actually twisting
Every widget is a scale, 0.0 to 2.0, default 1.0. 1.0 = untouched, 0.0 = that layer zeroed, >1.0 = amplified. The mechanism is the pack's standard one: read the VAE's state dict, find the longest key-prefix match for each tensor, multiply, and rebuild a fresh VAE in memory. One detail worth knowing if you're comparing to the FLUX2 node: there's no quant_conv / post_quant_conv here, because the FLUX1 VAE doesn't have them - its latent I/O convs are part of the encoder/decoder heads. If you see the FLUX2 version of this node with extra widgets, that's why.
Inputs and output
vae in, plus 52 float widgets laid out as encoder.down.N.block.M., encoder.mid.*, decoder.up.N.block.M., and the upsample/downsample stages. You do not need to touch most of them. The one genuinely interesting experiment for a beginner: take a single decoder block down toward 0 and watch what the decode does - it's the fastest way to get an intuition for how much redundancy lives in a modern VAE. Output is one VAE, straight into VAEDecode.
The honest caveats
FLUX's VAE is 16-channel, and its decoder isn't a drop-in for anything else - don't feed it a Qwen or Wan VAE and expect a blend; the block merge in this pack is SDXL-specific, and cross-architecture scaling just produces garbage. And same as every weight-scaling node: zeroing blocks or pushing scales to 2.0 can shove activations out of range, and you'll know because the decode comes out black or NaN. Start near 1.0, move in small steps.
Installing it
From the easygoing0114/ComfyUI-easygoing-nodes pack - ComfyUI Manager (search Easygoing) or:
cd ComfyUI/custom_nodes
git clone https://github.com/easygoing0114/ComfyUI-easygoing-nodes.git
Restart ComfyUI. No model downloads, no extra dependencies; it does require a current ComfyUI build with V3 node API support. If the nodes don't appear after install, update ComfyUI first.
Niche, yes. But if you've ever wanted to genuinely understand what a VAE's internal stages do rather than trust the folklore, this is the cleanest dissection kit available.
Inputs (53)
| Name | Type | Default | Description |
|---|---|---|---|
| vae | VAE | — | |
| encoder.conv_in | FLOAT | 1.000–2 | — |
| encoder.conv_out | FLOAT | 1.000–2 | — |
| encoder.norm_out | FLOAT | 1.000–2 | — |
| encoder.down.0. | FLOAT | 1.000–2 | — |
| encoder.down.1. | FLOAT | 1.000–2 | — |
| encoder.down.2. | FLOAT | 1.000–2 | — |
| encoder.down.3. | FLOAT | 1.000–2 | — |
| encoder.down.0.block.0. | FLOAT | 1.000–2 | — |
| encoder.down.0.block.1. | FLOAT | 1.000–2 | — |
| encoder.down.0.block.2. | FLOAT | 1.000–2 | — |
| encoder.down.1.block.0. | FLOAT | 1.000–2 | — |
| encoder.down.1.block.1. | FLOAT | 1.000–2 | — |
| encoder.down.1.block.2. | FLOAT | 1.000–2 | — |
| encoder.down.2.block.0. | FLOAT | 1.000–2 | — |
| encoder.down.2.block.1. | FLOAT | 1.000–2 | — |
| encoder.down.2.block.2. | FLOAT | 1.000–2 | — |
| encoder.down.3.block.0. | FLOAT | 1.000–2 | — |
| encoder.down.3.block.1. | FLOAT | 1.000–2 | — |
| encoder.down.3.block.2. | FLOAT | 1.000–2 | — |
| encoder.down.0.downsample. | FLOAT | 1.000–2 | — |
| encoder.down.1.downsample. | FLOAT | 1.000–2 | — |
| encoder.down.2.downsample. | FLOAT | 1.000–2 | — |
| encoder.mid. | FLOAT | 1.000–2 | — |
| encoder.mid.block_1. | FLOAT | 1.000–2 | — |
| encoder.mid.block_2. | FLOAT | 1.000–2 | — |
| encoder.mid.attn_1. | FLOAT | 1.000–2 | — |
| decoder.conv_in | FLOAT | 1.000–2 | — |
| decoder.conv_out | FLOAT | 1.000–2 | — |
| decoder.norm_out | FLOAT | 1.000–2 | — |
| decoder.up.0. | FLOAT | 1.000–2 | — |
| decoder.up.1. | FLOAT | 1.000–2 | — |
| decoder.up.2. | FLOAT | 1.000–2 | — |
| decoder.up.3. | FLOAT | 1.000–2 | — |
| decoder.up.0.block.0. | FLOAT | 1.000–2 | — |
| decoder.up.0.block.1. | FLOAT | 1.000–2 | — |
| decoder.up.0.block.2. | FLOAT | 1.000–2 | — |
| decoder.up.1.block.0. | FLOAT | 1.000–2 | — |
| decoder.up.1.block.1. | FLOAT | 1.000–2 | — |
| decoder.up.1.block.2. | FLOAT | 1.000–2 | — |
| decoder.up.2.block.0. | FLOAT | 1.000–2 | — |
| decoder.up.2.block.1. | FLOAT | 1.000–2 | — |
| decoder.up.2.block.2. | FLOAT | 1.000–2 | — |
| decoder.up.3.block.0. | FLOAT | 1.000–2 | — |
| decoder.up.3.block.1. | FLOAT | 1.000–2 | — |
| decoder.up.3.block.2. | FLOAT | 1.000–2 | — |
| decoder.up.1.upsample. | FLOAT | 1.000–2 | — |
| decoder.up.2.upsample. | FLOAT | 1.000–2 | — |
| decoder.up.3.upsample. | FLOAT | 1.000–2 | — |
| decoder.mid. | FLOAT | 1.000–2 | — |
| decoder.mid.block_1. | FLOAT | 1.000–2 | — |
| decoder.mid.block_2. | FLOAT | 1.000–2 | — |
| decoder.mid.attn_1. | FLOAT | 1.000–2 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| VAE | VAE | — |