Portrait Master: Skin Details
The Portrait Master node that separates a photo from a plastic doll
- text_out
"Portrait Master: Skin Details" is where the photorealism actually happens in this pack. Base Character tells the model who the person is; this node tells it that the person's skin has pores, wrinkles, a tone, and a texture - that it's skin a camera could photograph, not an airbrushed doll surface. If your portraits come out looking waxy or plastic, this is the node you were missing.
It sits in the chain between Base Character and Style & Pose: text_out from one feeds text_in of the next, and eventually the whole thing lands in a CLIPTextEncode. It's the second-most-important node in the pack after Base Character, and the one that most directly changes how "real" the result reads.
How it works
Same string-builder mechanism as the rest of the pack - no model, no inference, just dropdowns and sliders assembled into a weighted prompt, lowercased, returned as text_out.
The useful mechanics: every slider here emits (term:weight) only when it's above 0. skin_pores at 1.0 appends (skin pores:1.0); at 0 it contributes nothing. So the node behaves like a row of on/off switches that also control emphasis. The three enum dropdowns - skin_tone (83 options), skin_texture (74), skin_shine (53) - are the ones that actually place the skin: tone anchors the complexion, texture decides whether it reads as smooth, grainy, or weathered, and shine controls the highlight behavior (wet-looking skin vs matte). Those emit at :1.05.
The eye details deserve a mention because they're the pack's quiet superpower. eyes_details, iris_details, circular_iris, and circular_pupil are what stop eyes from rendering as black voids or uncanny voids - iris detail especially is what makes a portrait feel seen.
The inputs that matter
You don't need all 20. The high-leverage set:
skin_pores- the single biggest "this is a photo" lever. Even 0.5–0.8 reads as texture.skin_tone/skin_texture- set the complexion and surface once; don't fight them with weights.skin_imperfectionsandwrinkles- a little of either kills the "AI skin" look fast. A lot of them ages the subject.eyes_details/iris_details- cheap realism, always worth a small value.
The README's own tip is worth honoring: high skin-detail values can override your shot setting and drag the framing toward close-up. If you set full body and still get a face, this node is the usual suspect - drop the detail sliders and add (closeup, close up, close-up:1.5) to the negative prompt to keep the model honest.
Installing it
Skin Details ships inside comfyui-portrait-master, so install the pack once:
cd ComfyUI/custom_nodes
git clone https://github.com/florestefano1975/comfyui-portrait-master
Then restart ComfyUI. ComfyUI Manager works too - search "Portrait Master" by florestefano1975. No dependencies or model files; the whole pack is plain Python plus dropdown lists.
Common issues
- Everything looks plastic regardless of settings. Usually means the sliders are still at 0 - nothing gets appended unless a weight is above 0, and
-means "skip." Turn a few on. - Full-body shots collapse into close-ups. Back off
skin_poresandeyes_details, or the negative-prompt trick above. - Loaded workflows show strange values. Across the pack's 3.x restructure, old saves can load dropdowns with stale entries. Re-set the fields.
- Your text input comes back lowercase. The node lowercases the entire output, including anything you feed into
text_in- not a bug, just how it's built.
Inputs (26)
| Name | Type | Default | Description |
|---|---|---|---|
| natural_skin | FLOAT | 0.000–2 | — |
| bare_face | FLOAT | 0.000–2 | — |
| washed_face | FLOAT | 0.000–2 | — |
| dried_face | FLOAT | 0.000–2 | — |
| skin_details | FLOAT | 0.000–2 | — |
| skin_pores | FLOAT | 0.000–2 | — |
| dimples | FLOAT | 0.000–2 | — |
| wrinkles | FLOAT | 0.000–2 | — |
| freckles | FLOAT | 0.000–2 | — |
| moles | FLOAT | 0.000–2 | — |
| skin_imperfections | FLOAT | 0.000–2 | — |
| skin_acne | FLOAT | 0.000–2 | — |
| tanned_skin | FLOAT | 0.000–2 | — |
| skin_tone | COMBO | - | 83 options: -, random 🎲, alabaster, angular, angular, arched, +77 |
| skin_texture | COMBO | - | 74 options: -, random 🎲, acne-prone, aged, angular, angular, +68 |
| skin_shine | COMBO | - | 53 options: -, random 🎲, angular, angular, arched, arched, +47 |
| eyes_details | FLOAT | 0.000–2 | — |
| iris_details | FLOAT | 0.000–2 | — |
| circular_iris | FLOAT | 0.000–2 | — |
| circular_pupil | FLOAT | 0.000–2 | — |
| active | BOOLEAN | true | — |
| load_preset | COMBO | 1 options: -- disabled -- | |
| save_preset_as | STRING | — | |
| save_preset | BOOLEAN | false | — |
| text_inopt | STRING | — | |
| seedopt | INT | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text_out | STRING | — |