ComfyUI Node

SeamlessApply

Make the model tile its own image, so you never fix a seam again

By moyi7712·Created 2 years ago·Updated about a year ago· 20
SeamlessApply
  • model
  • vae
  • model
  • vae
activetrue

You've been there: you prompt for wallpaper, fabric, a game texture, and the image comes back gorgeous except the left edge refuses to talk to the right edge. So you're in post, offsetting the canvas, inpainting the seam, hoping nobody zooms in. SeamlessApply is the node that fixes this before it happens - it makes the model itself believe its image is wrapped around a donut, so there's never an edge to stitch.

It's the flagship of the small moyi7712/ComfyUI_Seamless_Patten pack, and it's barely more than one idea executed well: take every Conv2d layer in the model and switch its padding from zeros to circular. Circular padding wraps the feature map - the left column meets the right column, the top row meets the bottom - so the UNet sees a torus instead of a flat rectangle. Convolutions near the border pull context from the opposite edge, the pattern tiles naturally, and you get a texture whose edges line up by construction.

The clever part: it only wraps the first ~10% of the run

If you left circular padding on for all 20+ steps you'd get tiling, sure, but also a slightly "off" look in fine detail as the model keeps re-wrapping. The author solved that with a hook on the diffusion model: circular padding is active while the noise level is high, then the moment sigma drops below about 90% of the schedule, the hook resets every layer to normal padding and removes itself. Composition is decided early in the denoise; detail comes later. Wrap early, unwrap late, get the seamlessness without the artifacts. Neat.

Both the model and the VAE get patched, and both are cloned first - your loaded checkpoint in memory is untouched, so the next workflow in your queue behaves normally.

What you actually set

The node takes three inputs and returns two:

  • model (MODEL) - your loaded checkpoint, straight from the loader.
  • vae (VAE) - the VAE you'll decode with.
  • active (BOOLEAN, default true) - the only knob you'll touch. Flip it off to A/B against a normal generation, or to temporarily disable without rewiring the graph.

Outputs are model and vae - the patched copies. Wire the model output into your KSampler and the vae output into VAEDecode. Don't keep using the original VAE from the loader and expect seams gone; the node's returned vae is the one carrying the hooks.

Install

The pack has no Python dependencies and no models to download - just a few hooks on top of ComfyUI's own sampler code. Install it like any custom node:

# ComfyUI Manager: Manage → Custom Nodes → search "Seamless" → Install → Restart

# or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/moyi7712/ComfyUI_Seamless_Patten
# then restart ComfyUI

There's no requirements.txt to run - nothing to pip install.

Where people get burned

  • This targets the classic UNet architectures (SD 1.5, SDXL) whose layers are mostly Conv2d. Newer DiT models like Flux don't have the same convolution stack, so don't assume it does anything for them - test it.
  • Don't chain it with the pack's SeamlessKSampler in the same path. SeamlessApply already patches the model; stacking the all-steps circular sampler on top is redundant and the two can fight over padding modes.
  • If you want circular padding for the entire denoise rather than the first 10%, the SeamlessKSampler in this same pack does exactly that. SeamlessApply is the gentler, default-reach-for version.
CategorySeamless

Inputs (3)

NameTypeDefaultDescription
modelMODEL
vaeVAE
activeBOOLEANtrue

Outputs (2)

NameTypeDescription
modelMODEL
vaeVAE