OOP Person π€
The character sheet node β bundle gender, age, body and all your OOP parts
- hair
- eyes
- mouth
- clothing
- poses
- OOP_PERSON
OOP Person π€ is the node the rest of the character-building pack orbits. It takes the basic facts of a character - gender, age, body shape, ethnicity - plus the hair, eyes, mouth, clothing and pose fragments you built in the leaf nodes, and stitches them into one structured "Person:" block ready for the OOP Node π« to encode.
What it does
This one has more inputs than any other node in the pack. The required set:
- gender -
Female,Male,Androgynous. - age - an integer 18β120 (the slider starts at 18; the author raised it from a questionable 16 during development), default 25.
- body_shape - 7 options:
Slim,Athletic,Average,Curvy,Chubby,Hourglass,Muscular. - ethnicity - 6 options:
African,Asian,Caucasian,Latino,Pacific,Alien. - randomize - unusually, this sits in the required section. When on, the node rolls a random age 16β99 for you.
The optional inputs are the custom types from the other nodes: hair (OOP_HAIR), eyes (OOP_EYES), mouth (OOP_MOUTH), clothing (OOP_CLOTHING), poses (OOP_POSE). Plug one in and its labeled string gets appended to the character block; leave it unplugged and it's omitted.
The mechanism is a neat touch: your integer age is converted into a range label. 25 becomes 20-29Years, 40 becomes 40-49Years, and so on. That's a deliberate choice - range buckets are easier for a diffusion model to hit consistently than a specific number, and it means "age 38" and "age 32" render identically. If you set randomize, the age itself is rolled between 16 and 99 each queue.
The output is a single custom OOP_PERSON string that looks like:
* BodyShape: Athletic
* Gender: Female
* Age: 20-29Years
* Ethnicity: Latino
* Hair: color:Red, style:Ponytail
...
That block feeds the Person input on the OOP Node, which handles the actual CLIP encoding. This is also the node to reach for if you only care about people - a whole portrait workflow can be Person node β OOP Node β KSampler.
Installing it
It ships with the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/0xRavenBlack/ComfyUI-OOP
Restart ComfyUI. Or Manager - search ComfyUI-OOP in the Custom Nodes Manager. No requirements.txt, no model files.
Gotchas
- SDXL-era, like the rest of the pack. The OOP Node hardcodes CLIP skip β2 and 1024Γ1024 sizing; the demo workflow is SDXL (euler/karras, cfg 8, 20 steps). Body-shape and ethnicity terms read well on SDXL and booru-trained checkpoints; treat them as weaker signal on newer encoder models.
- randomize is in the required block. If you add this node and don't touch it, it's there and visible - just leave it unchecked for a stable character. When it's on, the age re-rolls every queue, even if you didn't change anything.
- Age buckets flatten extremes. 18 and 19 both land in
18-19Years, 60 through 120 all become60+Years. Fine for most purposes; not a tool for precise age control. - The ethnicities list is short and fixed. Six buckets,
Alienincluded. If your character's ethnicity isn't on the list, pick the closest and hand-edit the string output.
Part of a small, dormant pack (early 2025, ~15 stars). As a way to keep character descriptions structured and repeatable across a batch - same body, same age bucket, every render - it's genuinely handy.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| age | INT | 2518β120 | β |
| body_shape | COMBO | Average | 7 options: Slim, Athletic, Average, Curvy, Chubby, Hourglass, +1 |
| ethnicity | COMBO | Asian | 6 options: African, Asian, Caucasian, Latino, Pacific, Alien |
| randomize | BOOLEAN | false | β |
| gender | COMBO | 3 options: Female, Male, Androgynous | |
| hairopt | OOP_HAIR | β | |
| eyesopt | OOP_EYES | β | |
| mouthopt | OOP_MOUTH | β | |
| clothingopt | OOP_CLOTHING | β | |
| posesopt | OOP_POSE | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| OOP_PERSON | OOP_PERSON | β |