VNCCS Prompt Designer
See the prompt before the sampler ever gets it
- prompt
- prompt2
- prompt3
- prompt4
- prompt5
- prompt6
- prompt7
- prompt8
- prompt9
- prompt10
- prompt11
- prompt12
- prompt13
- prompt14
- prompt15
- prompt16
Random prompts are the cheapest source of image variety in ComfyUI, and {brown|blonde|black} is old A1111 wildcard syntax that most people who arrived after 2024 never learned. The catch was never the syntax - it's that a wildcard node hands the resolved text straight to the encoder, so you can't see what it picked until the image comes out, and afterwards you can rarely tell which prompt made which file.
VNCCS Prompt Designer fixes that and then keeps going: a prompt workbench inside one node, with tabs of drafts, reusable fragment cards you drag in, {a|b|c} variants, weighted and nested choices, variables, If/Else conditions, and a preview of the exact text the next queue will send. The author is AHEKOT, the VNCCS project behind Pose Studio and UniCanvas - well known in the character/pose corner of ComfyUI, though this node is new enough that there's no chatter about it yet.
How it works
The Python side is almost insultingly simple: one input, one job - parse a JSON blob and render text.
That blob is node_state. It's a STRING, hidden behind the custom DOM widget you actually interact with - the widget serializes your tabs, block cards, conditions, seed and sampling mode into that single string so the whole composition travels inside the workflow. No CLIP, no model, no image.
Rendering is done with dynamicprompts in process, using a deliberately bounded sampling context: cached, budgeted, capped at 256 KB of state and 64 KB of resolved prompt. Each block insertion samples once and conditions reuse that resolved value instead of re-rolling it, so an If/Else on a block can't randomly disagree with the block visible in the output. Blocks sample in random or cycle mode, and the cycle position persists across runs.
The seed lives in the widget, not your KSampler. Leave it fixed and every queue sends the same prompt; set After generate to Randomize and each queued run draws fresh. Batch of 20 suspiciously identical? That's the switch you forgot, and re-rolling the sampler seed won't change it.
The input and the outputs that matter
You'll set exactly one thing: the composition itself, through the widget. Seed, After generate, per-block Variants and the random/cycle sampling mode are widget controls, not sockets.
Outputs are all STRING, named prompt through prompt16. In practice you wire prompt into a CLIP Text Encode, a prompt-combining node, or anything else that eats a string - the same as any other prompt node. The extra sockets only matter if you build multi-prompt fragments: one composition can emit up to 16 separate strings, which is how you drive a positive/negative pair or parallel branches from one authored prompt. The widget exposes sockets as fragments need them and preserves existing connections when you edit.
Practical tip: prompt resolves at execution time, so wire it into a Show Text or Save Text node to record what each run actually sent. That's the standing workaround for wildcard workflows everywhere.
Installing it
ComfyUI Manager → Custom Nodes Manager → search VNCCS Utils → Install → restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/AHEKOT/ComfyUI_VNCCS_Utils.git
cd ComfyUI_VNCCS_Utils
pip install -r requirements.txt
Now the honest warning: requirements.txt is the pack's requirements, not this node's. Installing it pulls opencv-python, av, kornia, pytorch-lightning, roma, timm, color-matcher and friends, because the same repo ships 3D Factory, UniCanvas and Pose Studio. Prompt Designer itself needs dynamicprompts>=0.31,<1 and little else. The TripoSplat weights only download if you open 3D Factory's Model setup, so you're not forced into gigabytes - but you do share a Python environment with a much bigger project. On a machine already full of node packs, that's the real cost.
Where people get burned
- Missing
dynamicprompts. Requirements not installed throws a clearRuntimeError: Prompt Designer requires dynamicpromptsthe moment the workflow runs. Fix:pip install "dynamicprompts>=0.31,<1"into ComfyUI's environment and restart. - A dead widget. The editor talks to backend routes registered at startup. If the panel is blank, check the console for
[VNCCS] Failed to register Prompt Designer API- usually a route clash - then hard-reload the browser. Custom DOM widgets cache aggressively. - Accidental re-rolls. Setting
After generateto randomize without realising it makes every queued run a new composition, so a 30-image batch is 30 different prompts, not 30 takes on one. - Backups, and huge libraries. Your block library lives in
PromptLibrary/inside the pack folder, with revision history and backups - updating in place is fine, deleting the pack directory takes it with you. State is also capped at 256 KB and the resolved prompt at 64 KB, so a composition with thousands of fragments errors out instead of quietly truncating.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| node_state | STRING | {"version": 1, "blocks": [{"id": "bundled-backgrounds", "name": "Backgrounds", "text": "{~sunlit alpine meadow with wildflowers|fog-covered pine forest at dawn|rain-soaked neon city street at night|abandoned industrial warehouse interior|ancient stone temple overgrown with vines|quiet sandy beach at sunset|rocky desert canyon under harsh sun|snow-covered mountain peak with clouds|dense tropical rainforest with mist|medieval castle courtyard with banners|modern city rooftop overlooking skyline|old wooden cabin in snowy forest|crystal cave glowing with blue light|busy marketplace in old town square|dark underground sewer tunnel|futuristic spaceship control room|floating islands in bright sky|volcanic lava field with smoke|calm lake with mirror reflections|ruined gothic cathedral interior|wide golden wheat field in wind|icy tundra with blowing snow|steampunk workshop full of gears|luxury hotel lobby with chandeliers|abandoned amusement park with rusted rides|coastal cliff with crashing waves|deep jungle ruins with stone statues|neon-lit cyberpunk alleyway|quiet library filled with tall bookshelves|modern minimalist apartment interior|rainy train station platform at night|sunlit vineyard on rolling hills|desert oasis with palm trees|snowy village with wooden houses|dark enchanted forest with glowing lights|space station corridor with windows to stars|ancient colosseum arena ruins|underground bunker with metal walls|high-tech laboratory with holograms|colorful festival street with lanterns|mountain waterfall cascading into pool|old pirate harbor with wooden ships|foggy graveyard with crooked tombstones|sunrise over rice terrace fields|deep ocean floor with bioluminescence|abandoned hospital hallway with flickering lights|glowing mushroom forest at night|quiet suburban street in autumn|busy airport terminal interior|open savannah with distant animals|futuristic city skyline at dusk|stormy sea with crashing waves|ancient library with floating books|snow-covered frozen lake|modern shopping mall interior|rock concert stage with lights|desert highway stretching to horizon|cliffside monastery above clouds|underground metro tunnel with graffiti|lush botanical garden greenhouse|ancient egyptian pyramid interior|floating sci-fi platform in sky|misty swamp with twisted trees|cozy caf\u00e9 interior with warm lighting|industrial factory floor with machinery|sunlit canyon with river below|dark cave with narrow passageways|fantasy throne room with gold decor|cyberpunk nightclub with lasers|snowstorm in abandoned city street|tranquil zen garden with stones|old european cobblestone street|space nebula with colorful clouds|rainforest canopy high above ground|ruined battlefield with broken weapons|deserted island with palm trees|icy cave with sharp stalactites|modern office workspace interior|wild river rapids between rocks|fantasy crystal palace interior|underground lava cave glowing red|abandoned train carriage interior|foggy bridge over deep valley|night city skyline with lights|coastal fishing village at sunrise|alien planet with strange rock formations|lush valley with small river|storm clouds over open plains|hidden cave behind waterfall|ancient ruins in desert sands|dark alley with wet pavement reflections|quiet snowy forest path|sunset over open ocean horizon|massive dam structure with water flow|floating ruins in magical sky|industrial ship deck at sea|old clock tower interior with gears|colorful coral reef underwater|mountain road winding through cliffs}", "color": "#89bed4", "category": "Backgrounds"}, {"id": "bundled-colors", "name": "Colors", "text": "{~red|green|blue|yellow|orange|purple|pink|black|white|gray|brown|beige|ivory|cream|silver|gold|navy blue|sky blue|light blue|royal blue|cobalt blue|turquoise|teal|cyan|aqua|mint green|emerald green|forest green|olive green|lime green|sage green|sea green|lavender|lilac|violet|plum|mauve|magenta|fuchsia|hot pink|rose pink|blush pink|salmon pink|coral|peach|apricot|amber|mustard yellow|lemon yellow|pale yellow|crimson|scarlet|burgundy|maroon|ruby red|wine red|rust|terracotta|copper|bronze|chocolate brown|chestnut brown|tan|khaki|taupe|sand|charcoal gray|slate gray|ash gray|pearl white|off-white|jet black}", "color": "#91c8a6", "category": "Colors"}], "parts": [{"text": "illustration of a quiet scene,\n"}, {"blockId": "bundled-backgrounds"}, {"text": ",\naccent color: "}, {"blockId": "bundled-colors"}, {"text": ",\n"}, {"condition": {"blockId": "bundled-backgrounds", "operator": "contains", "value": "night", "then": {"text": "gentle lights and soft reflections"}, "else": {"text": "natural light and subtle shadows"}}}, {"text": ",\nclean composition, fine details"}], "seed": "0", "afterGenerate": "randomize", "openTabs": [], "activeTab": "prompt"} | — |
Outputs (16)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |
| prompt2 | STRING | — |
| prompt3 | STRING | — |
| prompt4 | STRING | — |
| prompt5 | STRING | — |
| prompt6 | STRING | — |
| prompt7 | STRING | — |
| prompt8 | STRING | — |
| prompt9 | STRING | — |
| prompt10 | STRING | — |
| prompt11 | STRING | — |
| prompt12 | STRING | — |
| prompt13 | STRING | — |
| prompt14 | STRING | — |
| prompt15 | STRING | — |
| prompt16 | STRING | — |