PowerPaint CLIP Loader
Merges the task-prompt weights the PowerPaint node needs
- clip
PowerPaint's whole trick is doing five different inpainting jobs - text-guided edits, shape-guided, object removal, context-aware fill, outpainting - from one model, switched by a learned "task prompt" instead of five separate fine-tunes. Those task-prompt embeddings don't live inside a normal CLIP text encoder; they're a separate file the PowerPaint authors trained alongside the base SD1.5 text encoder. This node's entire job is gluing those two pieces together into one CLIP object that the PowerPaint node can actually consume.
If you're using the base BrushNet node, you don't need this at all - it uses your regular CLIPTextEncode setup like any normal workflow. This loader exists purely for the PowerPaint node's clip input.
Inputs and outputs
Two dropdowns, both populated by scanning your model folders - they'll show nothing until you've actually placed the files:
base- your SD1.5 text encoder (model.safetensors, or the fp16 variant), which the README points to fromnmkd/stable-diffusion-1.5-fp16orashllay/stable-diffusion-v1-5-archiveon HuggingFace. This goes inmodels/clip.powerpaint- the PowerPaint task-prompt weights (pytorch_model.bin), downloaded fromJunhaoZhuang/PowerPaint-v2-1on HuggingFace. This one goes inmodels/inpaint, alongside the PowerPaint diffusion weights.
Output: a single clip socket, which feeds the PowerPaint node's clip input specifically - not the base BrushNet node.
Installing it
Bundled with the whole pack, no separate install. ComfyUI Manager: search "BrushNet," install, restart. Manually: cd ComfyUI/custom_nodes && git clone https://github.com/nullquant/ComfyUI-BrushNet && pip install -r requirements.txt.
For the files themselves, you need three total for PowerPaint to work end to end, and this loader consumes two of them: from JunhaoZhuang/PowerPaint-v2-1 on HuggingFace, grab both diffusion_pytorch_model.safetensors (goes to the BrushNet Loader node instead, as the powerpaint model) and pytorch_model.bin (goes here, as the powerpaint input). Then the SD1.5 text encoder model.safetensors for the base input.
Common issues
Filename collisions, again. This is the recurring failure mode across the whole pack - PowerPaint's diffusion_pytorch_model.safetensors shares a filename with BrushNet's own checkpoint downloads, and multiple PowerPaint-related files can land with generic names too. The fix the community actually landed on, documented in the pack's own support threads: rename each download to something specific before you place it - PowerPaint_v2.safetensors for the diffusion weights, and keep pytorch_model.bin in its own dedicated PowerPaint subfolder under models/inpaint rather than mixed in with BrushNet's checkpoints.
Forgetting the SD1.5 text encoder is a separate file. It's easy to assume your regular checkpoint's CLIP will do, but PowerPaintCLIPLoader wants an explicit standalone text encoder in models/clip - if the base dropdown is empty, that's almost always the reason.
Empty dropdowns generally. Both fields only populate from files that already exist in the right folder. If either is blank, the fix is always "download the file and put it in the right place," not a config setting to hunt for.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| base | COMBO | 0 options: | |
| powerpaint | COMBO | 0 options: |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| clip | CLIP | — |