Superside Tile Upscale
Nine API Calls Hidden Behind One Dropdown
- image
- image
- info
What it is, and why tiling
"Which upscaler?" is three questions wearing one word. More pixels (Lanczos, ESRGAN), more detail that a model invents (SeedVR2, SUPIR), and more pixels over time (video). This node lives in the first two, and it borrows the oldest trick in the second: split the image up, upscale each piece, glue it back together.
Tiled upscaling exists so you can get arbitrary output sizes without holding the whole thing in VRAM at once, and the standard warning about it is that without a tile condition the tiles diverge and you get patchwork. Here the model is a fal endpoint and it only ever sees one tile, so divergence isn't a bug you avoid - it's the thing you manage with overlap, feathering and colour matching. A tile cannot see its neighbour, so give a generative model a subject-heavy prompt and each tile will invent its own version of that subject.
The tiling technique is Aaron Amortegui's, ported unchanged from his repo comfyui-tile-upscale-AM, which holds the rights to the approach and is the original. What's new here is packaging. His published workflows wire five node types by hand - Tile Crop, one Tile Extract per tile, an upscaler per tile, Tile Collect, Tile Stitch - so a 3×3 needs nine of each, with a local Lanczos placeholder where the model call should be. Here the fan-out is a loop, the model is a dropdown, and your fal key has exactly one home.
What happens when you hit run
The image is cropped into an overlapping grid, and each tile is uploaded to fal separately. Faithful models get image_url plus an upscale_factor; the generative ones get prompt plus image_urls. Every tile is a separate call - the loop is sequential, not parallel - so a 3×3 is nine round trips, one after another, each allowed up to timeout_seconds. The results come back, get resized to exactly tile size × scale (generative models answer at whatever size they feel like), and get stitched with the feathering and colour matching that model preset calls for.
The inputs
image, model, tiles, scale, api_key.
model is the decision that matters, and it maps to real endpoints:
topaz→fal-ai/topaz/upscale/image(Standard V2) - 8% overlap, minimal feathering, no colour match.seedvr2→fal-ai/seedvr/upscale/image/seamless- 10% overlap, strong feather, colour match on.crystal→fal-ai/crystal-upscaler- faithful.nano banana 2/gpt image 2- generative: they redraw each tile, 20% overlap, strong feather, colour match on, and they need a prompt.none (local lanczos)- free, local, no call.
The tooltip draws the line for you: topaz, seedvr2 and crystal keep the content; the two Gemini/GPT endpoints redraw it. So if your source is already sharp and you just want it bigger, stay on the faithful half of that list.
tiles is 1x1 (no tiling), 2x2, 3x2, 2x3, 3x3. More tiles means more detail per tile and one more API call each. scale is 1–8 in 0.5 steps, default 2.
Optional: prompt (generative models only - describe the output, not the input, and keep it byte-identical for every tile, because a prompt that drifts between tiles leaves seams no feathering can hide), preview_only, overlap_percent (-1 = whatever the chosen model calls for; raise it if seams show, up to 50), and timeout_seconds (60–3600, default 600, per tile).
The outputs, and the one you should read first
image is the stitched result. info is a text report: the model, the grid and how many calls that means, the source size, each tile's before/after size, the FINAL size, the print size at 300 dpi in inches and centimetres, the billed megapixels, the wall-clock time, and a note line if the stitcher landed on a different size than expected (an off-by-a-pixel stitch is a real possible outcome, and this tells you instead of hiding it).
Cost is the thing to respect here. fal bills per output megapixel per call, and every tile is a separate call, so the overlap is paid for twice over. On a 3×3 the billed total can be meaningfully higher than the final image's megapixel count, and the info block tells you by how much - that difference is the overlap. preview_only is the honest move before any non-trivial run: it works out the finished size, print size and billed megapixels, calls nothing, and returns your input untouched.
For pricing context: crystal is around $0.016 per output megapixel, the Topaz variants bill roughly $0.08 per started 2–24 MP, and seedvr2 has no published per-call price. A Superside Fal Cost Report node totals the run.
Install
ComfyUI Manager, search "Superside" (every node is prefixed with it), or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/Superside/comfyui-superside-nodes
pip install -r requirements.txt
Restart ComfyUI. No model weights, nothing to download. Paste your fal key into api_key - blank falls back to the FAL_KEY environment variable and fails loudly if neither is set.
Common issues
"It says the model needs a prompt." That's the generative branch firing, correctly. It's also a decent hint you picked the wrong model for a faithful upscale.
"Nothing happened and it was free." You're on 1x1 (no tiling) with a faithful model, or none (local lanczos). 1x1 is still one real API call for the hosted models - useful as a baseline to compare a tiled run against, but not a free preview.
"It's taking forever." Tiles run one after another, so a 3×3 with a slow model is nine sequential waits, each up to timeout_seconds. Lower the grid or trim the timeout.
Seams. The presets' overlap percentages are what each model wants; if yours still shows, raise overlap_percent and accept the extra billed megapixels. And for the free diagnostic: run none (local lanczos) first. It costs nothing and shows you the geometry the crop/stitch stage will use before you pay for nine model calls to find out.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| model | COMBO | topaz | Which upscaler runs on every tile. topaz, seedvr2 and crystal keep the content; nano banana 2 and gpt image 2 redraw it and need a prompt. 'none' upscales locally with lanczos and costs nothing - useful for checking the geometry before paying for it. |
| tiles | COMBO | 2x2 | How the image is split. More tiles means more detail per tile - and one API call each, so cost rises with the count. |
| scale | FLOAT | 2.01–8 | How much bigger the finished image is than the original. |
| api_key | STRING | — | |
| promptopt | STRING | Only used by the generative models. Describe the output, not the input, and keep it identical for every tile - a prompt that drifts between tiles leaves seams that no amount of feathering can hide. | |
| preview_onlyopt | BOOLEAN | false | Work out the finished size, the print size and the billed megapixels without calling the model. Returns the input image untouched. |
| overlap_percentopt | FLOAT | -1-1–50 | Overlap between tiles, as a percentage of tile size. -1 uses what the chosen model calls for. Raise it if seams show. |
| timeout_secondsopt | INT | 60060–3600 | How long to wait on a single tile before giving up. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| info | STRING | — |