Character Studio — Portret-prompt
The prompt builder that never forgets to describe your character
- prompt
Every portrait you generate starts with you re-typing the same wall of text: age, build, skin, hair, eyes, wardrobe, "shot on 85mm at f/2.8". Character Studio - Portret-prompt is a single node that turns that wall into ~38 dropdowns and text fields, then assembles a complete natural-language prompt for you. Same fields in, same structured prompt out - which is the whole point. It's not a LoRA, not a control net, not an IP-adapter. It's just very disciplined prompt-writing, and it doesn't call any API, needs no key, and ships zero model files.
What it actually is
The author (Perry76 on GitHub, PerryD1976 on Reddit) built a local "character studio" webapp - FastAPI orchestrator, React UI, ComfyUI as the render engine - and pulled the prompt-composition piece out of it into this standalone node. It's MIT-licensed and genuinely dependency-free: Python standard library only, nothing to pip install, nothing to download.
Under the hood it's manifest-driven. The node reads a bundled cast_character.manifest.json, which holds a fixed template plus every field's options. Each dropdown is literally a list from that manifest - 192 nationalities in origin, 19 ages, 140+ hair styles, 80+ poses, 60+ lighting options. You pick values, the node fills the template via a small compose_form function, cleans up double commas and stray spaces, and hands you one STRING.
The template ends with a block that shows exactly whose prior this node is fighting: "Photoreal, natural unretouched skin texture, subtle facial asymmetry, lifelike detailed eyes, natural color, authentic, unfiltered." That's the "skincare-ad default" complaint from r/StableDiffusion's photorealism canon - glossy skin and a symmetric face are the number-one AI tell, and this template pushes back on both before you even touch a slider.
The inputs that matter
You don't need to touch all 38. Every field has a sensible default, so an untouched node still emits a coherent, fully-clothed portrait prompt - which is the other deliberate choice: leave wardrobe empty and it substitutes "casual everyday clothing" rather than render a nude subject.
The few you'll actually set:
origin,gender,age,build_type,height- the identity block. Dropdowns, all with defaults.shot_type- defaults to a three-panel reference sheet (front full-body, back full-body, tight portrait). That's the "character bible" workflow this node was built around: one generation that captures the whole character.camera_type,focal_length,aperture,camera_angle- "Shot on full-frame digital at 85mm, f/2.8, eye level." Naming a physical camera is the highest-leverage phrase for LLM-encoded models (Flux, Qwen, Z-Image), per the KB; on SDXL-lineage checkpoints it does less.extra- the one free-text escape hatch. It's appended verbatim to the end of the prompt, so use it for scene or mood one-offs the dropdowns can't express.
Output: a single STRING named prompt. That's it.
Installing it
Manager covers this pack - search "character-studio-prompt". Or the old-fashioned way:
cd ComfyUI/custom_nodes
git clone https://github.com/Perry76/character-studio-prompt.git
Restart ComfyUI. No requirements.txt, no model downloads, no conflicts to babysit - refreshing after the ecosystem essay's horror stories about node dependency hell. It appears under Add Node → Character Studio → Portret-prompt.
The trap that will eat 20 minutes
The prompt output is a STRING, but a CLIP Text Encode's text field is a widget by default - you can't just drag one onto the other. Right-click CLIP Text Encode (Prompt) → Convert Widget to Input → text, then drag prompt into that new input. Do this once and it's second nature, but it's the question on every beginner thread about this node.
Two more notes. First: the camera wording only works if your model speaks optics - one user on the author's launch thread reported "camera angle has no effect" on Krea2. On booru-tag models, treat those fields as garnish. Second, the dropdowns are fixed lists; you can't type a custom nationality or hairstyle in. That's what extra is for, and a Show Text node is the way to capture the full prompt so you can reuse it across runs.
It's a niche convenience node, not a hype train - zero impressions, one developer, actively iterating (the lighting and backdrop dropdowns were added after community request). If you batch-test character LoRAs or keep re-describing the same person, it earns its place fast. If you only generate one-off images, it's a fun way to stop forgetting the freckles.
Inputs (38)
| Name | Type | Default | Description |
|---|---|---|---|
| origin | COMBO | Dutch | 192 options: Afghan, Albanian, Algerian, Andorran, Angolan, Antiguans Barbudans, +186 |
| gender | COMBO | woman | 5 options: woman, man, non-binary person, androgynous person, person |
| androgyny | COMBO | neutral gender expression | 5 options: neutral gender expression, subtly androgynous, moderately androgynous, visibly androgynous, strongly androgynous |
| age | COMBO | 25 years old | 19 options: 2 years old, 4 years old, 6 years old, 8 years old, 10 years old, 12 years old, +13 |
| build_type | COMBO | athletic-slim | 11 options: slim, slender, athletic-slim, athletic, average, curvy, +5 |
| height | COMBO | ~172cm | 7 options: petite ~160cm, ~165cm, ~168cm, ~172cm, ~178cm, tall ~185cm, +1 |
| skin_tone | COMBO | fair Northern-European | 9 options: fair Northern-European, light, light olive, olive, tan, golden brown, +3 |
| skin_details | STRING | with a light natural tan and faint freckles across the nose | — |
| skin_realism | COMBO | natural skin texture with visible pores | 6 options: clean smooth skin, natural skin texture, natural skin texture with visible pores, realistic detailed skin with visible pores, realistic detailed skin with visible scars and wounds, weathered with fine lines and pores |
| skin_pores | COMBO | natural visible pores | 4 options: no visible pores, subtle pores, natural visible pores, noticeable pores |
| freckles | COMBO | no freckles | 5 options: no freckles, a few light freckles, scattered subtle freckles across the nose, light freckle coverage, heavy freckles |
| moles | COMBO | no moles | 4 options: no moles, a single subtle beauty mark, a few small moles, scattered moles |
| dimples | COMBO | no dimples | 3 options: no dimples, subtle dimples, soft dimples when smiling |
| skin_imperfections | COMBO | subtle natural imperfections | 4 options: perfectly clear skin, subtle natural imperfections, minor blemishes, realistic skin imperfections |
| face_shape | COMBO | oval | 9 options: oval, round, square, heart, oblong, diamond, +3 |
| facial_asymmetry | COMBO | slight natural asymmetry | 4 options: perfectly symmetrical, very subtle asymmetry, slight natural asymmetry, moderately asymmetrical |
| lip_color | COMBO | natural | 12 options: natural, soft pink, rosy, red, coral, berry, +6 |
| lip_shape | COMBO | full | 7 options: full, thin, bow-shaped, heart-shaped, pouty, defined, +1 |
| expression | COMBO | neutral | 35 options: amused, angry, anxious, aroused, blissful, bored, +29 |
| makeup | COMBO | natural everyday makeup | 8 options: no makeup, bare face, natural everyday makeup, soft glam makeup, bold editorial makeup, dewy fresh makeup, matte makeup, +2 |
| beard | COMBO | clean-shaven | 13 options: clean-shaven, light stubble, short beard, full beard, goatee, A La Souvarov, +7 |
| eye_color | COMBO | light-grey blue | 10 options: light-grey blue, blue, deep blue, green, emerald green, hazel, +4 |
| eye_shape | COMBO | almond-shaped | 9 options: almond-shaped, round, deep-set, upturned, downturned, hooded, +3 |
| eye_details | COMBO | realistic detailed irises | 3 options: natural eye details, realistic detailed irises, lifelike eyes with detailed iris patterns |
| hair_color | COMBO | dirty-blonde | 14 options: dirty-blonde, blonde, platinum blonde, light brown, brown, chestnut, +8 |
| hair_style | COMBO | beach waves | 144 options: 1970s long cut, angled bob, balayage, bangs, bantu knots, beach waves, +138 |
| hair_length | COMBO | past the shoulders | 6 options: short, chin-length bob, shoulder-length, past the shoulders, long, very long |
| dishevelment | COMBO | subtly disheveled | 5 options: perfectly neat, subtly disheveled, slightly messy, artfully tousled, windswept |
| wardrobe | STRING | casual everyday clothing | — |
| shot_type | COMBO | Reference sheet 3 Panels: left panel - front full-body photo on a grey backdrop, center panel - back full-body photo on a grey backdrop, right panel - tight front portrait photo on a grey backdrop | 5 options: Reference sheet 3 Panels: left panel - front full-body photo on a grey backdrop, center panel - back full-body photo on a grey backdrop, right panel - tight front portrait photo on a grey backdrop, Full-body front photo, Tight front portrait photo, Half-body portrait photo, Editorial fashion full-body shot |
| pose | COMBO | Standing straight with hands at sides | 80 options: Sitting cross-legged, Standing with hands on hips, Leaning against a wall, Jumping with arms raised, Lying on the stomach, propped up on elbows, Sitting with one leg folded, +74 |
| camera_type | COMBO | full-frame digital | 8 options: analog 35mm, medium format, large format, cropped-sensor digital, full-frame digital, iPhone, +2 |
| focal_length | COMBO | 85mm, flattering portrait compression | 6 options: 14mm, ultra-wide angle, strong perspective, 24mm, wide angle, expansive perspective, 35mm, natural wide perspective, 50mm, natural perspective, 85mm, flattering portrait compression, 135mm, strong telephoto compression |
| aperture | COMBO | f/2.8, shallow depth of field, softly blurred background | 8 options: f/1.4, very shallow depth of field, creamy bokeh, f/2, shallow depth of field, soft background blur, f/2.8, shallow depth of field, softly blurred background, f/4, moderate depth of field, f/5.6, moderate depth of field, f/8, deep depth of field, mostly sharp, +2 |
| camera_angle | COMBO | eye level | 25 options: bird's eye view, boom shot, close-up, crane shot, dolly shot, dutch angle, +19 |
| lighting | COMBO | soft even key light | 61 options: soft even key light, key light from the left, soft fill, key light from the right, soft fill, key light from above, soft fill, 45-degree key light, rim light from top left, +55 |
| backdrop | COMBO | neutral pale grey seamless studio backdrop | 24 options: neutral pale grey seamless studio backdrop, white seamless studio backdrop, off-white seamless studio backdrop, light grey seamless studio backdrop, mid grey seamless studio backdrop, charcoal seamless studio backdrop, +18 |
| extraopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |