SeamlessApply
Make the model tile its own image, so you never fix a seam again
- model
- vae
- model
- vae
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
SeamlessKSamplerin 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
SeamlessKSamplerin this same pack does exactly that. SeamlessApply is the gentler, default-reach-for version.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| vae | VAE | — | |
| active | BOOLEAN | true | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| vae | VAE | — |