ComfyUI Node

NSFW Prompt

NSFW Prompt, explained

By theSharque·Created 2 months ago·Updated about a month ago· 8
NSFW Prompt
    • prompt
    • seed
    seed0
    prefix
    shotrandom
    agerandom
    bodyrandom
    lookrandom 20%
    genderwoman
    emotionrandom 80%
    toprandom 20%
    bottomrandom 20%
    hosieryrandom 80%
    headwearrandom 20%
    footwearrandom 20%
    accessoryrandom 80%
    addonrandom 50%
    toyrandom 20%
    poserandom 50%
    actionrandom
    coverrandom 50%
    placerandom 80%
    lightingrandom 20%
    atmosphererandom 20%
    camerarandom 80%
    postfix

    Here's the thing that sells this node in one sentence: it generates a complete, coherent NSFW prompt on every run with zero LLM, zero API key, and zero model downloads. It's the flagship node of the theSharque/ComfyUI-NSFW-Prompt pack, and it sits in the prompt category next to three companion nodes. If you've ever spent an evening tweaking prompts by hand for a batch of images, this is the "make it someone else's problem" button.

    The output is deliberately not comma-tag soup. The pack's whole design bet is that an NSFW prompt should read like a caption - a few sentences describing who, what they're wearing, what they're doing, where, and how it's lit. That bet pays off on modern LLM-encoded checkpoints (Z-Image, Krea 2, Flux 2 Klein), where natural-language instructions are exactly what the text encoder wants, as the prompt-engineering guide in the modidex KB hammers home. It also works fine on Pony and other SDXL-lineage models - the README ships example workflows for Z-Image Turbo, Krea2 Turbo, and Pony.

    How it works

    Twenty-one slots get rolled, then assembled into sentences. Each slot widget on the node is one of:

    • disabled - the slot is skipped entirely,
    • a fixed dictionary value (like a crop top for top),
    • random N% - roll a value from that slot's dictionary, but only N% of the time; otherwise the slot stays empty.

    Everything is driven off one seed input through a deterministic draw bank, so the same seed plus the same widget settings always gives the same prompt. Empty optional slots are just omitted - you never get a bare "wearing" or "at" sentence. The pronoun (She / He / They) is picked from the gender slot, and there are a few genuinely clever extras: random under 30 / random over 30 on age, random thin / random thick on body, and the toy slot, which is only rolled when the chosen action phrase contains {toy} (e.g. "fucking her with {toy}") - otherwise it's ignored.

    The inputs that actually matter

    Don't get lost in the wall of dropdowns. A beginner should touch five things:

    • seed (required, default 0) - the deterministic engine for the whole pick sequence.
    • prefix / postfix (multiline) - bookend sentences you control, always included. Great for a style or quality line you don't want randomized away.
    • shot - the "photo style" frame (an amateur photo, a leaked nude, a webcam screenshot…). This does more to set the image's vibe than anything else.
    • gender - woman is the default; the random women mode rolls 1 / 2 / many and switches the action pool to solo or multi accordingly.
    • action - the only slot with sub-modes like random oral, random anal, random vaginal, random cum. This is where the content lives, so pick the lanes you're actually after.

    Outputs are the same two on every node in the pack: prompt (STRING) and seed (INT). Wire prompt into a CLIP Text Encode / prompt block, and wire seed into your KSampler's seed input - that's the trick for reproducible batches: one seed drives both the prompt picks and the sampler.

    Install

    Via ComfyUI Manager, search the pack title ComfyUI-NSFW-Prompt. Or the manual way:

    cd ComfyUI/custom_nodes
    git clone https://github.com/theSharque/ComfyUI-NSFW-Prompt
    

    Then restart ComfyUI. That's the whole install - the pack has no extra Python dependencies (just stdlib json, random, re) and no models to download. It's also published to the Comfy Registry (v0.3.x), so Manager's registry search finds it directly.

    Gotchas

    • The prose is assembled from fixed dictionary joins, so the grammar occasionally reads terse - the README's own example has "She wearing a sweater" rather than "She is wearing". It's a quirk, not a bug; the encoders don't care, and you'll stop noticing.
    • Keep the age slot above adult. The dictionary includes youthful and teen terms, and running those through an NSFW generator is the fastest way to get the pack pulled and you in trouble. Don't.
    • The prompt seed and the sampler seed are independent until you wire them together. If a great prompt rolls and you didn't connect seed to the KSampler, the image won't be reproducible.
    • The dictionaries live in plain JSON under data/ in the pack folder - edit them, reload the node, and you've customized the whole vocabulary. That's the real power move.
    Categoryprompt

    Inputs (24)

    NameTypeDefaultDescription
    seedINT00–18446744073709550000
    prefixSTRING
    shotCOMBOrandom22 options: disabled, random, an amateur photo, a professional studio photo, a candid photo, an after-sex photo, +16
    ageCOMBOrandom20 options: disabled, random, random under 30, random over 30, a teen, a youthful, +14
    bodyCOMBOrandom24 options: disabled, random, random thin, random thick, skinny, slim, +18
    lookCOMBOrandom 20%33 options: disabled, random 100%, random 80%, random 50%, random 20%, white, +27
    genderCOMBOwoman17 options: disabled, random, random women, woman, girl, female, +11
    emotionCOMBOrandom 80%41 options: disabled, random 100%, random 80%, random 50%, random 20%, a flushed expression, +35
    topCOMBOrandom 20%25 options: disabled, random 100%, random 80%, random 50%, random 20%, a crop top, +19
    bottomCOMBOrandom 20%40 options: disabled, random 100%, random 80%, random 50%, random 20%, a skirt, +34
    hosieryCOMBOrandom 80%25 options: disabled, random 100%, random 80%, random 50%, random 20%, socks, +19
    headwearCOMBOrandom 20%20 options: disabled, random 100%, random 80%, random 50%, random 20%, a hat, +14
    footwearCOMBOrandom 20%23 options: disabled, random 100%, random 80%, random 50%, random 20%, sneakers, +17
    accessoryCOMBOrandom 80%39 options: disabled, random 100%, random 80%, random 50%, random 20%, wearing a choker, +33
    addonCOMBOrandom 50%25 options: disabled, random 100%, random 80%, random 50%, random 20%, messy hair, +19
    toyCOMBOrandom 20%56 options: disabled, random 100%, random 80%, random 50%, random 20%, a huge dildo, +50
    poseCOMBOrandom 50%53 options: disabled, random 100%, random 80%, random 50%, random 20%, standing, +47
    actionCOMBOrandom70 options: disabled, random, random touch, random hand, random oral, random anal, +64
    coverCOMBOrandom 50%26 options: disabled, random 100%, random 80%, random 50%, random 20%, skin covered in cum, +20
    placeCOMBOrandom 80%26 options: disabled, random 100%, random 80%, random 50%, random 20%, a public park, +20
    lightingCOMBOrandom 20%25 options: disabled, random 100%, random 80%, random 50%, random 20%, soft window light, +19
    atmosphereCOMBOrandom 20%33 options: disabled, random 100%, random 80%, random 50%, random 20%, pink glitter sparkle and soft plush textures, +27
    cameraCOMBOrandom 80%33 options: disabled, random 100%, random 80%, random 50%, random 20%, full body shot, +27
    postfixSTRING

    Outputs (2)

    NameTypeDescription
    promptSTRING
    seedINT