Context-Anchored Tile Upscale (VL)
4K from a 1024px image in one node — for Krea 2
- image
- model
- clip
- vae
- upscale_model
- negative
- IMAGE
This is the "just make it huge" node. Context-Anchored Tile Upscale (VL) is the all-in-one version of the pack's VL refine: image in, a much bigger refined image out, no sampler nodes to wire and no positive prompt to write. It's Krea 2-only, and the README's sample images are the sales pitch - a 1024x576 frame upscaled to 4096x2304 in a first pass, then to 8192x4608 in a second, with no visible tile seams. Not cherry-picked, per the author.
How it works
The node runs two stages in sequence. First the whole image is upscaled in one pass: the optional upscale_model runs if you connect one (an ESRGAN-style model works here), then a single lanczos resize brings it to input size × upscale_by. Only after that does the tiling begin. Nothing is resampled mid-tile, and the refine stage is the exact same synchronized VL engine as Tile Refine (VL) - every tile a lane of one shared-canvas diffusion run, conditioned on its slice of a single whole-image vision encode. That's why there's no positive prompt input: each tile's conditioning is built from the image itself, so prompt objects never show up in the wrong tile.
The inputs that matter
Unlike the Refine nodes, this one internalizes the sampling plumbing, so you get familiar widgets instead of NOISE/SAMPLER/SIGMAS/GUIDER sockets:
upscale_by- the multiplier (0.01 to 8). Default 2. This plus your source size determines how many tiles you'll get.denoise- how much the refine stage rewrites the upscaled image. Default 0.5 is the sweet spot for a 4x pass; the README's second pass drops to 0.35. Set it to 0.0 and this becomes an upscale-only node - handy for testing.max_tile_width/max_tile_height- defaults here are 1536 and 2048 (note the taller-than-wide bias for portrait-ish tiles), and this is the knob that trades VRAM against detail.steps,cfg,sampler_name,scheduler,seed- the usual suspects. Defaults aredpmpp_2m/sgm_uniform/ 20 steps / CFG 3.5, which are close to Krea 2 Raw's official settings, so you can mostly leave them alone.
The optional negative is the only text channel that survives - unconnected, it's an empty encode of this node's CLIP. There's no mask input; for region passes, use Tile Refine (VL). The clip must be a vision-language encoder (Krea 2 family) - same rule as the other VL node.
Gotchas
The sampler restriction from the VL Refine node applies here too: only euler, heun, dpm_2, dpmpp_2m, dpmpp_2m_sde (all variants), exp_heun_2_x0, and exp_heun_2_x0_sde are supported, and anything else is rejected before sampling starts. If you're used to dpm_fast or uni_pc from other workflows, this is why the queue errors out.
The two-pass recipe the README shows is worth copying: upscale 4x at denoise 0.5 (6 tiles on their sample image), then run the result through the node again at 2x with denoise 0.35 (30 tiles). Each pass lands at a resolution the model handles comfortably, and the second pass cleans up what the first roughed in.
Install is identical to the rest of the pack - search "Context-Anchored Tile Refine" in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/Blakeem/ComfyUI-ContextAnchoredTileRefine
Restart, and you're done: no pip dependencies, no extra model files in this pack. The Krea 2 setup around it (Qwen3-VL text encoder plus Qwen-Image VAE) is the part beginners forget, and Krea 2 Turbo is explicitly untested with the VL nodes - stick to plain Krea 2 until the author says otherwise.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | The image to upscale and then refine. | |
| model | MODEL | The diffusion model that denoises each tile. | |
| clip | CLIP | Must be a vision-language text encoder (Krea 2 family). There is no positive prompt input, since each tile is conditioned on the image itself. | |
| vae | VAE | The VAE that encodes and decodes each tile. | |
| seed | INT | 00–18446744073709550000 | Noise is drawn once for the entire image and then sliced for each tile. |
| sampler_name | COMBO | dpmpp_2m | 44 options: euler, euler_cfg_pp, euler_ancestral, euler_ancestral_cfg_pp, heun, heunpp2, +38 |
| scheduler | COMBO | sgm_uniform | 9 options: simple, sgm_uniform, karras, exponential, ddim_uniform, beta, +3 |
| steps | INT | 201–10000 | — |
| cfg | FLOAT | 3.50–100 | — |
| denoise | FLOAT | 0.500–1 | — |
| upscale_by | FLOAT | 2.000.01–8 | The upscale multiplier. The optional upscale_model runs first when one is connected. |
| max_tile_width | INT | 1536256–16384 | Hard cap on the width the model ever sees per sampled crop, including the context_overlap and context_anchor rings. Set to the largest width the model supports. |
| max_tile_height | INT | 2048256–16384 | Hard cap on the height the model ever sees per sampled crop, including the context_overlap and context_anchor rings. Set to the largest height the model supports. |
| context_anchor | INT | 320–512 | Pixels around each tile that are frozen and shown to the model as context, then cropped away. |
| context_overlap | INT | 320–512 | Overlapped context that is diffused from both sides and then blended. It anchors the tiles to each other, like context_anchor anchors each tile to its surroundings. |
| anchor_source | COMBO | source image | What fills context_anchor. source image keeps the result true to the input. live canvas adds more detail and drifts further from the input. |
| vlm_method | COMBO | vision tokens and captions | Whether each tile is conditioned on a caption of itself, on its slice of the entire image's vision encode, or on both. The name in parentheses is the caption preset it asks. Copy settings.toml to settings.user.toml to write your own tile prompts. |
| upscale_modelopt | UPSCALE_MODEL | Optional upscale model, run over the entire image before any tiling. | |
| negativeopt | CONDITIONING | Optional negative conditioning. Unconnected it is an empty encode of this node's CLIP. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |