Geekatplay HyperTile Planner
The node that does the tiled-upscale math so you don't guess
- image
- tile_width
- tile_height
- batch_size
- denoise
- tiled_decode
- profile
- source_width
- source_height
- target_width
- target_height
- upscale_ratio
- tiles_x
- tiles_y
- preview_text
If you've ever built a tiled upscale by hand, you know the ritual: pick a target size, do the aspect-ratio math by hand, then second-guess your tile size and denoise until the seams teach you otherwise. The HyperTilePlanner is Geekatplay's attempt to kill that loop. It's the conductor of this whole pack - it reads your source image, works out where you want to end up, and hands every other node its numbers.
It ships in GeekatplayStudio/ComfyUI-UltimateUpsacaler, a stack that wraps the classic ComfyUI tiled-generative-upscale pattern - neural upscale via Ultimate SD Upscale, then a tiled denoise pass with ControlNet Tile - into helper nodes plus ready-to-import SDXL and FLUX workflows. "Ultimate Upsacaler" is not a promise to beat SUPIR or SeedVR2; it's tiled diffusion made low-guess. (And yes, the repo spells it "Upsacaler" - typo and all, that's the one to search.)
How it works
The node reads the image tensor's dimensions and resolves a target size from your sizing_mode:
target_long_edge- scale so the long edge hits your value (default 4096)magnification- multiply the source by a factor (default 4x)output_size- exactoutput_width/output_height
The result snaps to snap_to_multiple (default 64 - SDXL latents tile in multiples of 8, and 64 keeps everything clean). Then come the heuristics, which are the part worth understanding. It picks a tile size from model_family + vram_gb: SDXL gets 1024px tiles on 24GB+, 768 on 16–24GB, 512 below; FLUX.1-dev gets 768 on 24GB+, else 512; FLUX.1-schnell 768 on 16GB+, else 512. If the target exceeds 8192 on a ≤16GB card it clamps to 512, and anything at 6x+ upscale also backs down. Denoise comes from preserve_composition - 0.24 for SDXL, 0.18 for dev, 0.14 for schnell with it on, looser with it off - then denoise_adjust nudges it (clamped to 0–1). tiled_decode turns on when the longest side is 2048+ or VRAM is ≤12GB. Everything lands in a JSON profile plus discrete outputs.
The inputs that actually matter
model_family- SDXL, FLUX.1-dev, or FLUX.1-schnell. Be honest here; it changes tile and denoise defaults.vram_gb- the single most impactful knob. Overstate it and you get 1024px tiles that OOM mid-sample; understate it and you're on 512px tiles with more seams than you needed.preserve_composition- keep it true unless you want the pass free to move things. Denoise above roughly 0.5 is where composition genuinely starts shifting, and the defaults sit well under that.denoise_adjust- a ±0.3 fine-tune for when seams show up or detail comes out timid.
Outputs and where they wire
tile_width/tile_height and tiles_x/tiles_y feed the tiler and the Tile Preview; denoise feeds the KSampler in the tiled pass; tiled_decode feeds the VAE decode; target_width/target_height feed HyperTile Resize Image. profile is the full JSON of what it decided, and preview_text is a one-line human summary.
Install
The usual path: ComfyUI Manager → search "ComfyUI-UltimateUpsacaler" (or just "Geekatplay") → install, or:
cd ComfyUI/custom_nodes && git clone https://github.com/GeekatplayStudio/ComfyUI-UltimateUpsacaler
Then restart. Note the pack's own installer (install.py / install.bat) goes further: it clones UltimateSDUpscale and TTP Toolset and downloads 4x-UltraSharp, RealESRGAN_x4plus, the 6.9GB SDXL base checkpoint and the 2.5GB SDXL Tile ControlNet - so expect a big first download even though this node itself is pure math and needs nothing beyond numpy/Pillow.
Common issues
- Lying about VRAM. This is the trap. Tell it 24GB on a 12GB card and the 1024px tiles will eat your sample. Set
vram_gbto what you have, not what you wish you had. - Asking for 16000 on a 12GB card. The planner will happily plan it; it won't save you from the geometry. The README's own advice: keep tiles at 512 on 12–16GB.
- Treating
denoise_adjustas free. At +0.3 on the SDXL default you're at 0.54, past the composition point.
One nice touch: the node's change-detection key is the image's own pixel sum, so loading a new source re-plans instead of serving a stale cached plan. You'll only notice that when it works - which is the point.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| sizing_mode | COMBO | 3 options: target_long_edge, magnification, output_size | |
| target_long_edge | INT | 40961024–16000 | — |
| magnification | FLOAT | 4.01–16 | — |
| output_width | INT | 409664–32768 | — |
| output_height | INT | 409664–32768 | — |
| snap_to_multiple | INT | 641–512 | — |
| model_family | COMBO | 3 options: SDXL, FLUX.1-dev, FLUX.1-schnell | |
| vram_gb | INT | 126–80 | — |
| preserve_composition | BOOLEAN | true | — |
| denoise_adjust | FLOAT | 0.00-0.3–0.3 | — |
Outputs (14)
| Name | Type | Description |
|---|---|---|
| tile_width | INT | — |
| tile_height | INT | — |
| batch_size | INT | — |
| denoise | FLOAT | — |
| tiled_decode | BOOLEAN | — |
| profile | STRING | — |
| source_width | INT | — |
| source_height | INT | — |
| target_width | INT | — |
| target_height | INT | — |
| upscale_ratio | FLOAT | — |
| tiles_x | INT | — |
| tiles_y | INT | — |
| preview_text | STRING | — |