Skip to content

Repository files navigation

ComfyUI Identity Forge

Create believable, coherent characters from dropdowns — no prompt engineering required.

Identity Forge turns menu choices into clean, natural-language character descriptions that feed directly into your image model. Queue once and get a fully-realized person. Queue again and meet someone completely new.

Browse the galleries: cosplay · archetypes · creatures — every roster entry with a sample render, searchable by name and franchise, each linked to the exact workflow it was made with.

Why Identity Forge?

The problem: Writing good character prompts is hard. You need to describe age, ethnicity, body type, face, hair, makeup, clothing, accessories, pose, lighting, location — and make sure none of it contradicts (a beard on a buzz cut, open-sky lighting indoors, a handbag with gym kit). The constraint engine handles all of this automatically.

The solution: Every field is Random (roll it), a specific value (lock it), or None (omit it). Lock the few traits you care about, let the rest roll, and get a result that's coherent, reproducible (seed-driven), and yours to steer.

What makes this different

Character creation that actually works

Most character generators emit a name and hope the model recognizes it. Identity Forge builds every trait itself — demographics through lighting — composed into natural-language prose any image model can render, with skin tone kept plausible for the chosen ancestry.

Cosplay nodes that understand the characters

The Cosplayer node is where Identity Forge really shines. Most character wildcards emit a name — Chun-Li — and hope for the best. Every character here carries a hand-written, canon-checked description of the costume: garments, colours, masks, markings, signature props.

Ask a plain wildcard for Chun-Li and your prompt says Chun-Li. Ask this Cosplayer node and you get: the blue qipao with gold trim, brown tights, white cross-laced boots, and spiked bracelets. The look renders even on checkpoints that have never heard of the character.

Find one fast: open the in-node picker to browse and search the whole roster without leaving the node — trait facets (Giant, Masked, Mascot/full-suit, Beast) and optional thumbnail previews. Franchise is searchable too, just not a dedicated facet chip.

Characters from every major franchise: Marvel, DC, Star Wars, anime, video games, fantasy, sci-fi, horror. Each one with multiple costume variants where applicable (Harley Quinn's three iconic looks, Catwoman's different suits, etc.). Characters rotate between variants by seed, so the same name yields a different signature costume each roll.

Crossplay built in: Set the person's gender independently of the character. The costume adapts. A female Spider-Man gets the suit resized and reshaped; a male Wonder Woman gets the armor reconfigured. The constraint engine handles the anatomy.

Named beasts render as the animal, not as someone dressed as it: Appa, Toothless, Catbus, a bantha, Jabba — characters nobody can physically be inside — render from their own anatomy, with the human demographics, proportions, clothing and jewellery dropped. Full mascot suits (Pikachu, Godzilla) stay costumes on a randomized wearer.

Turnaround: one character, every angle, one queue

The Turnaround node is a reference-sheet builder: wire Identity Forge's prompt_json into it and one queue emits front / three-quarter / profile / back views of the same resolved character — no re-rolling between views, unlike an auto-incrementing index widget where an upstream node left on randomize swaps the person on every frame. Full controls and the back-view face-omission behavior: docs/usage.md.

Additional layers

  • Archetype: Themed looks (knight, sorceress, astronaut, surgeon, 1950s homemaker…) that set the look while the person randomizes.
  • Creature: Turn the person into an animal, monster, or alien. Hybridized slot-by-slot (head, eyes, integument, arms, hands, legs, tail, wings).
  • Modifier: Prepend a custom descriptor to one field (footwear: sci-fi) or a whole group (Clothing: weathered).
  • Vault Save / Load: Save a generated character with a thumbnail; recall it later as a chainable preset.

All preset nodes stack via an upstream input — chain them through each other and keep them all wired. Set any node to None and it passes through.


Showcase

Chain the preset nodes into the main Identity Forge node — the node closest to Identity Forge wins any conflict:

Sample node chain

A taste of archetypes, cosplay characters and creatures — generated with the Krea2 T2I model on randomized identities, so your own results will vary:

Archetypes Cosplay characters Creatures

Sample outputs

Identity Forge — random people:

Archetypes — themed looks on a random person:

Cosplayers — a fictional character's costume on a random (optionally cross-gender) person:

Creatures — the character rendered as a non-human form:


The nodes

