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.
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.
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.
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.
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.
- 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.
Chain the preset nodes into the main Identity Forge node — the node closest to Identity Forge wins any conflict:
A taste of archetypes, cosplay characters and creatures — generated with the Krea2 T2I model on randomized identities, so your own results will vary:
![]() |
![]() |
![]() |
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:
![]() |
![]() |
![]() |
![]() |
![]() |
| 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. |
Clone into custom_nodes and restart ComfyUI (no Python dependencies):
cd ComfyUI/custom_nodes
git clone https://github.com/EnragedAntelope/comfyui-identity-forgeOr install via ComfyUI Manager (search Identity Forge).
- Add Identity Forge, connect
prompt_text→ CLIP Text Encode. - Leave fields on
Random, or pick a value to lock the ones you care about. - Queue. The seed auto-randomizes, so each run is a new character (set the seed control to fixed to reproduce one).
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
Noneand 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.
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.
- 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) toNonefor a character-only description to splice elsewhere. accessory_density— drop it toMinimal/Nonefor 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;Autois 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_typeorcompositionyourself 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: Outdoorwhen 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_stylechooses a garment set, thenclothing_color,clothing_patternandfootwearare 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
Unmasktoggle reveals the head under the suit. - Gender & crossplay. The person's
genderis independent of any character's — pairAnywithwardrobe: Anyfor 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_scopenarrowsRandom — …picks to an attribute (Giant, Masked, Mascot/full-suit, Beast…), a category, or a franchise;random_poollayers 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.
- Vault — Vault Save is a terminal node used like Save Image (branch
prompt_jsonin, optionally the image for a thumbnail; mute it to skip). Vault Load recalls a save as acharacter_jsonthat wires intoarchetype_json.
- A
NoneTypeerror (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, watermarkto your own negative prompt.
- docs/usage.md — controls, locking, constraints, custom options
(
user_options.json), the field set, and a worked example. - docs/cosplayer-notes.md · docs/creature-notes.md — per-node design notes and how to add your own characters / creatures.
- docs/architecture.md — schemas and engine internals for contributors.
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.
The engine runs without ComfyUI:
python tests/validate_data.py # data integrity
python -m unittest discover -s tests -t . -v # engine + integration testsjs/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:frontendMIT — see LICENSE.






















