๐ Body Bard
The modular body-description builder (with a content warning)
- body
Body Bard is the pack's character-description workhorse: roughly two dozen dropdowns that assemble a physical description from age and gender through physique, height, skin, hair situation, and - yes - very explicit anatomical detail. It's the biggest node in Violet Tools, and it's unapologetically NSFW-capable. If that's not your lane, skip it; nothing else in the pack needs it. If it is your lane, this is the fastest way to a consistent, repeatable body description across a whole batch.
It earns its keep on consistency. The whole point isn't "get a body prompt" - you can type that yourself - it's getting the same one every time while only changing what you want to change. Lock in the traits you care about, and only the trait you're iterating on varies. Pair it with the pack's ๐ Character Curator and those selections persist across sessions without re-dialing 25 dropdowns.
How it works
Body Bard reads its feature list from feature_lists/body_bard.yaml at startup, and every dropdown is generated from that file, so the node is only as "curated" as its YAML. Each field has a uniform three-state behavior:
- Unspecified (the default) - omitted from the prompt entirely.
- Random - picks a random value from that category on each run.
- A specific choice - that phrase, looked up from the YAML and lowercased, is appended.
Every selected feature joins the prompt comma-separated, then passes through the pack's deduplicator. There are no strength sliders here - it's tag assembly, not weighted blending, which keeps it simpler than Scene Seductress or Aesthetic Alchemist. Worth knowing before you dive in: Random re-rolls every execution, so "Unspecified" is your friend when you want stability.
The fields that matter
You don't need to understand all ~25 to use it well. The ones that do the heavy lifting:
ageandgender- the framing choices (adult, man/woman/femboy/tomboy/nonbinary, and so on).physique,height,hips,waist,thighs- the silhouette.skin_tone- 20 shades, with color-chip swatches in the UI thanks to the pack's color picker.skin_textureandskin_state- surface detail (glossy, freckled, sun-kissed, sweatyโฆ).
The rest - chest, nipples, areolas, genitals, pubic hair, armpit hair - is the explicit end of the spectrum and defaults to Unspecified, so it stays out of your prompt until you explicitly turn it on. extra takes custom text with {a|b|c} wildcards; extra_input chains another node's output in front of it.
Output is body (a BODY_STRING), which feeds the body input on ๐งฌ Encoding Enchantress - the pack's conditioning hub and the only supported destination for these typed strings.
Installing it
Same pack, same install. Via ComfyUI Manager, search Violet Tools, or:
cd ComfyUI/custom_nodes
git clone https://github.com/leylahviolet/ComfyUI-Violet-Tools.git
Restart ComfyUI and it appears under Violet Tools ๐
โ Prompt. No models to download; dependencies are PyYAML, rapidfuzz, and requests.
Where people get tripped up
The "Random re-rolls every run" trap hits hard on a node this big - if you leave ten categories on Random, every image is a different body, which defeats the consistency you came for. Get into the habit of setting what you care about to specific values and leaving the rest Unspecified. Also note this is where the pack's NSFW content is most concentrated; if your model is a filtered/anime checkpoint, some of the explicit anatomical phrases may fight the model's training and produce weak results - the descriptive (non-genital) fields are the ones that transfer cleanly. This is a niche pack with a small community footprint, so expect to troubleshoot from the README rather than a stack of forum posts.
Inputs (27)
| Name | Type | Default | Description |
|---|---|---|---|
| age | COMBO | Unspecified | 21 options: Unspecified, Random, baby, child, teen, young, +15 |
| gender | COMBO | Unspecified | 21 options: Unspecified, Random, child, boy, girl, adult, +15 |
| physique | COMBO | Unspecified | 16 options: Unspecified, Random, slim, skinny, athletic, muscular, +10 |
| height | COMBO | Unspecified | 8 options: Unspecified, Random, miniature, short, petite, average, +2 |
| chest_size | COMBO | Unspecified | 16 options: Unspecified, Random, extremely flat chest, very flat chest, small chest, average chest, +10 |
| chest_shape | COMBO | Unspecified | 20 options: Unspecified, Random, broad pecs, defined pecs, chiseled pecs, sculpted pecs, +14 |
| ass_size | COMBO | Unspecified | 12 options: Unspecified, Random, flat, small, medium, beefy, +6 |
| ass_shape | COMBO | Unspecified | 11 options: Unspecified, Random, firm, toned, perky, chubby, +5 |
| hips | COMBO | Unspecified | 10 options: Unspecified, Random, skinny, slim, narrow, wide, +4 |
| waist | COMBO | Unspecified | 10 options: Unspecified, Random, skinny, slim, narrow, thick, +4 |
| thighs | COMBO | Unspecified | 11 options: Unspecified, Random, skinny, slender, athletic, muscular, +5 |
| lips | COMBO | Unspecified | 9 options: Unspecified, Random, thin lips, full lips, thick lips, pouty lips, +3 |
| eyes | COMBO | Unspecified | 11 options: Unspecified, Random, narrow, round, large, wide, +5 |
| skin_tone | COMBO | Unspecified | 20 options: Unspecified, Random, bone-white, pale, fair, rosy, +14 |
| skin_texture | COMBO | Unspecified | 12 options: Unspecified, Random, soft, smooth, glossy, oily, +6 |
| skin_state | COMBO | Unspecified | 13 options: Unspecified, Random, flushed, blemished, acne-prone, freckled, +7 |
| nipples | COMBO | Unspecified | 20 options: Unspecified, Random, tiny, tiny erect, tiny flat, small, +14 |
| areolas | COMBO | Unspecified | 8 options: Unspecified, Random, tiny, small, medium, large, +2 |
| areola_shade | COMBO | Unspecified | 18 options: Unspecified, Random, pale, dark, pink, light pink, +12 |
| genitals | COMBO | Unspecified | 21 options: Unspecified, Random, micropenis, penis, tiny penis, small penis, +15 |
| genital_state | COMBO | Unspecified | 10 options: Unspecified, Random, flaccid penis, soft penis, hard penis, erect penis, +4 |
| pubic_hair | COMBO | Unspecified | 8 options: Unspecified, Random, shaved, trimmed, natural, extreme, +2 |
| pubic_hair_color | COMBO | Unspecified | 8 options: Unspecified, Random, blonde, red, brown, silver, +2 |
| armpit_hair | COMBO | Unspecified | 5 options: Unspecified, Random, stubble, trimmed, natural |
| armpit_hair_color | COMBO | Unspecified | 8 options: Unspecified, Random, blonde, red, brown, silver, +2 |
| extra | STRING | โ | |
| extra_inputopt | STRING | Optional chained input - will be prepended to extra field with ', ' |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| body | BODY_STRING | โ |