ND Character Builder
A character sheet you can randomize without losing the good one
- params
- params
Describing one specific person in a prompt is a copy-paste job until it isn't. Face shape, hair colour and length, body type, nails, the small stuff - you end up with a 90-word blob you're scared to touch, because changing "wide hips" to "narrow hips" means editing text you can no longer parse. This node turns that blob into a panel of dropdowns.
What it is
ND Character Builder is a form, not a generator. You pick a body section on the left (General, Face, Hair, Body, Muscle, Waist & Hips, Chest, Butt & Legs, Hands & Nails, Feet, Genitals), set values on the right, and it hands you a finished description as text - either flowing sentences or comma-separated tags.
The reason it earns a slot in a workflow isn't the dropdowns, it's the three-way state per parameter. Every value is not set (left out of the text), set to a value, or random. Click a chosen value again to clear it; the dice button makes it random. That's different from a prompt with a wildcard card, and it's why the node stays readable at 40 parameters - a gold dot means "set", violet means "random", so you can read the character's shape from the collapsed panel.
The inputs and outputs that matter
The schema is deliberately thin, because nearly all the state lives in the UI:
state(STRING, required) - one JSON blob holding formats,avoid_conflicts, thegenitalsflag, every set value and every random pool. The browser writes it, the node reads it. It's how everything survives a save.params(ND_PARAMS, optional) - the only real input. It carries one field,seed. Put a seed into a Pack Parameters, connect it, done.
That seed has no widget of its own, and this trips people up constantly: without the wire the seed is 0, so "random" values are identical on every run. It looks broken. It's working as documented. Random picks are hashed per parameter (sha256(seed:parameter_id)), so fixing one value doesn't reshuffle the rest of the character - a property most random-prompt setups don't have.
The output is one params wire. Open it with ND Unpack Parameters and you get Description (the whole character) plus one text per part - General, Face, Hair, Body, Muscle, Waist & Hips, Chest, Butt & Legs, Hands & Nails, Feet, Genitals - and Negative, which collects tags for anatomy the character doesn't have and stays empty until you touch the Genitals section.
The bits worth actually using
Format has two switches: Natural (sentences - the README points at Flux 2 and Krea 2) and Tags. Tags mode emits real Danbooru vocabulary where it exists (1girl, long hair, wide hips) and plain tags where it doesn't (27 years old). On a booru-trained checkpoint that isn't cosmetic - tag models reward actual Danbooru tags far more than prose.
Race takes up to three values to mix: click Elf and Fox-folk and you get "of mixed elf and fox-folk blood", both sets of features, both tag sets.
Avoid conflicts prunes random picks that fight each other - pixie cut with waist-length hair, wrinkles at 25, chubby with a six-pack. Hand-set values are never touched.
Presets save the entire node state under a name in user/<user>/neural_dreamer/character_presets.json, so presets follow you between workflows - what makes this a character library rather than a one-off form.
The Genitals section is off by default, gated behind a toolbar tick with an 18+ notice, and meant for fictional adult characters only. Age is clamped 18–90 in both browser and server.
Install
Part of Neural Dreamer Nodes (v1.1.0, MIT). No dependencies - the pyproject.toml has an empty dependency list and there are no models to download.
cd ComfyUI/custom_nodes
git clone https://github.com/neural-dreamer/ComfyUI-NeuralDreamer-Nodes.git
Restart ComfyUI and hard-refresh the browser tab. ComfyUI Manager users can search "Neural Dreamer Nodes" instead.
One honest note on expectations: this pack comes from a Russian-language tutorial channel - README in English and Russian, workflows on Boosty/Patreon. Community footprint is thin (a handful of Reddit mentions in two years), so when something acts up you're reading the README and the source, not forty forum replies. The README, to its credit, is unusually detailed.
Common issues
Same character every run. No seed wire. Add a Pack Parameters with a seed field from a seed node.
Wording isn't what I want. It's data, not code: js/character_builder.json holds the phrases, and the server reloads the file when it changes. Reload the page to refresh the panel.
Text ignores a value I set. Check the section dot. Parameters for the other sex are hidden and left out of the text while that sex is selected, and some choices disable others - flat chest drops breast shape, French manicure drops nail colour.
A random character I loved is gone. Hit Fix random before your next run; it freezes the last picks into fixed values so you can edit them by hand.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| state | STRING | {"formats": {"natural": true, "tags": false}, "avoid_conflicts": true, "genitals": false, "extra": "", "attrs_off": [], "custom": {}, "mode": "create", "ops": {}, "edit_keep": true, "edit_subject": "", "values": {}, "pools": {}} | — |
| paramsopt | ND_PARAMS | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| params | ND_PARAMS | — |