Node What it does
Identity Forge Lockable dropdowns in collapsible groups + the constraint engine → prompt_text (prose) and prompt_json.
Archetype Themed presets (knight, sorceress, pirate, samurai, pop star, astronaut, surgeon, 1950s homemaker…) that set the look while the person randomizes. Also has the in-node roster picker.
Cosplayer Fictional characters (Spider-Man, 2B, She-Hulk, Zelda…) as a cosplay look — the costume on a random, optionally cross-gender person. An in-node picker browses and searches the whole roster with trait facets and thumbnails.
Creature Render the character as a non-human form (animal, insect, marine, reptile, bird, monster, alien, mythic, plant), across all classes or one, hybridized slot-by-slot. Generic species only — a named fictional beast (Appa, Toothless) is a Cosplayer entry. Also has the in-node roster picker.
Modifier Prepend a custom descriptor to one field (footwear: sci-fi) or a whole group (Clothing: weathered).
Vault Save / Load Save a generated character (with a thumbnail) to a local vault; recall it later as a chainable preset, with a Manage Vault gallery.
Turnaround A reference-sheet builder: wire Identity Forge's prompt_json in and it emits front / three-quarter / profile / back as a list, so one queue renders the whole set of the same person. It only moves the camera - the character and the scene stay configured on Identity Forge.

Install

Clone into custom_nodes and restart ComfyUI (no Python dependencies):

cd ComfyUI/custom_nodes
git clone https://github.com/EnragedAntelope/comfyui-identity-forge

Or install via ComfyUI Manager (search Identity Forge).

Quick start

  1. Add Identity Forge, connect prompt_textCLIP Text Encode.
  2. Leave fields on Random, or pick a value to lock the ones you care about.
  3. Queue. The seed auto-randomizes, so each run is a new character (set the seed control to fixed to reproduce one).

Chaining presets

The Archetype, Cosplayer, Creature and Modifier nodes all feed Identity Forge's single archetype_json socket. Instead of swapping plugs, chain them through each node's optional upstream input:

Archetype ─▶ Cosplayer ─▶ Creature ─▶ Modifier ─(character_json)─▶ Identity Forge.archetype_json
  • The node closest to Identity Forge wins where fields overlap; non-overlapping upstream values survive.
  • Set any node to None and it passes its upstream through — keep every preset wired and just toggle which is active.

The headline combo: a Cosplayer in front of a Creature gives Superman as an anthropomorphic praying-mantis hybrid with a sloth's head — the costume survives, the body becomes the creature.


Using with Stylebook

Stylebook describes the rendering: medium, lighting, colour grade, era, finish and mood. Identity Forge describes the subject — who or what is in the picture, and where the camera is: framing, shot type, composition, pose, expression and eye contact. Connect Identity Forge's prose output into Stylebook's user_prompt and chain Stylebook downstream.

Stylebook owns lighting and mood, so set both to None here when pairing the two packs — otherwise you get two descriptions competing for the same axis. See Stylebook's examples/stylebook_with_identity_forge.json for a ready-to-run workflow.


