🔍 Upscaler Simple
Plan a tiled upscale grid once, then do what you want per tile
- image
- upscale_model
- latent
- image
- tiles
- latent
- latent_tiles
- layout
Upscaler Simple is the trimmed-down sibling of FiL_Design_ImageMind's Upscaler Advanced: identical tiling panel, identical math, but only the five outputs most graphs actually use. If you've ever wanted the Ultimate SD Upscale-style tiled workflow without bolting a whole other pack onto ComfyUI, this is the on-ramp - it plans a tile grid over your image, optionally upscales through a real ESRGAN-style model, and hands you the pieces.
The key thing to understand is what it is not. This is not a "make the image bigger, magic, done" node. It's a tile-grid planner. It splits your image into overlapping tiles so you can do the heavy lifting (a diffusion pass, a per-tile upscaler) on each tile within your VRAM budget, then recombine them. The whole point of tiling is arbitrary output sizes on a card that would never hold the full image at once - the same reason Tiled Diffusion and Ultimate SD Upscale exist.
The inputs that matter
upscale_factor(2.0) - how much bigger. Range 0.1–8.0.tile_size(1024) andtile_overlap(64) - the grid geometry. More overlap means fewer seams and more VRAM.auto_overlapderives overlap from tile size (~12.5%, min 32px) so it stays proportional when you changetile_size.auto_mode+auto_profile- full auto picks tile size and overlap from a VRAM profile (Low VRAM → Ultra Quality). This is the "I just want it to work" path.manual_tile_cols/manual_tile_rows- force an exact grid; 0 means derive it from tile size.image,latent,upscale_model- at least one of image/latent required.upscale_modelis an ESRGAN-style model loader and only applies when an image is connected.
The geometry deserves one note because it's where people get confused. Overlap isn't padding - the grid step is step = tile − overlap, so overlap genuinely increases the tile count. If the count looks wrong, that's why. Clamping keeps overlap at half a tile so the count can't explode, and non_square_tiles allows rectangular tiles within a 1.5:1 aspect.
The five outputs, and how they fit together
image- the image upscaled through the model (if one is connected) and resized to the tile-aligned target.tiles- the actual cropped tile batch. Edge tiles shift inward to stay full-size, so no black padding strips.latent/latent_tiles- the latent resized with bislerp (not lanczos - that's RGB-only interpolation and doesn't belong in latent space) and one latent crop per image tile.layout- the per-tile positions. This is the one to keep track of. It's what FiL Tile Assembly consumes to stitch everything back together.
The intended pipeline: Upscaler Simple → process tiles (or latent_tiles) individually - upscale each with a diffusion pass, run ControlNet Tile, whatever - then feed the processed tiles plus the same layout into FiL Tile Assembly. Keep the layout matched to the tiles; mixing a layout from one grid with tiles from another is how you get seams in the wrong places.
Two honest notes. Without an upscale_model connected, image is just a passthrough - the node plans and crops but doesn't add pixels. And in latent-only mode the image/tiles outputs are empty placeholders, which trips people who wire them into a preview and see nothing.
The community's standing advice applies here too: decide whether you want more pixels (a plain ESRGAN pass - fast, can't hallucinate) or more detail (generative, tile-based, needs ControlNet Tile to stop tiles diverging). This node supports both paths; the difference is what you put between the tiles and the assembler.
Install is pack-standard: ComfyUI Manager search FiL_Design_ImageMind, or clone + pip install -r requirements.txt + restart. No model downloads ship with the pack - an upscale model comes from your own models/upscale_models.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| upscale_factor | FLOAT | 2.000.1–8 | Upscale multiplier. 2.0 = double the size. |
| tile_size | INT | 102464–2048 | Base tile size in pixels for tiled upscale. |
| tile_overlap | INT | 640–512 | Tile overlap in pixels. Higher = fewer seams, more VRAM. |
| auto_overlap | BOOLEAN | false | Ignore tile_overlap and derive it automatically from the tile size (~12.5%, min 32px) instead — keeps overlap proportional when you change tile_size. No effect when Full Auto is on (it already derives its own overlap). |
| auto_mode | BOOLEAN | false | Full Auto: automatically choose tile settings based on profile. |
| auto_profile | COMBO | Balanced | VRAM/quality profile for auto mode. |
| manual_tile_cols | INT | 00–64 | Force this many tile columns. 0 = compute from tile size. |
| manual_tile_rows | INT | 00–64 | Force this many tile rows. 0 = compute from tile size. |
| non_square_tiles | BOOLEAN | false | Enable non-square tiles with aspect-ratio awareness. |
| auto_fix_thin_edges | BOOLEAN | false | In Manual Tiles mode, shrink tile_size to the next standard size (1536/1024/768 → 512) instead of just warning when the grid would leave a thin edge tile. At 512 (smallest standard) it can't shrink further — the thin edge is then handled downstream by overlap/mask_blur. Does not affect an explicit manual column/row grid. |
| imageopt | IMAGE | Input image to upscale. Optional if latent is connected instead — at least one of image/latent is required. | |
| upscale_modelopt | UPSCALE_MODEL | ESRGAN-style upscale model. Only applies when image is connected — has no effect in latent-only mode. | |
| latentopt | LATENT | Optional latent to resize/tile alongside (or instead of) the image. When connected, the latent output is resized (bislerp) to the tile-aligned target and latent_tiles gets one crop per tile. Can stand in for image entirely — at least one of image/latent is required. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | Upscaled through the model, resized to the tile-aligned target. Empty placeholder when no image is connected (latent-only mode). |
| tiles | IMAGE | Batch of the actual cropped tile pieces (edge tiles shifted inward to stay full-size, no black padding). Empty placeholder when no image is connected (latent-only mode). |
| latent | LATENT | Input latent resized to the tile-aligned target (bislerp). Empty placeholder when no latent is connected. |
| latent_tiles | LATENT | Batch of latent crops, one per image tile (same grid/order as `tiles`). Empty placeholder when no latent is connected. |
| layout | FIL_TILE_LAYOUT | Tile-grid layout (exact per-tile positions) — wire into FiL Tile Assembly to recombine processed tiles. |