Artfat Resolution
Artfat Resolution computes the whole chain
- width
- height
- mid_width
- mid_height
- final_width
- final_height
- latent
- info
The most annoying part of a low-base + upscale workflow isn't the upscaling - it's the bookkeeping. Generate small at a clean resolution, upscale to a mid size, upscale again to a final size, and somewhere along the way you're typing the same numbers into three different nodes and hoping they agree. Artfat Resolution is a tiny node that does that math for you: you pick one size and two upscale factors, and it hands you the entire chain as outputs - base, mid, final - plus a ready empty latent and a text readout you can wire straight into your filename.
It's built for the Krea 2 / Selfism "low-base + hi-res fix" crowd, where you deliberately generate short (512–640 on the short side) and then grow it in two passes. That pattern exists for a reason: models fall apart above their native resolution - duplicate anatomy, tiling, that soft smeary look - and the fix is to generate small and upscale with a low-denoise second pass. This node makes the "which size is my second pass actually going to be" question visible before you spend the VRAM on a guess.
How it works
The size dropdown is the whole interface. Three ways in:
- Preset size - eight ready options (
2:3 portrait · 512×768,1:1 square · 640×640,16:9 wide · 832×480, etc.). Beginner-friendly and usually enough. - Custom ratio - set
base(the short side) plusratio_w/ratio_h. Want a 3:1 banner at a 512 short side?ratio_w=3, ratio_h=1. - Manual W×H - type exact
manual_w/manual_h. This is the one mode where nothing gets snapped; the README is emphatic that exact stays exact.
Then upscale_1 and upscale_2 are decimal multipliers - 1.0 means off, a true passthrough that doesn't even snap. Everything passes through a multiple snap (8/16/32/64), so the numbers that come out are actually usable downstream. There's a latent_type dropdown (16ch for SD3/Flux/Krea 2, 4ch for SD1.5/SDXL) and a batch_size for the latent.
The outputs are the story: width, height, mid_width, mid_height, final_width, final_height (all INT), an info string like 512x768 -> 960x1472 -> 1920x2944, and a latent output that's a ready empty LATENT at base size - so it replaces your EmptyLatentImage entirely. The node even draws the base → mid → final chain live on its face as you drag the widgets, which is a small touch that saves real time when you're tuning a banner ratio.
The inputs that actually matter
For 90% of use: size and upscale_1/upscale_2. Wire the width/height INTs into your KSampler's empty latent (or just use the built-in latent output - it's already the right size and channel count). Wire info into a text node for the filename. The thing to actually think about is latent_type: get it wrong and you're feeding a 16-channel latent into a 4-channel model, which errors out the instant you try to sample. Flux, SD3, Qwen and Krea 2 are all 16ch; classic SD1.5/SDXL are 4ch.
Install
Two ways, both painless - there are no model downloads and no extra Python dependencies (it only uses torch, which ComfyUI already ships):
ComfyUI-Manager: Custom Nodes Manager → Install via Git URL → paste https://github.com/artfat-creator/ComfyUI-Artfat-Resolution.
Manual clone:
cd ComfyUI/custom_nodes
git clone https://github.com/artfat-creator/ComfyUI-Artfat-Resolution.git
Then restart ComfyUI. A browser refresh isn't enough - the node registers on server start. It shows up under the artfat category.
Gotchas
- Manual mode won't save you from the VAE. Exact dimensions that aren't a multiple of 8 can choke the VAE decode (latents are 8x smaller per side). If you're going fully manual, keep
manual_w/manual_hsane multiples - the node won't do it for you. multipleof 8 is tempting but risky for Krea 2 / Qwen-based models; the author's own tooltip flags 16/32 as the safe ones.- You can't downscale with this thing -
upscale_1/upscale_2floor at 1.0. It's a resolution planner, not a resizer. - It's a tiny node from a small author, so don't expect a big support community. For this one you probably won't need it - the whole thing is one dropdown and two multipliers.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| size | COMBO | 2:3 portrait · 512×768 | Ready size, or 'Custom ratio' (uses ratio_w/h + base), or 'Manual W×H' (exact). |
| base | INT | 512128–8192 | Short side of the BASE gen. Used ONLY in 'Custom ratio' mode. |
| ratio_w | INT | 21–100 | Aspect width — 'Custom ratio' mode only (e.g. 3 for a 3:1 banner). |
| ratio_h | INT | 31–100 | Aspect height — 'Custom ratio' mode only (e.g. 1 for a 3:1 banner). |
| manual_w | INT | 120064–16384 | Exact width — 'Manual W×H' mode only. NOT snapped (kept exact). |
| manual_h | INT | 40064–16384 | Exact height — 'Manual W×H' mode only. NOT snapped (kept exact). |
| multiple | COMBO | 32 | Snap base+upscaled sides to a multiple. 16/32 safe for Krea 2 / Qwen. Ignored for the exact side in Manual mode. |
| upscale_1 | FLOAT | 1.001–8 | 1st upscale stage. 1.0 = off (passthrough, exact). |
| upscale_2 | FLOAT | 1.001–8 | 2nd upscale stage (applied on top of stage 1). 1.0 = off. |
| batch_size | INT | 11–64 | Batch size for the LATENT output. |
| latent_type | COMBO | SD3 / Flux / Krea 2 (16ch) | Channels for the empty LATENT. Krea 2 / Flux / SD3 = 16ch; classic SD = 4ch. |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| width | INT | — |
| height | INT | — |
| mid_width | INT | — |
| mid_height | INT | — |
| final_width | INT | — |
| final_height | INT | — |
| latent | LATENT | — |
| info | STRING | — |