Must-know

  • Seed auto-randomizes each run; set it to fixed to reproduce a character. Not written to the JSON.
  • Every field is Random (roll) / a value (lock) / None (omit). Set scene fields (location, lighting, framing) to None for a character-only description to splice elsewhere.
  • accessory_density — drop it to Minimal/None for clean portraits without locking fields by hand.
  • size_scale — force an unrealistic body scale on an ordinary person: a doll-sized office worker, a fifty-foot commuter. It is manual only; Auto is the default and is never chosen at random, so it can't affect normal output. Picking a tier replaces the height description in the opening sentence and overrides a wired character's own scale, so you can make anyone giant or tiny.
  • The scene shows the scale. A giant only looks giant if the frame has something to compare against, so a giant tier — or a canonically giant character like Godzilla or the Iron Giant — moves the shot outdoors and picks a wide, low or establishing framing, stops the build being described as petite, and stops the composition cropping the surroundings away. Lock location, shot_type or composition yourself and your choice wins as always. Tiny characters get the lighter version: only the framings too wide to resolve them are dropped.
  • The light matches the place. Indoor locations never draw open-sky light and outdoor ones never draw window or hearth light, and a light naming a physical fixture — a hearth, a television, a stained-glass window, a stage rig — only appears where that fixture exists. The location stands and the light adapts; lock a light instead and the location re-rolls to somewhere it can exist. Most locations are interiors, so set location_setting: Outdoor when you want sunny, golden-hour looks. The pool includes named world landmarks (the Eiffel Tower plaza, Shibuya Crossing, Uluru, the Cliffs of Moher) alongside everyday places.
  • The outfit is built, not just picked. outfit_style chooses a garment set, then clothing_color, clothing_pattern and footwear are composed onto it — "a jewel-toned satin slip gown with delicate straps, in strappy heels". Locking any of them changes the outfit, and the shoes are kept plausible for the style (no slippers with a business suit). A garment that names its own colour or shoes keeps them and the matching field steps aside. A costume from the Cosplayer or Archetype node is a complete look and overrides all of this.
  • Nothing is worn twice. If a costume or outfit already names a necklace, earrings, a ring, a bangle, a bag or a hat, the randomizer does not add a second one.
  • The pose fits the body. Poses that reach for something the subject does not have are never drawn: hair to run a hand through under a helmet, pockets on a mascot suit, a free hand when a signature prop is switched on (no more "hands in pockets, holding Mjolnir"), or a seat to perch on when the subject is fifty feet tall outdoors. Lock a pose and your choice wins.
  • A mask hides the face — unless you say otherwise. A full-mask character (Spider-Man, a Mandalorian helmet) drops the randomized face, hair, makeup and expression so nothing contradicts it; lock any of those widgets yourself and it renders anyway. The Cosplayer Unmask toggle reveals the head under the suit.
  • Gender & crossplay. The person's gender is independent of any character's — pair Any with wardrobe: Any for fully mixed-gender output; locked / preset values always win. Full mechanics: docs/usage.md.
  • Scope and filter the random character. On the Cosplayer node, random_scope narrows Random — … picks to an attribute (Giant, Masked, Mascot/full-suit, Beast…), a category, or a franchise; random_pool layers a positive filter — People only or Mascot suits and beasts only — on top of it. Both combine with gender (scope/pool win; gender relaxes to fill an empty combo). Full mechanics and pool values: docs/cosplayer-notes.md.
  • Alternate costumes. Characters with more than one iconic look (Harley Quinn, Catwoman, Poison Ivy, …) rotate between them by seed, so the same character yields a different signature costume each roll.
  • Non-human skin colour skips ethnicity too. When a character's colour covers the whole body (She-Hulk's green, Lobo's chalk-white), the wearer's ethnicity is dropped along with the human skin tone — naming one only fought the colour and left the face rendering as an ordinary human above a coloured body.
  • Fully-encased cosplays skip ethnicity. With no visible skin or face left (Iron Giant, a droid), mentioning the cosplayer's ethnicity only risked nudging the render toward a stray human trait. Face-visible cosplays still describe the person underneath as usual.
  • VaultVault Save is a terminal node used like Save Image (branch prompt_json in, optionally the image for a thumbnail; mute it to skip). Vault Load recalls a save as a character_json that wires into archetype_json.

Troubleshooting

  • A NoneType error (or a missing/blank widget) after updating. A node's fields are built when it is created, so a node on a saved graph can hold a stale widget after an update changes the options. Right-click the node and choose Fix node (recreate) and the error clears — every widget value and every link is preserved (this pack ships its own working recreate; ComfyUI- Manager's own version of that menu entry can fail on the current frontend — see docs/architecture.md).
  • Background lettering (signage, a costume's printed text, tattoo script) shows up more than you'd like. The pack authors canonical text where a character's design calls for it and emits no negative prompt of its own, so if you'd rather not see incidental background lettering, add text, signage, watermark to your own negative prompt.

Learn more

Contributing characters & archetypes

Add private entries via user_options.json (see Custom options in docs/usage.md) — or open an issue / PR proposing new cosplayers, archetypes, outfit styles, creatures or fields to fold into the built-in set. For cosplayers, a costume description (worn items only) and the franchise are enough to start; mark covers_face + mask if the head is fully covered. The advanced flags (covers_body, covers_hair, bald, body_paint + skin) also work in custom entries — see the commented examples in user_options.example.json.

Development

The engine runs without ComfyUI:

python tests/validate_data.py                 # data integrity
python -m unittest discover -s tests -t . -v  # engine + integration tests

js/identity_forge.js embeds data generated from data/fields.py by scripts/generate_js_data.py — rerun it (and commit the result) after changing the field set or the gender-divergent pools; CI's --check catches a stale commit.

A jsdom suite exercises the real, unmodified frontend files outside a browser (wiring, collapse/expand, gender pool swaps, the vault dialog, "Fix node (recreate)") — see docs/architecture.md for what it does and doesn't catch.

npm ci
npm run test:frontend

License

MIT — see LICENSE.

About

A character forge for ComfyUI: dial in or randomize every detail - face, hair, body, wardrobe, mood - and get a coherent, reproducible person, canonically-described cosplayer, or creature as ready-to-render prompt text + JSON. Hundreds of characters and archetypes, billions of seed-stable combinations. Pure Python, no LLM, no dependencies.

Topics

Resources

Security policy

Stars

20 stars

Watchers

0 watching

Forks

Contributors

Languages