ComfyUI-NSFW-Prompt
Simple dictionary-based NSFW prompt generator.
ComfyUI-NSFW-Prompt
ComfyUI custom node that builds controllable random NSFW prompts as short natural-language text (not comma-tag soup).
Each slot is disabled, random, a fixed dictionary value, or (for optional slots) random N%.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/theSharque/ComfyUI-NSFW-Prompt.git
Restart ComfyUI. Nodes: NSFW Prompt, NSFW sick bastard, NSFW randomize person, NSFW body builder (prompt category).
No extra Python dependencies.
NSFW randomize person
Post-process node: takes prompt (+ optional seed), appends one short appearance line. Dictionaries under person/ (face, hair, skin — not body parts; use body builder for waist/legs/etc.).
- Trait widgets:
disabled/random N%/ fixed dictionary value (defaultrandom 50%);skin_detailsis chance-only (per-detail coin flips) seed: connect to use a fixed/upstream seed; leave unconnected or set -1 to auto-generate (output still returns the seed used)- Pronoun from prompt text (
woman→She,man→He, two/multiple→They) - Groups:
They look different from each other, one with …, another with …
Example append:
She is short with short pixie hair, a slightly large nose, fair skin.
NSFW body builder
Post-process node: same I/O as randomize person; appends one body-detail line from body/.
Slots: musculature, breasts, nipples, waist, belly, hips, butt, legs, thighs, arms, pubic, feet.
- Trait widgets:
disabled/random N%/ fixed dictionary value (defaultrandom 50%) - Same seed and pronoun/multi rules as randomize person
Example append:
She has a toned build, large firm breasts, a wasp waist, wide hips, a round firm butt, long toned legs, thick thighs, a flat stomach, a shaved pubic area, small feet.
NSFW sick bastard
Same template as NSFW Prompt, but each slot can use:
random/random N%— onlydata/random+sick/random+sick N%—data/+sick/sick only— onlysick/(on slots without%modes: shot, age, body, gender)- fixed values from the merged list
Extra phrases live under sick/*.json (empty files are fine).
Output shape
Four sentences (period + newline), accessory on its own line when set:
- shot + age/body/look/gender + emotion
- wearing clothes… + addon
- accessory (holding / wearing / collar with leash…)
- pose + action (+ toy only inside
{toy}actions) - cover as its own sentence (
Her skin covered in cum) - at place + lighting + atmosphere + camera
Example:
A low-light photo of a mature slim pale woman, a hungry look.
She wearing a sweater and ripped jeans and sheer stockings and boots, a towel nearby.
She holding a police baton.
She lying on her side, She lick dirty anus of her.
Her skin covered in cum.
At a car backseat, soft diffused daylight, side view.
Empty optional parts are omitted (no bare wearing / using / at).
Toy is picked only when the chosen action contains {toy} (e.g. fucking her with {toy}); otherwise the toy slot is ignored.
Slots
| Slot | Dictionary | Default | Notes |
|------|------------|---------|--------|
| shot | data/shot.json | random | photo style / source (no framing) |
| age | data/age.json | random | also random under 30 / random over 30 |
| body | data/body.json | random | also random thin / random thick |
| look | data/look.json | random 20% | ethnicity / vibe |
| gender | data/gender.json | woman | also random women (1 / 2 / many); solo → first half of actions |
| emotion | data/emotion.json | random 80% | chance slot |
| top | data/top.json | random 20% | chance slot |
| bottom | data/bottom.json | random 20% | chance slot |
| hosiery | data/hosiery.json | random 80% | socks/stockings/tights |
| headwear | data/headwear.json | random 20% | chance slot |
| footwear | data/footwear.json | random 20% | chance slot |
| accessory | data/accessory.json | random 80% | own sentence; holding / wearing / collar+leash phrases |
| addon | data/addon.json | random 50% | messy/sweaty extras |
| toy | data/toy.json | random 20% | only if action has {toy} |
| pose | data/pose.json | random 50% | chance slot |
| action | data/action.json | random 80% | may include {toy}; solo gender uses first half only |
| cover | data/cover.json | random 50% | cum/mud/paint/tattoos… |
| place | data/place.json | random 80% | chance slot |
| lighting | data/lighting.json | random 20% | chance slot |
| atmosphere | data/atmosphere.json | random 20% | frame mood / palette / texture |
| camera | data/camera.json | random 80% | framing / angle / view |
Also: seed, multiline prefix (start of prompt), multiline postfix (end of prompt).
Chance modes
On chance slots: disabled, random 100%, random 80%, random 50%, random 20%, then dictionary values.
random N% = N% chance to pick a value, otherwise leave the slot empty.
Edit dictionaries
Phrases in data/*.json should already include articles where needed (a crop top, an amateur photo). Reload the node / restart ComfyUI after edits.
Outputs
prompt(STRING) — generated textseed(INT) — echo of the seed used
Example workflows
Import from workflows/ (512×768, no LoRA):
| File | Stack | Sampler |
|------|--------|---------|
| Zimage-example.json | Z-Image Turbo + Qwen3-4B (lumina2) + Flux VAE | res_multistep / simple, 8 steps, cfg 1 |
| krea2-example.json | Krea2 Turbo FP8 + Qwen3-VL (krea2) + Qwen VAE | dpmpp_2m_sde / sgm_uniform, 8 steps, cfg 1 |
| pony-example.json | Pony checkpoint | dpmpp_2m_sde / sgm_uniform, 28 steps, cfg 5 |
All: NSFW Prompt → PreviewAny → CLIP encode → KSampler → Save Image.
Publish (Comfy Registry)
GitHub Action deploys on version tags:
- Repo secret:
REGISTRY_ACCESS_TOKEN(Comfy Registry API key) - Bump & tag:
git tag v0.1.2 git push origin v0.1.2 - Workflow sets
pyproject.tomlversion from the tag and runscomfy node publish
License
See LICENSE.