OpenPose Studio
Draw and edit ControlNet poses without leaving the graph
- pose_keypoint
- areas
- IMAGE
- JSON
- KPS
If you've ever tried to pose a character for ControlNet by dragging a skeleton around in some separate web app, then re-exporting the JSON, then re-uploading it, then realizing you got an elbow wrong - OpenPose Studio is the fix. It's a full visual pose editor that lives inside the node itself. You draw the pose on the canvas, right there in your ComfyUI graph, and it outputs a rendered skeleton image plus the raw keypoint data, ready for ControlNet's OpenPose preprocessor slot.
It's built by andreszs (Inuya5haSama on Reddit), and it's a from-scratch rebuild of the old, long-neglected OpenPose Editor node - same underlying JSON format so your existing poses still load, but a genuinely more reliable editor on top: individual keypoint editing with real visual feedback, a pose gallery with thumbnails, collections for organizing multi-pose files, and a merger tool for consolidating them. It's actively maintained, which matters - the old editor mostly wasn't, and a pose editor with silent bugs is worse than no editor at all.
How it works
Body pose is 17 keypoints, hands are 21 each, face is 70 landmarks - the standard OpenPose skeleton. OpenPose Studio gives you a canvas to click-drag those points directly, with per-limb toggles for what actually gets rendered into the output image. Pair it with a pose_keypoint input from an upstream detector and it'll load a real photo's pose so you can tweak it instead of drawing from scratch - that's usually the fastest path: detect, adjust, render.
The inputs and outputs that matter
pose_json(STRING, required) - a raw pose JSON, if you're feeding one in as text rather than editing live. Leave it default and just use the canvas editor if you're building from scratch.render_body,render_hand,render_face(BOOLEAN, all default on) - what gets drawn into the output skeleton image. Turn off what you don't need; aopenpose_faceonlystyle ControlNet pass, for instance, only wants the face layer lit.pose_keypoint(POSE_KEYPOINT, optional) - wire in the output of a DWPose Estimator (or similar) to load a detected pose as your starting point instead of drawing cold.areas(CONDITIONING_AREAS, optional) - this one's specific to andreszs's own ecosystem: his companion pack ComfyUI-Lora-Pipeline ships "Conditioning Pipeline (Set Area)" nodes for per-region conditioning, and this input lets OpenPose Studio visualize those areas overlaid on the pose canvas. If you're not using that pack, ignore it.
Three outputs: IMAGE is the rendered skeleton - this is what you plug into your ControlNet's image input. JSON is the pose data as a string, in standard OpenPose format, for saving or feeding to other tools. KPS is the same data typed as POSE_KEYPOINT, for chaining into other pose-aware nodes rather than round-tripping through text.
How to install it
It wasn't in ComfyUI Manager at launch - search "OpenPose Studio" there first since that can change, but the documented path is manual:
cd ComfyUI/custom_nodes
git clone https://github.com/andreszs/ComfyUI-OpenPose-Studio
Restart ComfyUI and the node shows up under image > OpenPose Studio. Needs Python 3.10+ and a reasonably recent ComfyUI build - nothing else. No model downloads, no pip dependencies to fight; the whole editor runs on browser Canvas 2D, so there's genuinely nothing heavy here.
Common issues & troubleshooting
Face keypoints won't move. By design, face landmarks are pass-through only in the current version - you can toggle face rendering on/off, but you can't drag individual face points the way you can body and hand joints. Not a bug, just not built yet.
Pose Merger output looks squashed or misaligned. The merger tool doesn't automatically unify resolution across the files you're combining - if your source poses were captured at different canvas sizes, fix that before merging, not after.
The UI just doesn't show up, or looks stale after an update. Hard-refresh your browser (clear cache) and restart ComfyUI. This one's a JS/UI-heavy extension, so a cached frontend bundle is the usual culprit.
Your render toggles don't save with the workflow. They're stored in browser localStorage, not in the workflow JSON - expected behavior, but it'll surprise you the first time you reload a saved workflow on a different browser or machine and the toggles are back to default.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| pose_json | STRING | — | |
| render_body | BOOLEAN | true | — |
| render_hand | BOOLEAN | true | — |
| render_face | BOOLEAN | true | — |
| pose_keypointopt | POSE_KEYPOINT | — | |
| areasopt | CONDITIONING_AREAS | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| JSON | STRING | — |
| KPS | POSE_KEYPOINT | — |