OEKonva Editor Node
Drag a Skeleton Into the Exact Pose You Want
- Coco 18 Image
- Skeleton JSON
OpenPose ControlNet is brilliant until you need a pose that doesn't exist in any photo. The dw_openpose preprocessor is great at reading a pose off a reference image, but the moment you want to nudge a hand, lift an arm, or invent a stance nobody is standing in, you're stuck. That's the hole this node fills: it's a full OpenPose editor living inside ComfyUI, so you can click Open Editor, drag the joints, and feed the result straight into your ControlNet without leaving the graph.
The skeleton it edits is the classic Coco 18 model - 18 keypoints covering torso, limbs, hands and feet - drawn in the same style an openpose ControlNet expects. "Konva" in the name is the JavaScript canvas library the editor is built on (with a Vue frontend), and it shows: the editor feels like a proper tool, not a bolted-on widget.
How it works
When the node runs, it renders a default skeleton at your chosen width/height into an IMAGE tensor using OpenCV on the backend. Click Open Editor on the node and a separate window opens showing that skeleton on a Konva canvas. You drag the colored joints to pose it; scroll wheel zooms, middle-mouse-drag pans. Two genuinely useful extras: you can load a background image to trace a pose over an actual photo, and you can load or save the skeleton JSON, so a pose you spent twenty minutes on survives as a reusable file.
Every edit is written back into the node's hidden state, which rides ComfyUI's own workflow memory - save the workflow, reopen it later, and your pose is still there. The editor even has a "move whole skeleton" toggle so you can reposition the figure without wrecking every joint you just placed, and it remembers your viewport zoom and pan between sessions.
The inputs and outputs that matter
The node ships with a sensible default, so beginners can ignore almost everything:
- width / height - canvas resolution, 512–8192 in steps of 8. Defaults are 512×512. Anything you output will be this size, so match it to where your ControlNet expects the conditioning image.
- bone_style -
lineorellipse. Ellipse draws tapered bones that look closer to the standard OpenPose skeleton; line is the plain stick figure. Cosmetic, mostly. - preview_switch - toggles the built-in preview so you don't need a separate Preview Image node.
- skeleton_json_str - a multiline JSON field. Paste a previously saved pose here and the editor loads it. It's also where the node stores your current pose, so you can copy it out.
Outputs are the two things you actually use: Coco 18 Image (an IMAGE) and Skeleton JSON (a STRING). The image is what you're after - wire it into a ControlNet Apply node paired with an openpose or union checkpoint (SDXL's xinsir union, or the modern Flux/Z-Image/Qwen pose unions, all take this kind of map). The JSON is OpenPose format (people[].pose_keypoints_2d, 18 joints × 3 values), handy for sharing poses or feeding other pose-aware nodes.
Installing it
The easy way is ComfyUI Manager - search for OEKonva Editor (or the pack name) and install from the list. Otherwise:
cd ComfyUI/custom_nodes
git clone https://github.com/Endericedragon/comfyui-openpose-editor-konva
Then restart ComfyUI. No model downloads, no heavy dependencies - the Python side only needs OpenCV, numpy and torch, all standard fare. The repo ships a prebuilt frontend, so you don't need Node or npm unless you're hacking on the code yourself (the README's npm/fnm instructions are for developers, not users).
Where people get burned
Two gotchas, both real and both avoidable. First, since version 0.2.0 this node uses ComfyUI's Schema V3 custom-node API (comfy_api.v0_0_2). That means it needs a recent ComfyUI - on an old install it simply won't load, so update before you panic. Second, it imports cv2 at startup; if your ComfyUI happens to lack opencv-python you'll get an import error, fixable with pip install opencv-python in ComfyUI's environment.
One design quirk worth knowing: if you change width or height after posing, the node deliberately discards your pose and resets to the default skeleton (it does this to avoid rendering an inconsistent map). Save your skeleton JSON first, then change size and paste it back in. And remember the bigger picture - this is a pose editor, not the model itself: you still need an openpose ControlNet at a sensible conditioning scale (0.9-ish for the Flux-era unions) to turn your dragged skeleton into pixels.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| width | INT | 512512–8192 | — |
| height | INT | 512512–8192 | — |
| preview_switch | BOOLEAN | true | — |
| bone_style | COMBO | line | 2 options: line, ellipse |
| skeleton_json_str | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| Coco 18 Image | IMAGE | — |
| Skeleton JSON | STRING | — |