PowerPaint
One model, five inpainting jobs, switched by a dropdown
- model
- vae
- image
- mask
- powerpaint
- clip
- positive
- negative
- model
- positive
- negative
- latent
BrushNet asks a base checkpoint to inpaint. PowerPaint goes further - it's a single model trained to do five different kinds of inpainting, switched by which "task prompt" you hand it, instead of needing five specialist fine-tunes. Text-guided edits, shape-guided fills, object removal, context-aware completion, and outpainting all live behind one function dropdown on this node. That's the whole idea from the paper title this is built on: "A Task Is Worth One Word."
How it works
Like BrushNet, PowerPaint is a plug-and-play adapter rather than a full model swap, and it shares BrushNet's scale/start_at/end_at mechanics for controlling how strongly and when it applies. What's different is the extra clip input, which isn't your normal text encoder - it comes from PowerPaint CLIP Loader, which merges the standard SD1.5 text encoder with PowerPaint's learned task-prompt embeddings. Picking a function value swaps which task prompt gets fed to the network alongside your actual text prompt, and that's what changes the model's behavior between "just remove this object" and "extend the scene naturally."
Inputs and outputs
The fields that actually matter:
function- the five modes:text guided,shape guided,object removal,context aware,image outpainting. This is the whole point of the node.fitting(default 1, range 0.3–1) - the README's own term for it is "PowerPaint fitting degree." Lower it if the result is fighting your prompt too hard.save_memory(none/auto/max) - splits attention computation into slices to trade speed for VRAM. Worth setting tomaxif you're VRAM-constrained, or if you're on Mac and hit theError: total bytes of NDArray > 2**32error.scale(default 1, range 0–10) andstart_at/end_at(default 0/10000) - same strength and step-window semantics as the BrushNet node.
Sockets: model, vae, image, mask, powerpaint (a BRMODEL from BrushNet Loader, pointed at a PowerPaint checkpoint), clip (from PowerPaint CLIP Loader), and positive/negative. Outputs are model, positive, negative, latent - same pattern as BrushNet: wire model and latent into your KSampler, and the conditioning outputs pass through untouched.
The prompt trick, from the author directly: for object removal, add "empty scene blur" to your prompt; for context-aware and outpainting, add "empty scene." That said, the author's own experiments found these additions aren't strictly necessary, and he deliberately didn't hardcode prompt injection so it wouldn't fight custom text-generation or CLIP nodes people already have in their graphs - a reasonable call, but it means you're the one responsible for adding those phrases if you want the boost.
Installing it
Same pack-wide install: ComfyUI Manager search "BrushNet," or git clone https://github.com/nullquant/ComfyUI-BrushNet into custom_nodes plus pip install -r requirements.txt. PowerPaint specifically needs three downloaded files: diffusion_pytorch_model.safetensors and pytorch_model.bin from JunhaoZhuang/PowerPaint-v2-1 on HuggingFace (into models/inpaint), plus a standalone SD1.5 text encoder model.safetensors (into models/clip) for the PowerPaint CLIP Loader node.
Common issues
Old workflows breaking after the v2 update. The README calls this out directly: after the May 2024 PowerPaint v2 upgrade, older saved workflows would stop producing sensible results. The fix is specific - check the end_at parameter, and if it's set to 1, bump it up to something large again (the default is 10000). Worth checking first if a workflow you saved a while back suddenly looks wrong.
Object removal doesn't fully erase, especially foreground subjects. This is a documented limitation, not a config mistake. The author's own recommended fix: describe the object you're removing in the negative prompt, and describe the resulting empty scene in the positive prompt.
Latent size mismatch. The latent you feed in doesn't have to come from a BrushNet node, but it must match the original image's size divided by 8 in latent space - a mismatch here will produce garbled output rather than a clean error.
Model order. Same rule as BrushNet: put model-modifying nodes before PowerPaint in the chain, not after.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| vae | VAE | — | |
| image | IMAGE | — | |
| mask | MASK | — | |
| powerpaint | BRMODEL | — | |
| clip | CLIP | — | |
| positive | CONDITIONING | — | |
| negative | CONDITIONING | — | |
| fitting | FLOAT | 1.000.3–1 | — |
| function | COMBO | 5 options: text guided, shape guided, object removal, context aware, image outpainting | |
| scale | FLOAT | 1.000–10 | — |
| start_at | INT | 00–10000 | — |
| end_at | INT | 100000–10000 | — |
| save_memory | COMBO | 3 options: none, auto, max |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| positive | CONDITIONING | — |
| negative | CONDITIONING | — |
| latent | LATENT | — |