OpenPoseEditorAdv
The OpenPose editor for ComfyUI that actually works
- IMAGE
- MASK
- MASK
- MASK
- MASK
- MASK
- MASK
- MASK
- MASK
- MASK
- MASK
If you've ever gone looking for a way to hand-draw an OpenPose skeleton in ComfyUI, you already know the story: every option is broken, abandoned, or "very limited." People have been asking for a working pose editor on r/comfyui for years, and the usual answers are forks that don't install or editors that won't open. OpenPoseEditorAdv is the exception - a maintained fork of space-nuko's editor (itself a port of the fkunn1326 openpose-editor from A1111) that fixed the bugs and added per-pose masks. It's the one that works.
What it's for
OpenPose ControlNet is how you tell SD to draw a person in a specific stance - same skeleton, completely different character, background, and style. The standard pipeline extracts the pose from a reference photo with a preprocessor, but sometimes you don't have a photo. Sometimes you want to invent the pose, tweak a detected one, or place multiple figures in one frame. That's what this node does: an in-browser canvas where you drag the stick figure's joints around and get a usable pose image out the other side.
How it works
Double-click the node and an editor panel opens over the graph. The frontend (built on fabric.js) draws a skeleton with all 18 keypoints, colored limbs, undo/redo, flip, and a lock mode. Add as many poses as you want, drag joints until the stance looks right, and load or save pose JSON files. The killer feature: it auto-generates a mask for every pose. So when you have three people in a scene, each one gets its own bounding-box mask that you can use for per-pose regional conditioning instead of one blob of shared control.
Back on the Python side, it behaves a lot like a LoadImage node. When you queue, it loads the reference image you picked and emits the canvas rendering plus the masks.
Inputs and outputs
Only two inputs, and you mostly don't touch the second one:
- image - a string. Pick your image from the input folder, just like LoadImage.
- savedPose - the pose JSON, managed automatically by the editor as you edit. Leave it alone; it lives in the node's properties so your pose survives saving and reopening the workflow.
Outputs:
- IMAGE - the rendered pose skeleton. This is your ControlNet conditioning image. Feed it to an OpenPose preprocessor or straight into an openpose ControlNet node (openpose_full if you need hands/face, plain openpose otherwise) with your text prompt.
- MASK × 10 - one per pose, up to ten. Wire them to regional conditioning or whatever needs to know where each figure is.
Two honest notes. First, the masks are bounding boxes around each pose's keypoints, not silhouettes - fine for separating regions, but if you need a tight per-person mask, refine it downstream. Second, the pose image itself is just the stick figure; it's the ControlNet that turns it into a person, so pair this with a good openpose model for your checkpoint.
Installing it
OpenPoseEditorAdv ships in the ULTools for ComfyUI pack (jkrauss82/ultools-comfyui) alongside three other nodes. ComfyUI Manager: search "ULTools for ComfyUI". Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/jkrauss82/ultools-comfyui
cd ultools-comfyui
pip install -r requirements.txt # pandas, numpy, piexif
Restart ComfyUI and the node appears under image. No ControlNet downloads come with the pack - you still need a ControlNet model for the pose to do anything, plus an openpose preprocessor pack if you're extracting poses from photos.
It's a hobby-project pack, so expect rough edges rather than rapid support, but this node is the rare OpenPose editor that opens, edits, and survives a workflow save. If you've been dragging skeleton images through an external tool, that alone is worth the install.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | STRING | — | |
| savedPose | STRING | — |
Outputs (11)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| MASK | MASK | — |
| MASK | MASK | — |
| MASK | MASK | — |
| MASK | MASK | — |
| MASK | MASK | — |
| MASK | MASK | — |
| MASK | MASK | — |
| MASK | MASK | — |
| MASK | MASK | — |
| MASK | MASK | — |