🎨 Style Prompt Library
377 hand-written styles in a dropdown — the no-model style library that feeds your LLM prompt node
- style_guide
This node is a dropdown with a whole style library behind it. 🎨 Style Prompt Library (class StylePromptLibrary) ships hundreds of hand-written style descriptions - "Film Noir," "Synthwave & Vaporwave," "Watercolor," a dozen kinds of portrait - and hands you the one you pick as a clean text block. No model file, no API key, no GPU work. It's a glorified JSON picker, and that's exactly why it's useful.
The name is a bit misleading, in a good way: it isn't a library in the LoRA-folder sense. It's a text library. What it does is remove the worst part of the now-routine LLM-prompt workflow - describing a style in the few words a local prompt node will actually honor. If you've got a small LLM writing structured prompts for your checkpoint, telling it "make it film noir" is a coin flip. Hand it this node's pre-written block - "film noir cinematography, high-contrast black and white, hard chiaroscuro lighting…" - and the LLM has something concrete to weave in. Same idea as the style input on any good LLM prompt node, minus the improvising.
How it works
Every *.json file in the pack's styles/ folder is loaded on startup and merged into one lookup table (three packs in the current build - general, realism, and an NSFW cinematic one - for 377 total styles; the README's counts are already stale). The node then exposes two local server routes, /style_prompt_library/tree and /style_prompt_library/content, that its bundled frontend JavaScript uses to populate cascading dropdowns, live search, and a read-only preview of the selected style.
The clever bit is that the style widget value - not the JavaScript - is the source of truth; the node works headless with the frontend missing, which keeps it API-safe. It even implements IS_CHANGED using the style-pack file mtimes, so editing a JSON file invalidates the cache instead of fighting ComfyUI's caching.
The inputs that matter
category→subcategory→style- the three required dropdowns. Pick a category, it narrows the subcategory list, which narrows the styles. 13 categories, 82 subcategories, 377 styles in the current build.search- type to filter the whole library by name; when text is present it overrides the category/subcategory narrowing in the UI.enabled- the master switch. Off means the node outputs an empty string, i.e. "no style at all." Flip it to A/B a style with one click. Underrated.strength- a weight from 0 to 2, "like a LoRA." 0 → empty string, 1.0 → style text unchanged, >1 pushes harder.strength_mode- the one that'll burn you.instruction(default) wraps the text in a plain-English directive ("Apply the following style as the dominant visual treatment: …") meant for LLM prompt nodes.emphasiswraps it as CLIP attention syntax,(style text:1.25), for a CLIP Text Encode.
The output is a single style_guide string. Wire it into your LLM prompt node's style input, a prompt builder, or (only when you know what you're doing) a CLIP Text Encode.
Here's where people get burned: emphasis mode only makes sense on a CLIP-based checkpoint like SD 1.5 or SDXL. On the LLM-encoded models everyone runs in 2026 - Flux, Z-Image, anything with a Qwen or T5 encoder - (text:1.25) is passed through as literal punctuation or silently discarded, which is worse than nothing. If you feed an LLM prompt node, leave strength_mode on instruction.
Install
Zero dependencies - no requirements.txt, just the ComfyUI server that's already there. Via ComfyUI Manager, search the pack title "StylePromptLibrary"; or clone it directly:
cd ComfyUI/custom_nodes
git clone https://github.com/lunaaispace-eng/ComfyUI-StylePromptLibrary
Restart ComfyUI, then Ctrl+F5 the browser so the frontend JavaScript reloads. Add it under Add Node → Style Prompt Library.
Troubleshooting
- Dropdowns look flat/empty - the frontend JS didn't reload.
Ctrl+F5and try again. - New styles don't appear after editing JSON - restart ComfyUI; the library loads at import time.
- Node outputs an error string - the selected entry's
contentfield is empty, or the pack didn't load. Check the JSON you edited. - NSFW styles show up uninvited - delete the
nsfw_*.jsonpack fromstyles/and restart; the adult entries are a separate file for exactly this reason.
For a brand-new pack (first commit August 2026, effectively zero community footprint yet), it's refreshingly boring: no hidden downloads, no network calls, just text. If you live in an LLM-prompt workflow, it's one of the rare utility nodes that saves you real typing every single run.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| category | COMBO | 13 options: All, Photography, Fashion, Sci-Fi & Futurism, Illustration, Painting, +7 | |
| subcategory | COMBO | 82 options: All, Cinematic, Realistic, Realistic - Female Figure, Fine Art & B&W, Night & Long Exposure, +76 | |
| style | COMBO | 377 options: 3D Layered Plywood Wall Art, Abstract, Abstract Expressionism, Abstract Fluid Dynamics, Abstract Soft Forms, Acrylic, +371 | |
| searchopt | STRING | — | |
| enabledopt | BOOLEAN | true | Master switch. When OFF, this node outputs an empty string so no style is applied — lets you A/B with one click. |
| strengthopt | FLOAT | 1.000–2 | Style weight, like a LoRA. 1.0 = normal (text unchanged), 0 = no style at all, >1 pushes it harder. See strength_mode for how the weight is applied. |
| strength_modeopt | COMBO | instruction | instruction: expresses the weight as a directive for an LLM prompt node (use when this feeds your LLM node). emphasis: wraps as (text:weight) attention syntax for a CLIP Text Encode (use only when feeding CLIP directly). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| style_guide | STRING | — |