Make Circular VAE
Your VAE is the one leaving seams
- vae
- 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, ordisable. Match it to whatever your model node is set to.enableon the model withx_onlyon the VAE is how you get seams anyway.copy_vae-Make a copyorModify 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.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| vae | VAE | — | |
| tiling | COMBO | 4 options: enable, x_only, y_only, disable | |
| copy_vae | COMBO | 2 options: Make a copy, Modify in place |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| VAE | VAE | — |