Superside PASD Upscaler Node
PASD super-resolution — ControlNet-guided upscaling with no local weights
- image
- IMAGE
PASD is the acronym for Pixel-Aware Stable Diffusion - an upscaling architecture that runs a diffusion pass over your image with ControlNet guidance to keep it faithful while it adds detail. This node exposes it as a hosted call on fal.ai (PASD-SDXL), which is the version of this story that doesn't ask you to download SDXL, a ControlNet, and a wavelet pipeline onto your own GPU. Connect an image, and you get back a bigger, sharper one.
Put it in the "more detail" bucket of the upscaling taxonomy, not the "more pixels" one. A Lanczos or ESRGAN upscale adds no content; PASD is generative - it re-renders at higher resolution with the original structure held in place by ControlNet, and it adds a wavelet color-correction step on top so the enlarged result keeps the source's color character. That's the mechanism, and it's why the results read as real detail instead of the mush you get from naive resampling.
The inputs that matter
image,api_key- the essentials.scale(default 2, 1–4) - how much bigger. 2x is the sensible default; 4x from a small source is asking a lot of any upscaler.steps(default 25, 10–50) - diffusion steps. More is cleaner and slower. Since you're paying per call, find the lowest step count that looks clean before you sit at 50.guidance_scale(default 7) - prompt adherence. This is a diffusion pass, so it obeys the (optional) prompt - a non-empty prompt with default 7 CFG can push the result around more than you expect.conditioning_scale(default 0.8, 0.1–1.0) - the ControlNet strength. This is the faithfulness dial: how hard the model is held to the original structure. Lower it and the model has more freedom to invent; the default 0.8 is already a good "faithful but detailed" balance.prompt(optional, default empty) - steer what the model adds. Leave empty for a pure upscale; fill it for "keep it photographic" style nudges.negative_prompt- a sensible default is pre-filled ("blurry, dirty, messy... ai generated"), which is worth keeping.
One output: the upscaled IMAGE.
How it works
Your image goes up to fal, PASD-SDXL runs the pixel-aware diffusion with ControlNet conditioning and wavelet color correction, and the result comes back as a tensor. No local model, no VRAM, no weights - and per-call cost, plus your image leaving the machine. For the same architecture locally you'd be juggling SDXL weights, a ControlNet, and the PASD pipeline; the hosted version trades that setup for a meter.
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/Superside/comfyui-superside-nodes
pip install -r requirements.txt
Restart ComfyUI, find it under Superside, and paste a fal key into api_key (blank falls back to a FAL_KEY env var).
Where people get burned
The conditioning_scale is the knob people skip and then wonder why the upscale looks slightly wrong rather than just detailed - too high and it's over-constrained, too low and the model drifts. Keep it near the default unless you have a reason. And set expectations from the KB's hierarchy: generative upscalers re-render, which means faces, text, and logos can change. PASD's ControlNet holds the structure better than a plain img2img upscale, but if the output has to be pixel-identical to the source, a non-generative upscaler is the honest choice. For "bigger AND more detailed" on a normal photo, this is one of the stronger hosted options in the pack.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| api_key | STRING | — | |
| scaleopt | INT | 21–4 | — |
| stepsopt | INT | 2510–50 | — |
| guidance_scaleopt | FLOAT | 7.01–20 | — |
| conditioning_scaleopt | FLOAT | 0.80.1–1 | — |
| promptopt | STRING | — | |
| negative_promptopt | STRING | blurry, dirty, messy, frames, deformed, dotted, noise, raster lines, unclear, lowres, over-smoothed, painting, ai generated | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |