Liquify Image (WepeNerd)
Push-warp an image right inside the node
- image
- image
- mask
Liquify Image (WepeNerd) gives you a Photoshop-style liquify brush inside a ComfyUI node: load an image, push-warp it by dragging, and get the result out as a normal IMAGE plus a MASK. It's the node for "this face is a little lopsided," "push that shoulder down a touch," or "squash the composition before I feed it into an inpaint pass" - small geometric nudges that no amount of prompting will achieve, because they're edits to the pixels themselves, not to the concept.
How it works: the node carries a hidden image_data string widget that holds your edited image as a base64 PNG. The frontend (js/wn_liquify.js) runs the actual editor in your browser - you load or drag-and-drop a file into the node, brush over it to warp, and on execution the backend decodes that string into a ComfyUI IMAGE tensor and derives a MASK from the alpha channel. You get two outputs: image (the warped result) and mask (an alpha-derived mask, so you can restrict a later inpaint to exactly the region you touched). If the node has no data, it outputs a 64×64 blank - a graceful nothing rather than a crash.
Now the honest version, because this is v1 and the limits are real:
- It is self-loading only. There is no upstream
IMAGEinput socket. You cannot wire aLoad Imagenode into it; you load the image inside the node's own browser UI. The author lists upstreamIMAGEinput as planned for a future version, so if that's a hard requirement, wait or use the file-load path. - The edited PNG lives in the workflow JSON as base64. Every pixel of your warped result is embedded in the saved workflow. For small images that's fine; for big ones you will genuinely notice the file size, and the README calls out "very large saved workflows" as a known consequence.
- Reopening restores the last flattened warp, not the original plus a live displacement field. If you want to undo a warp after saving and reopening, you can't - the editable state is gone. Save your source before you edit if you might want to redo it.
- Big images get downscaled to the browser working cap set by
MAX_DIMinjs/wn_liquify.js. The result you get out is the downscaled version, so for pixel-critical work, keep your source near the working size to avoid surprises.
Where it sits in a workflow: liquify first, then refine. Nudge the pose or face shape, grab the mask, and feed both into an inpaint or detailer pass so the rest of the image stays untouched. The mask output is what makes this genuinely useful rather than a novelty - it gives the next node exactly the pixels you moved.
Install is the pack standard: ComfyUI Manager, search WepeNerd, or git clone https://github.com/WepeNerd/ComfyUI-WepeNerd.git into custom_nodes, then pip install -r requirements.txt and restart. It's browser-side, so after updating the pack, a hard refresh of the ComfyUI page is worth doing - if the editor doesn't appear or drag behaves oddly, that's the first thing to try, and the browser dev console is where you'd spot a JS error.
If you just need a quick warp now, it works today as-is. If you need it as a node in a pipeline feeding other nodes, the self-loading-only limitation will annoy you - that's the trade to know before you add it to your default workflow.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image_data | STRING | — | |
| imageopt | IMAGE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |