ComfyUI Node

Make Circular VAE

Your VAE is the one leaving seams

By spinagon·Created 3 years ago·Updated 6 months ago· 290
Make Circular VAE
  • vae
  • VAE
tiling
copy_vae

You ran SeamlessTile on the model, generated what looks like a perfect tile... and the seam is still there when you actually tile it. Classic. The fix isn't in the sampler - it's the VAE. The diffusion model wraps its convolutions, but the VAE decoder that turns your latents back into pixels has its own convolutions with their own padding, and those aren't wrapping. That's where the edge gets glued back on. MakeCircularVAE is the missing half of the seamless-tiling recipe, and it's the efficient half at that.

Why the VAE matters here

The VAE is the codec between pixels and the latent space where diffusion happens (the modidex VAE panel lays this out well - it sits at both ends of every workflow). The latent diffusion model doesn't produce a viewable image at all; the VAE decoder does. So a seamless latent means nothing if the decoder's receptive field blurs or pads the wrap boundary back into a visible line. That's why the pack's README tells you to use SeamlessTile on the model and a circular VAE on decode - both halves are required.

What it does

This node takes a VAE, deep-copies it, then applies the exact same circular-padding patch the SeamlessTile node applies to a model - over the VAE's first_stage_model conv layers. Out comes a VAE that decodes seamlessly, which you then feed into a normal VAE Decode node.

Two dropdowns you'll touch:

  • tiling - enable, x_only, y_only, or disable. Match it to whatever your model node is set to. enable on the model with x_only on the VAE is how you get seams anyway.
  • copy_vae - Make a copy or Modify in place. This one's a sharper trap than its model equivalent. ComfyUI loads one VAE and hands the same object to every node, so "Modify in place" mutates it for the whole graph. That might be fine if the only VAE Decode in your workflow is yours - but it also means you've silently changed every other decode in the graph. Make a copy is almost always the right answer; in-place is for when you're absolutely sure you own the VAE.

Why it's the one the README recommends

Compare it to the pack's other decode option, CircularVAEDecode: that node deep-copies and patches the VAE on every single decode - once per image, per batch, per re-run. MakeCircularVAE patches it once and then the plain VAE Decode reuses the patched copy. Same result, far less wasted work. The README calls it out explicitly as more efficient. If you're generating a sheet of texture variations (which is the whole point of tiling), per-decode overhead adds up fast. Set MakeCircularVAE up once, wire its output into VAE Decode, and forget it.

One honest caveat: this assumes your checkpoint's VAE is a standard conv-based autoencoder (SD 1.5, SDXL, Flux all qualify). On the newer pixel-space models there's no VAE to patch at all, and on some transformer-based autoencoders the trick just won't bite - the pack's own community threads note Qwen Image is a no-go.

Categorylatent

Inputs (3)

NameTypeDefaultDescription
vaeVAE
tilingCOMBO4 options: enable, x_only, y_only, disable
copy_vaeCOMBO2 options: Make a copy, Modify in place

Outputs (1)

NameTypeDescription
VAEVAE