Extensions/ComfyUI-NSFW-Prompt
ComfyUI Extension

ComfyUI-NSFW-Prompt

Simple dictionary-based NSFW prompt generator.

By theSharque·Created 28 days ago·Updated 16 days ago· 3
theSharque/ComfyUI-NSFW-Prompt
Nodes4
On cloudLocal install
Categoryprompt
Stars3
Updated16 days ago
Readme

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 (default random 50%); skin_details is 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 (default random 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% — only data/
  • random+sick / random+sick N%data/ + sick/
  • sick only — only sick/ (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:

  1. shot + age/body/look/gender + emotion
  2. wearing clothes… + addon
  3. accessory (holding / wearing / collar with leash…)
  4. pose + action (+ toy only inside {toy} actions)
  5. cover as its own sentence (Her skin covered in cum)
  6. 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 text
  • seed (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:

  1. Repo secret: REGISTRY_ACCESS_TOKEN (Comfy Registry API key)
  2. Bump & tag:
    git tag v0.1.2
    git push origin v0.1.2
    
  3. Workflow sets pyproject.toml version from the tag and runs comfy node publish

License

See LICENSE.