CCSR
CCSR — the detail-restoring upscaler, without the 12GB+ VRAM tax
- image
- image
CCSR (Conditioning with Contrastive supervision for image Super-Resolution) is the 2023-era diffusion upscaler that everybody respected and almost nobody ran, because it was a VRAM monster. Where Real-ESRGAN is a pixel upscaler that adds resolution, CCSR is a generative restorer: it reconstructs plausible high-frequency detail - texture, sharp edges, recovered detail that was never really in the source. That's a different job, and it's the one people usually actually mean when they say "make this image look better." The historical problem was that local CCSR wanted a serious card (12GB+ and slow), which is exactly the kind of thing that ends up serving a niche. This node puts it in the cloud: feed it an image, get a restored, upscaled IMAGE back.
The key mental model, straight from the upscaling essay: this is a detail tool, not a pixels tool. Use it on soft or damaged images where you want the model to invent plausible detail. Use Real-ESRGAN (also in this pack) when the source is already sharp and you just want it bigger. And know that, like every generative restorer, it will rewrite fine features - don't point it at a face you need to recognize and expect identity to survive.
How it works
Another upscale-classified node in the pack: it sends the image to Runware, the API runs CCSR's multi-scale diffusion restoration, and the result comes back as a native IMAGE tensor. What makes this node different from the Real-ESRGAN node is the controls - CCSR exposes diffusion-style settings because it's fundamentally a diffusion process:
image(required) - the input tensor.upscaleFactor-(default)or2. Note there's no 4× here; CCSR's default restoration scale is around 2×, and pushing a diffusion restorer past its comfortable factor is how you get artifacts.settings.CFGScale- an off-by-default gate withCFGScale_value. Higher = output sticks closer to the prompt; for pure restoration you usually want it low. Leave the gate off and let the model default unless you know why you're changing it.settings.controlNetWeight- −4 to 4, default 1. This is how hard the ControlNet-style conditioning (the "keep the source structure" constraint) is applied. Lower it to let the model stray further toward its reconstruction; negative values steer away from the guide. At 0 it's pure generation from the prompt.settings.positivePrompt/settings.negativePrompt- yes, an upscaler with prompts. CCSR conditions on a text description of what the result should look like. Empty positive prompt means "restore this faithfully"; a prompt like "highly detailed, sharp, clean" can push texture quality. The negative prompt is ignored when guidance is disabled (CFG ≤ 1), per the tooltip.settings.steps- off-by-default gate;steps_value20–60 (default 20). More steps = slower but more thorough restoration.settings.seed- gate +seed_valuefor reproducible runs.outputFormat/outputQuality- JPG/PNG/WEBP and compression quality.
The output is image → Preview or Save.
Installing
cd ComfyUI/custom_nodes
git clone https://github.com/Runware/ComfyUI-Runware
pip install -r ComfyUI-Runware/requirements.txt
Or ComfyUI Manager → search Runware → install → restart. API key via Settings, RUNWARE_API_KEY, or runware auth login. No local weights - the VRAM tax is gone, which is the entire appeal of the cloud version.
Where people get burned
Two classic mistakes. First, treating it like a pixel upscaler and being disappointed that it "changed" the image - it's supposed to; it's reconstructing detail, and that's the point. Second, running it on already-clean images, where restoration adds unwanted texture and detail noise (the exact complaint the KB logs against SUPIR for the same category). If the source is clean and sharp, Real-ESRGAN is the right node. CCSR is for the soft, damaged, compressed stuff - and now you can actually afford to run it.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| upscaleFactoropt | COMBO | (default) | Factor by which to upscale the generated image. A value of 2 doubles width and height. |
| settings.CFGScaleopt | BOOLEAN | false | Enable to set settings.CFGScale. Off uses the model's default. |
| settings.CFGScale_valueopt | FLOAT | 0.00 | Guidance scale representing how closely the output will resemble the prompt. Higher values produce results more aligned with the prompt. |
| settings.controlNetWeightopt | FLOAT | 1.00-4–4 | Strength of the ControlNet influence. A value of 0 means no influence. Higher values increase the influence, and negative values can be used to steer away from the guide image. |
| settings.negativePromptopt | STRING | Prompt to guide what to exclude from generation. Ignored when guidance is disabled (CFGScale ≤ 1). | |
| settings.positivePromptopt | STRING | Text prompt describing elements to include in the generated output. | |
| settings.seedopt | BOOLEAN | false | Enable to set settings.seed. Off uses the model's default. |
| settings.seed_valueopt | INT | 00–9223372036854776000 | Random seed for reproducible generation. When not provided, a random seed is generated in the unsigned 32-bit range. |
| settings.stepsopt | BOOLEAN | false | Enable to set settings.steps. Off uses the model's default. |
| settings.steps_valueopt | INT | 2020–60 | Total number of denoising steps. Higher values generally produce more detailed results but take longer. |
| ttlopt | BOOLEAN | false | Enable to set ttl. Off uses the model's default. |
| ttl_valueopt | INT | 60 | Time-to-live (TTL) in seconds for generated content. Only applies when `outputType` is `URL`. |
| outputFormatopt | COMBO | JPG | File format for the generated image. |
| outputQualityopt | INT | 9520–99 | Compression quality of the output. Higher values preserve quality but increase file size. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |