Character Architect
Stop hand-typing character prompts. This node writes the whole card for you
- Prompt
- Face Prompt
- Inspected Value
- Pre-gen Text
Character Architect isn't a LoRA trainer and it isn't a character-consistency model. It's a giant, opinionated prompt-writing machine: 83 dropdowns covering appearance, ethnicity, pose, clothing families, cosplay, accessories and composition, all assembled into one coherent natural-language prompt that drops out as a plain STRING. You wire that into your text encoder instead of a text box, and suddenly "batch 40 variations of the same character skeleton" stops meaning hand-editing prose forty times.
The name "Character Architect" is doing a lot of work - but it's honest. This is the kind of thing that ships with the workflows the author actually runs, and the ones bundled in the repo are Krea 2 graphs using ClownsharkBatwing samplers. That tells you the target: LLM-encoded photoreal models that read sentences, not booru tags. If your pipeline is Illustrious or Pony, this will underperform a tag-based prompter - it emits blocks of prose, which is exactly what a Qwen or Krea-style encoder wants (see the block-structure findings in the KB's prompt-engineering notes).
How it actually works
Every dropdown offers None, Random, Forced Random, plus its concrete values. Here's the clever bit: each field marked Random resolves deterministically from the seed via a blake2b hash of (seed, field_name). Every field gets its own independent stream, so locking one property no longer reshuffles the unrelated ones around it - a real quality-of-life win over the {a|b|c} bracket wildcard trick the A1111 crowd used to live on.
The distinction between Random and Forced Random matters and trips everyone up. Ordinary Random is subject to all the hidden compatibility filters - no shoes in a close-up crop, no contradictory ethnic anatomy, one main clothing family at a time. Forced Random deliberately bypasses all of them for that one field. The frontend also adds section headers with RANDOMIZE ALL ONCE (bakes concrete values now) and SET ALL RANDOM (leaves them resolving per seed) - not the same thing, and worth keeping straight.
There's a deliberate 20% wild-card share baked into Random. Some outputs will look "off" on purpose; that's the design, not a bug.
The inputs that actually matter
Don't panic at the scroll. You set a handful, the rest can ride on Random:
media_type,gender,content_rating- the pivot inputs, locked by default (lock_media_type,lock_gender,lock_content_rating). Note the tooltip: content rating adds a styling direction only; it never hides categories or blocks manual choices. This is an adult-content-oriented pack, handled tastefully - set it tonormalif you want zero NSFW flavor.origin_ethnicity+ethnicity_guidance- flipping guidance on replaces the broad label with a concrete 13-profile phenotype anchor, draws eye color from an ethnicity-weighted pool, and stops random anatomy from contradicting the anchor.clothing_archetype- 11 style directions (Classy Chic, Streetwear, Kawaii…) that guide any row left onRandomwithout touching your manual picks.seed/control_after_generate- defaults torandomize, which means every queued run re-rolls your Random rows. Set it tofixedwhile you tweak a single field.free_promptwithfree_prompt_position, and theoverride_field+override_textpair - override is the final authority, applied after every rule, and clearing competing garment families so your connected text always shows up.
The three STRING outputs: Prompt (the full thing), Face Prompt (a face-only subset - perfect for a face-detail pass), and Inspected Value (one resolved field's final text, handy for labels, grids and stats without parsing the whole prompt).
Installation
No model downloads, no requirements.txt, no API key - it's pure Python plus a JavaScript frontend. ComfyUI Manager, search "Character Architect," or:
cd ComfyUI/custom_nodes
git clone https://github.com/InspectaGadget/ComfyUI-CharacterArchitect
Restart ComfyUI. Because there's a JS frontend that reorganizes the widgets into sections, force-refresh the browser (Ctrl+F5) after updating, or you'll see stale UI.
Where people get burned
The randomness being seed-driven is the big one: if you leave control_after_generate on randomize, your carefully locked outfit gets re-rolled every run. Lock what you care about, then fixed the seed.
Second: this is an obscure pack - there's essentially no Reddit support thread for it, so the README and the built-in tooltips are your docs. Hover any widget: every control carries its own interaction rules, probabilities and suppression logic as metadata. That's genuinely the fastest way to understand why a Random row didn't appear.
Third: the output is long by design, and LLM-encoded models have a real attention cap around 75–100 effective tokens. If a distilled model drifts with the full Prompt, trim categories or feed it the Face Prompt instead - the block structure this node produces is exactly what those encoders want, but even good structure has a budget.
Inputs (117)
| Name | Type | Default | Description |
|---|---|---|---|
| media_type | COMBO | photograph | Defines the base medium at the very beginning of the prompt. Lock it to protect it from section and global randomization. |
| gender | COMBO | woman | Defines the subject wording. It never hides or forbids body, clothing, makeup, or facial-hair choices. |
| content_rating | COMBO | normal | Controls presentation intensity with two concrete outcomes: normal produces a neutral, non-sexualized, non-explicit treatment; glamour/sexy/explicit produces a glamorous, sexualized, explicit treatment. It is included in both Prompt and Pre-gen Text. |
| composition_archetype | COMBO | None | Optional coherent composition recipe. It coordinates framing, pose, horizontal camera direction, head direction, eye focus, vertical camera angle, and frame placement while preserving manual and Forced Random choices. A manual archetype suppresses an ordinary Random Scene scenario; a manual or Forced Random scenario remains authoritative. |
| portrait_style | COMBO | None | Controls only subject framing, from close-up to full body. Under ordinary Random it adapts to the visibility required by a random pose. Manual and Forced Random framing remain free. |
| capture_style | COMBO | None | Controls photographic treatment independently from framing. Selfie is now an explicit Pose action, so Capture style no longer silently overrides camera geometry. |
| setting | COMBO | None | Adds a contextual environment. Ordinary Random is suppressed when a bicycle, horse, car, carousel, or skateboard pose already supplies its own scene context. Manual choices, Forced Random, and text override remain authoritative. |
| scene_scenario | COMBO | None | Rare complete action-and-setting unit. None keeps the classic Pose + Setting path. Ordinary Random selects a scenario ten percent of the time and otherwise keeps Pose + Setting. Forced Random guarantees a scenario. A manually selected scenario replaces Pose and Setting; camera, framing, lighting, and styling remain independent. |
| lens_style | COMBO | None | Adds optical and depth-of-field characteristics after the scene description. Ordinary Random only softens a few known harsh lens/lighting collisions; 20% remain deliberately wild. |
| shot_composition | COMBO | None | Controls placement inside the frame, not camera height. Ordinary Random follows Capture style and avoids placing the subject high with a high camera, or low with a low camera. Manual and Forced Random remain free. |
| pose_mood | COMBO | None | Adds attitude or emotional bearing without duplicating the concrete body position. |
| pose | COMBO | None | Controls body mechanics and only keeps an orientation when that orientation is intrinsic to the pose, such as a side squat. Ordinary Random then coordinates with Camera direction; explicit combinations remain authoritative. Vehicle actions suppress only an ordinary Random setting. |
| camera_direction | COMBO | None | Controls the horizontal relationship between camera and subject. Ordinary Random follows intrinsically side-oriented poses and favors readable views for gestures or movement; manual and Forced Random choices remain unrestricted. |
| head_direction | COMBO | None | Controls the head orientation independently from body pose, camera height, and Eye Focus. Looking downward no longer implies looking toward the camera. |
| camera_angle | COMBO | None | Controls only camera height: eye level, low angle, worm's-eye, high angle, or overhead bird's-eye. Ordinary Random keeps it distinct from subject placement in the frame and reserves extreme angles for occasional variation; manual and Forced Random remain unrestricted. |
| lighting_style | COMBO | None | Describes the light independently from the setting. Ordinary Random softens a few known clashes with duotone, infrared, disposable, and cheap-digital treatments while preserving a 20% wild-card share. |
| optical_effect | COMBO | None | Opt-in photographic treatment placed before Media type for stronger adherence. Protected from global random buttons; manual Random yields no effect 70% of the time, while Forced Random always selects an effect. |
| origin_age | COMBO | None | Adds an adult age range near the subject introduction. |
| origin_ethnicity | COMBO | None | The resolved broad category is included in Pre-gen Text. With Ethnicity guidance enabled, Full Prompt additionally receives the detailed phenotype anchor and weighted eye, hair, and skin pools; that detailed guidance stays out of Pre-gen. |
| body_archetype | COMBO | None | Optional coherent body recipe. It fills only body controls left on None or ordinary Random. Manual selections and Forced Random remain authoritative, and every phrase an archetype can produce is also available in the regular body widgets. |
| body_type | COMBO | None | Height only. Ordinary Random excludes the exceptional 'a person with dwarfism' and 'a person of giant stature' values. Forced Random includes the complete list, and a manual choice always remains authoritative. Height is written separately from physique, so short + obese or tall + extremely underweight remains unambiguous. |
| body_physique | COMBO | None | Weight, softness, fitness, or muscular development, independently weighted by broad families under ordinary Random. Forced Random remains uniform across concrete choices. |
| body_feminine_curves | COMBO | None | Curve intensity and broad silhouette independently from height and weight. Leg proportions and lumbar curvature now live in Body Detail, with legacy workflows migrated automatically. It is never restricted by gender. |
| body_hair | COMBO | None | Protected from one-click randomization because explicit presence or absence strongly changes the result. Manual Random and Forced Random remain available. |
| skin_finish | COMBO | None | Protected from one-click randomization. Ethnicity guidance may use a neutral compatible pool when this field is manually set to Random. |
| bust | COMBO | None | Independent morphological descriptor; no gender or content-rating restriction is applied. |
| cleavage_depth | COMBO | None | Works with Cleavage type and clothing. When either neckline field is on ordinary Random, compatible depth/type pairs are favored 90% of the time; manual and Forced Random choices stay free. |
| cleavage_type | COMBO | None | Neckline shape combined with Neckline depth. Ordinary Random favors coherent pairs; halter and off-shoulder are also suppressed when a complete cosplay already specifies a structured jacket, coat, blazer, uniform, or robe. Manual and Forced Random remain free. |
| butt_shape | COMBO | None | Independent lower-body descriptor; combines with Body type, physique, curves, and thighs. |
| thigh_shape | COMBO | None | Independent thigh descriptor; combines with the other body controls. |
| body_detail_1 | COMBO | None | Optional morphological refinement. Ordinary Random and Body Archetype avoid contradictory axes across the three detail slots; manual and Forced Random choices remain authoritative. |
| body_detail_2 | COMBO | None | Second refinement using the same complete Body Detail vocabulary and precedence rules. |
| body_detail_3 | COMBO | None | Third refinement using the same complete Body Detail vocabulary and precedence rules. |
| expression | COMBO | None | General facial expression. Keep Eye expression separate when you want a specific gaze quality. |
| eye_expression | COMBO | None | Adds only the gaze quality; pose descriptions avoid duplicating it wherever possible. |
| face_shape | COMBO | None | With Ethnicity guidance enabled, Random is drawn from the selected ethnicity's compatible pool. |
| jawline | COMBO | None | With Ethnicity guidance enabled, Random is drawn from a compatible pool. Manual values are never overridden. |
| chin_shape | COMBO | None | With Ethnicity guidance enabled, Random is drawn from a compatible pool. Manual values are never overridden. |
| eye_shape | COMBO | None | Morphological eye shape. Ethnicity guidance can constrain Random; Eye expression remains independent. |
| eye_color | COMBO | None | With Ethnicity guidance active, None and Random use a weighted ethnicity-specific pool. Forced Random or a manual color deliberately overrides that pool. |
| eyelashes | COMBO | None | Independent from eye shape, color, and makeup. |
| eyebrows | COMBO | None | Ethnicity guidance can constrain Random. Manual eyebrow choices remain untouched. |
| nose_shape | COMBO | None | Ethnicity guidance can constrain Random. Manual nose choices remain untouched. |
| lip_shape | COMBO | None | Ethnicity guidance can constrain Random. Manual lip choices remain untouched. |
| facial_hair | COMBO | None | Protected from one-click randomization because it strongly changes identity. Manual Random and Forced Random remain available. |
| hair_color | COMBO | None | Ethnicity guidance can constrain Random. Manual hair colors remain untouched. |
| hair_texture | COMBO | None | Ethnicity guidance can constrain Random. Ordinary Random softly reduces only the strongest material clashes; 25% of unusual combinations remain untouched. |
| hair_style | COMBO | None | Combined with texture, cut, length, and bangs. Length-dependent styles are softly guided, while experimental undercuts and mixed constructions remain possible. |
| hair_cut | COMBO | None | Independent from length and styling. Ordinary Random favors workable geometry 75% of the time rather than forbidding unconventional cuts. |
| hair_length | COMBO | None | Modifies cut and styling. Ordinary Random usually supplies enough length for buns, ponytails, braids, and locs, but keeps a deliberate wild-card share. |
| bangs_style | COMBO | None | Optional fringe descriptor. Ordinary Random only reduces the clearest cropped-hair conflicts; manual and Forced Random choices are untouched. |
| tattoo_style | COMBO | None | Tattoo coverage and style; independent from clothing and content rating. |
| makeup_eye | COMBO | None | Eye makeup is independent from eye expression and eyelashes. |
| makeup_complexion | COMBO | None | Protected from one-click randomization to avoid forcing makeup onto every subject. Manual Random remains available. |
| makeup_lips | COMBO | None | Lip makeup is independent from lip shape. |
| nail_style | COMBO | None | Automatically suppressed when the resolved outfit contains full hand-covering gloves. Fingerless gloves and open handwear keep nail prompts. |
| clothing_archetype | COMBO | None | Guides clothing fields left on Random with concrete compatible garments. Manual choices are never overwritten; cosplay is not selected automatically by archetypes. |
| top_type | COMBO | None | A concrete top activates the separates family. When a full-body jumpsuit is drawn, an ordinary Random top is suppressed; a manual or Forced Random top remains authoritative and is described as worn over the jumpsuit. |
| top_color | COMBO | None | Colors modify an active top; a color alone does not activate the separates family. |
| bottom_type | COMBO | None | A concrete bottom activates the separates family, including full-body jumpsuits. An ordinary Random jumpsuit suppresses an ordinary Random top; a manual or Forced Random top is retained and worn over it. Ordinary Random also softly favors a workable garment length. |
| bottom_length | COMBO | None | Controls leg coverage. Ordinary Random uses hidden type-compatible pools; manual and Forced Random lengths remain unrestricted. Mid-length trousers show hosiery below their hems; long trousers confine it to the ankles. Skirts, dresses, and short bottoms describe hosiery normally. |
| bottom_color | COMBO | None | Colors modify an active bottom; a color alone does not activate the separates family. |
| lingerie_type | COMBO | None | Can be the main outfit or a rare underlayer. Ordinary/Casual/most archetype Random layering is 10%; Emo is 50%; Forced Random is always honored. Under cosplay, automatic layering is limited to Casual and Emo. |
| lingerie_color | COMBO | None | Colors the selected lingerie or swimwear. A color alone does not activate lingerie. |
| sleepwear_type | COMBO | None | A complete main garment family. When selected, ordinary Random dress, separates, lingerie, and cosplay families are suppressed. |
| sleepwear_color | COMBO | None | Colors active sleepwear; a color alone does not activate it. |
| cosplay_type | COMBO | None | Complete generic costume. Its source draw is weighted for fair per-costume probability. Ordinary Random hosiery, outerwear, belts, and footwear are suppressed; manual choices, Forced Random, and text override remain available. |
| cosplay_franchise_western | COMBO | None | Complete Western franchise outfit. All cosplay sources share one family and are weighted for fair per-costume probability. |
| cosplay_franchise_asian | COMBO | None | Complete Asian franchise outfit. All cosplay sources share one family and are weighted for fair per-costume probability. |
| cosplay_color | COMBO | None | Applies only to generic cosplay. Franchise costumes keep their authored colors unless you make an explicit manual color choice elsewhere. |
| hosiery | COMBO | None | With skirts, dresses, and short bottoms, hosiery is described normally. Mid-length trousers show it below the trouser hems; long trousers use the deliberately compact ankle-only wording validated in image tests. Ordinary Random is suppressed under cosplay; manual and Forced Random remain valid. |
| hosiery_color | COMBO | None | Colors active hosiery and follows the same garment-length wording. Every cosplay suppresses ordinary Random hosiery and its color; manual and Forced Random remain valid. |
| dress_type | COMBO | None | A concrete dress activates the dress family and suppresses competing ordinary Random main garments. |
| dress_color | COMBO | None | Colors an active dress; a color alone does not activate the dress family. |
| outerwear | COMBO | None | An optional layer placed over the resolved main outfit. Ordinary Random is suppressed for every cosplay; manual, Forced Random, and override remain available. |
| outerwear_color | COMBO | None | Colors active outerwear. Every cosplay neutralizes ordinary Random outerwear and its color unless explicitly forced or selected. |
| outerwear_wearing_style | COMBO | None | Controls how active outerwear is worn. New nodes start on None; an active outerwear without a selected style is worn conventionally. Ordinary Random favors conventional wear, while Forced Random gives every supported position an equal chance. |
| belt | COMBO | None | An optional accessory layer. Ordinary Random is suppressed for every cosplay; manual, Forced Random, and override remain available. |
| belt_color | COMBO | None | Colors an active belt. Every cosplay suppresses an ordinary Random belt and its color; manual and Forced Random choices remain valid. |
| footwear | COMBO | None | Optional footwear. Ordinary Random estimates whether feet are likely to appear from pose, framing, and vertical camera angle; visible hosiery adds a small coherence bonus. Close-up and headshot suppress it, low angles strongly reduce it, while high and worm's-eye views favor it. Manual, Forced Random, franchise-authored footwear, and text override remain valid. |
| footwear_color | COMBO | None | Colors active footwear. When visibility-aware Random footwear is omitted, its Random color is removed atomically. Manual footwear/colors, Forced Random, and text override remain valid. |
| head_accessory | COMBO | None | Optional hair/head item. Ordinary Random is suppressed when a complete cosplay already specifies headwear; manual and Forced Random can deliberately layer both. Loc cuffs remain possible everywhere and receive a gentle boost with dreadlocks and braids. |
| accessories_scarf | COMBO | None | Protected from one-click randomization. When deliberately left on ordinary Random, a scarf appears about 30% of the time; Forced Random always adds one. |
| accessories_jewelry | COMBO | None | General jewelry fallback. With specific necklace, earrings, bracelet, or rings, gold/silver tone becomes a compatible material modifier and other broad jewelry labels stand down to prevent merged objects. |
| accessories_necklace | COMBO | None | Specific necklace choice; can be combined deliberately with general jewelry styling. |
| accessories_earrings | COMBO | None | Specific earrings choice; independent from other jewelry. |
| accessories_bracelet | COMBO | None | Specific wrist jewelry; full gloves may visually obscure it but do not silently remove a manual choice. |
| accessories_rings | COMBO | None | Specific hand jewelry; full gloves may visually obscure it but do not silently remove a manual choice. |
| accessories_glasses | COMBO | None | Ordinary Random produces no glasses 67% of the time and a concrete pair 33% of the time. Forced Random always selects concrete glasses. |
| armwear | COMBO | None | Full hand-covering gloves automatically suppress Random nail styling. Fingerless and transparent/open armwear do not. |
| accessories_bag | COMBO | None | Optional bag. Ordinary Random adds one about 40% of the time; archetypes guide its type. Forced Random and manual choices remain authoritative. |
| lock_media_typeopt | BOOLEAN | true | Protects Media type from the global and section randomization buttons. |
| lock_genderopt | BOOLEAN | true | Protects Gender from the global and section randomization buttons. |
| lock_content_ratingopt | BOOLEAN | true | Protects Content rating from global randomization. Content rating is outside every local section randomizer. |
| ethnicity_guidanceopt | BOOLEAN | false | When activated, facial anatomy uses a strong anchor; Eye color on None or Random uses its weighted ethnicity pool. Forced Random and manual values deliberately override guidance. |
| enhance_realismopt | BOOLEAN | false | Appends a realism suffix about plausible lighting, exposure, texture, composition, and natural photographic imperfections. |
| species_modeopt | COMBO | Human | Anthro Furry adds a furry subject prefix. It does not remove human-oriented clothing or morphology controls. |
| enforce_portrait_framingopt | BOOLEAN | false | When activated, Pre-gen Text becomes one minimal introductory sentence containing only media type, resolved portrait/capture style, age, simple ethnicity category, gender, and any fundamental nonhuman subject type. This lets a close framing establish the first-pass composition before clothing and body detail are introduced later. |
| seedopt | INT | 00–18446744073709550000 | Every Random field has its own deterministic stream derived from this seed. Fixing one field no longer changes unrelated random fields. |
| control_after_generateopt | COMBO | randomize | ComfyUI seed behavior after each run. Use fixed to preserve all resolved Random choices while editing selected fields. |
| free_promptopt | STRING | Free text inserted at the selected position without changing any structured category. | |
| free_prompt_positionopt | COMBO | After introduction | Places Free prompt after the introduction, after makeup, or at the very end. |
| override_fieldopt | COMBO | None | Selects the structured property replaced by Override text. A non-empty connected string has absolute priority over manual choices, Forced Random, guidance, archetypes, probabilities, and compatibility rules. Overriding a main garment type also clears competing main garment families so the text is guaranteed to appear. |
| override_textopt | STRING | Connect one STRING here. When non-empty, it replaces the property selected by Override field exactly as written. | |
| identity_forge_jsonopt | STRING | Optional JSON from Identity Forge Archetype, Cosplayer, Creature, or Modifier. Character Architect keeps its own interface and rendering order while importing the preset. Archetype/Cosplayer identity remains anchored even when manual clothing replaces the imported outfit. Manual choices and Forced Random stay above imported JSON; ordinary Random stays below it. Creature anatomy activates the nonhuman-safe renderer. | |
| inspect_propertyopt | COMBO | None | Selects one resolved property to expose through Inspected Value for overlays, comparisons, and statistics. It reports the final value after every rule and override. |
| eye_focusopt | COMBO | None | Controls what the eyes are actually focused on, independently from Head direction and gaze mood. Manual and Forced Random choices are authoritative; ordinary Random favors the active action when it clearly involves a person or held object. |
| mouth_expressionopt | COMBO | None | Adds a concrete mouth action independently from the general facial expression. Ordinary Random uses a compatible pool; manual and Forced Random combinations remain unrestricted. |
| setting_text_overrideopt | STRING | Optional exact text replacing Setting and Scene scenario. Connect or paste a description produced from a reference image by ComfyUI Generate Text; Character Architect itself loads no vision model and adds no dependency. | |
| pose_text_overrideopt | STRING | Optional exact text replacing Pose and Scene scenario while preserving Setting. It can receive a pose description generated from a reference image without adding a vision-model dependency to Character Architect. | |
| face_hair_text_overrideopt | STRING | Optional structured face-reference description from Generate Text. Use semicolon-separated key=value pairs for the supported Face and Hair fields. Manual and Forced Random selections remain authoritative per field; this input then leads over Identity Forge, Subject wildcard, and ordinary Random. A valid description suspends the indivisible Subject wildcard and detailed Ethnicity Guidance, while preserving the simple origin category. Face traits stay out of Pre-gen; resolved hair remains included. | |
| custom_color_overridesopt | STRING | Arbitrary color replacements using target=value pairs separated by semicolons or new lines. Example: top=fuchsia; hosiery=salmon pink; hair=teal. Clothing colors modify only an active garment. | |
| wildcard_subjectopt | STRING | Optional expanded wildcard text replacing the node's subject identity and appearance blocks. Supply already-expanded text or connect a wildcard processor; Character Architect does not require or bundle a wildcard engine. | |
| wildcard_clothingopt | STRING | Optional expanded wildcard text replacing the node's Clothes and Shoes block. Standalone accessories remain available unless the supplied text includes them. | |
| wildcard_poseopt | STRING | Optional expanded wildcard text replacing Pose and Scene scenario while preserving the node's Setting. | |
| wildcard_settingopt | STRING | Optional expanded wildcard text replacing Setting and Scene scenario while preserving the node's Pose. | |
| wildcard_photographyopt | STRING | Optional expanded wildcard text replacing Media type, framing, camera, composition, lens, lighting, and optical-effect controls. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| Prompt | STRING | — |
| Face Prompt | STRING | — |
| Inspected Value | STRING | — |
| Pre-gen Text | STRING | — |