Appendage Editor
The Node That Fixes One Arm at a Time (No Editor Window Needed)
- POSE_KEYPOINT
- POSE_KEYPOINT
The interactive editor is great for one-off tweaks, but it's a dead end when you need the same fix on every frame. Appendage Editor is the procedural counterpart from the same pack: no editor window, no dragging - just pick a body part, dial in scale/rotation/offset, and it rewrites the keypoints in the graph. It's the difference between "I'll fix this pose by hand" and "I'll tell the pose what's wrong."
You chain it after a pose detector (anything producing POSE_KEYPOINT, typically the DWPose/OpenPose Pose node from comfyui_controlnet_aux) and feed the result into another Appendage Editor or into the pack's Openpose Editor Node to render the final pose map. The README's own pitch: chain N of these together, then render once at the end.
How it works
Under the hood it's arithmetic on the standard COCO 18-keypoint layout. Each appendage maps to a set of joint indices with a pivot - shoulder for the upper arm, elbow for the forearm, hip for the leg, knee for the lower leg, wrist for a hand. Rotation spins the joints around that pivot, and scale grows or shrinks them along the direction away from it.
The interesting dial is bidirectional_scale. On (default off), the part scales in all directions from its pivot. Off, it scales only away from the body - so enlarging a forearm doesn't shove it into the shoulder and cannibalize the adjacent part. For realistic arm/leg fixes, leave it off; for deliberate chunky-shoulder drama, turn it on.
One honest limitation: feet edit the ankle joint only, because COCO's 18 joints have no dedicated foot keypoints - and hands need actual hand_*_keypoints_2d data present, so your detector has to be running with hand estimation enabled.
The inputs that matter
- POSE_KEYPOINT (required) - the pose to edit.
- appendage_type - pick from 18 choices: left/right upper arm, forearm, full arm; the same trio for legs; left/right hand and foot; plus
torsoandshoulders. - scale / x_offset / y_offset / rotation - the actual edit. Scale 0–10, rotation ±180°.
- person_index -
-1edits everyone in the frame; a specific index targets one person. Handy for group shots where only the background figure has the janky arm.
The animation hook is that the transform inputs accept lists, one value per frame, with list_mismatch_behavior (loop / repeat / truncate) deciding what happens when your list is shorter or longer than the pose count. That's what makes this node genuinely useful for video work - a per-frame arm correction before the render node, instead of a hundred manual edits. This is the pack's newest node, contributed via PR, and it shows: it's the cleanest part of the codebase.
Wiring and output
Output is a single POSE_KEYPOINT. One caveat: it always returns a list, even when you fed it one pose, so whatever you chain into needs to accept a keypoint list - the pack's own render node does, and controlnet_aux-style consumers generally do. If your downstream node chokes, that list-wrapping is the thing to check first.
Installing it
Same pack as the editor - one install gets you both. ComfyUI Manager (search ultimate-openpose-editor), or:
cd ComfyUI/custom_nodes
git clone https://github.com/westNeighbor/ComfyUI-ultimate-openpose-editor
cd ComfyUI-ultimate-openpose-editor
pip install -r requirements.txt
The requirements are light (torch, numpy, opencv-python, matplotlib, polygraphy) and there are no model downloads - it edits keypoints, it doesn't detect them. Restart ComfyUI and find it under Right Click → ultimate-openpose → Appendage Editor.
Same folder gotcha as its sibling: if you install via Manager and the folder gets renamed, the pack's editor UI won't open - but since this node has no UI at all, you can sidestep that whole class of problem. If the node itself is missing after install, you're missing the POSE_KEYPOINT type from comfyui_controlnet_aux.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| POSE_KEYPOINT | POSE_KEYPOINT | — | |
| appendage_type | COMBO | left_upper_arm | 18 options: left_upper_arm, left_forearm, left_full_arm, right_upper_arm, right_forearm, right_full_arm, +12 |
| scaleopt | FLOAT | 1.000–10 | — |
| x_offsetopt | FLOAT | 0.00-2–2 | — |
| y_offsetopt | FLOAT | 0.00-2–2 | — |
| rotationopt | FLOAT | 0-180–180 | — |
| bidirectional_scaleopt | BOOLEAN | false | If true, scales in both directions from pivot. If false, only scales away from body to prevent cannibalizing adjacent parts. |
| person_indexopt | INT | -1-1–100 | Person to edit (-1 for all people) |
| list_mismatch_behavioropt | COMBO | loop | Truncate: Truncate the list to the shortest length. Loop: Loop the list to the longest length. Repeat: Repeat the list to the longest length. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| POSE_KEYPOINT | POSE_KEYPOINT | — |