TilePlan
TilePlan doesn't sample anything, and that's why you need it
- model
- latent
- tile_plan
TilePlan is the least exciting node in this pack and the one everything else hangs off. It takes your model, your target latent and one number, and returns a plan: four overlapping views of the canvas, in clockwise order TL → TR → BR → BL. No pixels move. No sampling happens. It's pure geometry.
You need it because the whole method is "run four overlapping views through one sampling trajectory, then blend the predictions with Gaussian weights." Somebody has to decide where those four rectangles sit, and how much they overlap. That's this node. It's the difference between a tiled upscale that blends and one that shows you a cross of seams as soon as you look at the sky.
Why the pack splits geometry out
The older ComfyUI-TiledDiffusion (shiimizu's) hands you a patched MODEL and you set tile counts and overlap inside one node. This pack went the other way: TilePlan reads the model and the latent and emits a TILE_PLAN you pass around, and the actual sampling lives in TileSampler. That's a little more wiring, and it buys you one thing that matters - the plan is also the contract for the reference crops. TileView, and therefore the per-tile Anima LLLite and Krea 2 conditioning nodes, all read the same rectangles the sampler will evaluate. No eyeballing tile boxes in two places and hoping they line up.
The inputs
Three of them, and only one is really yours to tune:
model- not used for generation here. It's how the node learns the latent geometry: SDXL is 4-channel with an 8-pixel scale; Anima and Krea 2 are 16-channel, patch size 2, Wan21-style latents with a 16-pixel alignment. Feed a model the pack doesn't know and you get an explicitUnsupported model/latent familyerror rather than a plan that quietly produces garbage.latent- the target you're about to sample. It has to be the same latent you hand TileSampler.tile_overlap- default 64, step 8, in pixels of shared overlap, which the tooltip is careful to say is "not a per-side halo." The four views overlap by roughly this much in each direction. Bigger means more compute for smoother joins; 0 means no blending at all, because weights can't smooth a boundary that nothing shares.
Output is a single tile_plan socket. Wire it to TileSampler, to TileView, and to TiledAnimaLLLiteApply if you're refining Anima.
What it computes
Per axis of length L latent cells with pixel scale s, the view extent is rounded up from (L + ceil(overlap/s)) / 2 onto the model's alignment lattice, with a minimum extent. Origins are 0 and L - t. Effective overlap is 2t - L, which can be more than you asked for - rounding up to the alignment grid is how the pack avoids padding or resizing. Two consequences worth internalising: the views are always exactly four and they grow with the canvas (so a 4K canvas is four big views, not sixteen small ones, and lower VRAM is not promised), and rounding can give you nonzero overlap even when you request 0 on an odd axis.
Install
The pack ships no Python dependencies and no model files - ComfyUI supplies PyTorch and comfy_api, and there's no requirements.txt in the repo on purpose. Either search Tiled Diffusion NG in ComfyUI Manager (it publishes to the registry as Lany Atwood) or clone it:
cd ComfyUI/custom_nodes
git clone https://git.colorized.life/tiled-diffusion-ng.git tiled-diffusion-ng
# restart ComfyUI
It needs a recent ComfyUI - the nodes are written against the V3 comfy_api.latest node API - and Python 3.13+ per its pyproject.toml. If the nodes don't appear in the menu at all, you're on an old host; update ComfyUI rather than the pack.
Where people get burned
- Stale plans. The plan remembers the model geometry and canvas it was built from. Reuse it after a different upscale and you get
Stale or incompatible TILE_PLAN; create a plan for this model and latent. Correct behaviour, annoying in practice: every upscale stage gets its own TilePlan. - Every stage, a fresh plan. The README's own workflow is upscale the output latent externally, make a new plan, sample again. Don't try to carry one plan through two resolutions.
- Zero overlap. It's legal and it removes the blending. Useful only if you want to see exactly what the tiling is doing.
- Alignment on Anima/Krea 2. Canvas dimensions need to be divisible by 16 pixels and those models need 16-channel image latents. The node fails loudly instead of padding, which is the right call but means you fix it upstream in your Empty Latent or resize node.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| latent | LATENT | — | |
| tile_overlap | INT | 64 | Shared overlap in pixels, not a per-side halo. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| tile_plan | TILE_PLAN | — |