๐ Kisekae Body
Stop retyping 'thick thighs' in every prompt
- char
- char
Body tags are the ones you end up pasting into every single prompt for a character. 1girl, slim, long legs, thick thighs, toned - you know the block. Then you want the same character in a different outfit and you're back in the prompt box retyping it, or worse, deleting one line and silently breaking the rest.
๐ Kisekae Body is one section of a character, kept as structured data instead of text. It sits in a chain of section nodes, you set the few fields you care about, and it passes the whole character along to the next node. The prompt only gets built at the end, by Kisekae Prompt. This is the node that makes "swap the outfit, keep the girl" possible.
How it works
Under the hood the character is a plain dict travelling on a KISEKAE_CHAR wire, with one entry per section. Body is one of eight sections (identity, head, hair, body, outfit, style, pose, scene). Each field holds a value, an optional weight and a record of which node set it.
The node applies changes in a strict order, and it's worth internalising because it explains most surprises: incoming character first, then the section preset (which replaces the whole section, LoRAs and negatives included), then your field overrides. So a preset pick beats whatever came in on the wire, and a dropdown or typed override beats both.
Each field's dropdown has three kinds of options. (keep) passes the incoming value through untouched, (clear) removes it, anything else replaces it. The clever part lives behind Show advanced inputs at the bottom of the node: every field also has a _text box and an _append toggle. Typed text wins over the dropdown, and append adds to the incoming value instead of overwriting it - with exact duplicates skipped.
The inputs that matter
Nine fields, one per body axis: body_type, proportions, height, bust, waist, hips, thighs, muscle, extras, plus a free-text extra. In practice you'll set two or three and leave the rest on (keep).
body_type and muscle are where the silhouette comes from - slim, curvy, muscular, and the toned/abs/biceps options are separate dropdowns that stack rather than conflict. extras is the one people miss: tails and wings live there (cat tail, fox tail, angel wings, demon wings), not in the head section. If your catgirl has ears but no tail, that's why.
The preset dropdown at the top takes a preset whose file defines a body section, and replaces the entire body section with it. It only lists presets that actually have one, so a hair-only preset won't appear here - that's not a bug.
Output is a single char (KISEKAE_CHAR). Wire it into Kisekae Hair, Kisekae Outfit, or straight into Kisekae Prompt if body is all you wanted.
Install
ComfyUI Manager โ search the pack title kisekae (it's on the Registry as comfyui-kisekae), or:
cd ComfyUI/custom_nodes
git clone https://github.com/Kagejitsu/comfyui-kisekae
Restart ComfyUI. There are no extra Python dependencies - pyproject.toml lists an empty dependencies array, and the README's "No extra Python dependencies" is accurate here. The nodes land under the kisekae category with the ๐ prefix.
Common issues
A field looks set but the prompt doesn't change. Check whether the node is upstream of the thing that renders. A section node only mutates the character; nothing reaches CLIP until a Prompt node runs.
Your edit got overwritten. If a preset is selected on this node, the section preset is applied after the incoming character, wiping body values that came from earlier in the chain. Either empty the preset pick, or move your overrides to this node - this node's overrides always win over its own preset.
Advanced inputs mysteriously open on load. That's deliberate: a node saved with typed text or append on re-opens its advanced inputs so an override is never hidden. If the node feels huge, clear the _text boxes.
You renamed the dropdown values. Nothing here writes to the graph. Vocab changes go through Tansu's Dropdowns page (๐ Tansu in ComfyUI's top bar), then press R to refresh the node dropdowns.
Inputs (32)
| Name | Type | Default | Description |
|---|---|---|---|
| preset | COMBO | (none) | Replace the whole body section with this preset's body |
| body_type | COMBO | (keep) | (keep) passes the incoming value through; (clear) empties it |
| body_type_text | STRING | Typed text wins over the dropdown. (tag:1.2) weights work. | |
| body_type_append | BOOLEAN | false | append: add to the incoming value; replace: overwrite it |
| proportions | COMBO | (keep) | (keep) passes the incoming value through; (clear) empties it |
| proportions_text | STRING | Typed text wins over the dropdown. (tag:1.2) weights work. | |
| proportions_append | BOOLEAN | false | append: add to the incoming value; replace: overwrite it |
| height | COMBO | (keep) | (keep) passes the incoming value through; (clear) empties it |
| height_text | STRING | Typed text wins over the dropdown. (tag:1.2) weights work. | |
| height_append | BOOLEAN | false | append: add to the incoming value; replace: overwrite it |
| bust | COMBO | (keep) | (keep) passes the incoming value through; (clear) empties it |
| bust_text | STRING | Typed text wins over the dropdown. (tag:1.2) weights work. | |
| bust_append | BOOLEAN | false | append: add to the incoming value; replace: overwrite it |
| waist | COMBO | (keep) | (keep) passes the incoming value through; (clear) empties it |
| waist_text | STRING | Typed text wins over the dropdown. (tag:1.2) weights work. | |
| waist_append | BOOLEAN | false | append: add to the incoming value; replace: overwrite it |
| hips | COMBO | (keep) | (keep) passes the incoming value through; (clear) empties it |
| hips_text | STRING | Typed text wins over the dropdown. (tag:1.2) weights work. | |
| hips_append | BOOLEAN | false | append: add to the incoming value; replace: overwrite it |
| thighs | COMBO | (keep) | (keep) passes the incoming value through; (clear) empties it |
| thighs_text | STRING | Typed text wins over the dropdown. (tag:1.2) weights work. | |
| thighs_append | BOOLEAN | false | append: add to the incoming value; replace: overwrite it |
| muscle | COMBO | (keep) | (keep) passes the incoming value through; (clear) empties it |
| muscle_text | STRING | Typed text wins over the dropdown. (tag:1.2) weights work. | |
| muscle_append | BOOLEAN | false | append: add to the incoming value; replace: overwrite it |
| extras | COMBO | (keep) | (keep) passes the incoming value through; (clear) empties it |
| extras_text | STRING | Typed text wins over the dropdown. (tag:1.2) weights work. | |
| extras_append | BOOLEAN | false | append: add to the incoming value; replace: overwrite it |
| extra | COMBO | (keep) | (keep) passes the incoming value through; (clear) empties it |
| extra_text | STRING | Typed text wins over the dropdown. (tag:1.2) weights work. | |
| extra_append | BOOLEAN | false | append: add to the incoming value; replace: overwrite it |
| charopt | KISEKAE_CHAR | Character from the previous node; empty starts a new one |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| char | KISEKAE_CHAR | โ |