Structured Prompt Composer
A dropdown-driven prompt builder that never makes up its mind for you
- prompt
The "Structured Prompt Composer" is the reason the Mode_personal_node pack exists. It's a prompt builder with seventeen dropdown blocks - subject, age, hair color, outfit, pose, mood, lighting, camera angle, all the way down to film filter - that assembles the result into one deterministic string. No randomness, no hidden logic, identical inputs give identical prompts. If you want a repeatable prompt skeleton you can batch through, or you're just tired of watching your own prompts drift further from English with every edit, this is a genuinely useful shape of tool.
How it works
Under the hood it's a tiny schema-driven engine. A JSON contract (schema/connector.json) defines the block order, which blocks get weighted, and where BREAK tokens go; the actual option text lives in separate library files (libraries/*.json). You pick an option, the engine looks up its text, optionally appends any addon text you typed, applies weighting, and joins everything with ", ". Three libraries ship: comprehensive_portrait, cyberpunk_neon, and everyday_casual - you switch libraries to swap the whole option set, since ComfyUI dropdowns can't dynamically re-filter each other.
The output is a single STRING named prompt. It feeds the positive input of your CLIP Text Encode node. Keep the pack's sister node, Structured Negative Prompt, on the negative side and you've got a tidy pair.
The inputs that actually matter
You don't need all seventeen dropdowns. Here's what to reach for first:
model-sdxlorflux. Pick it honestly, it changes the output syntax (more below).subject,outfit,location- the bones of any scene. Everything else is garnish.None- every dropdown offers it first, and it's the single most useful option in the pack: it omits that block cleanly instead of inserting filler.*_addon- one optional text field per block, appended inline to that block's text. This is your escape hatch when the curated options don't have what you want: pick the closest option, then refine it in the addon box without breaking the structure.custom- a final multiline field, appended after a", BREAK, ".
One honest caveat about the content: every subject option is female (Woman, Young Woman, Girl…). This is a portrait photography pack, and specifically a feminine-portrait one. Fine if that's your genre; know it going in.
The SDXL vs Flux caveat
Here's where the pack's cleverness only pays off on one model. The engine inserts BREAK tokens at positions 8, 12, and 15, and wraps certain blocks in (text:1.2) style weights - both are CLIP-era techniques that chunk your prompt against SDXL's 77-token boundary and boost attention on key blocks. On SDXL, model = sdxl, this is exactly the right tool for the job: BREAK keeps "forest" from bleeding into the description of your subject.
On Flux, though, both mechanisms are mostly dead weight. Flux's T5 encoder doesn't parse (x:1.2) weighting the way CLIP does - the parentheses just sit there as literal text - and there's no 77-token boundary for BREAK to break against. The engine even tries (it applies a 0.85 weight multiplier for flux), but the syntax doesn't survive contact with the encoder. So: on SDXL this is a well-tuned tool; on Flux you're mostly paying for the structure, and the weighting/BREAK decorations are noise you'd edit out.
Installing it
Both nodes install together, and the pack is dependency-free - no requirements.txt, no model downloads, pure Python. Fastest route: ComfyUI Manager → search Mode_personal_node → install → restart. Or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/transcendedhacker/Mode_personal_node
Restart ComfyUI and both nodes appear under prompting/structured. Want to add your own options? Edit a library's JSON (format is "Option Name": "prompt text"), save, restart. The engine stays frozen; content just grows.
Gotchas
- Console spam. Every single compose prints a wall of
[COMPOSER]debug lines to your terminal. Harmless, but noisy if you keep logs. - One-commit project. There's exactly one commit (v2.0, Jan 2026) and zero community discussion anywhere I can find. Expect it to work as shipped and don't count on active maintenance - which is fine, because it's finished-feeling and the extension path is plain JSON.
- License. CC BY-NC 4.0: personal/research use and selling your generated images are fine; commercial redistribution of the software itself isn't.
- Slow dropdowns? No - the author's own notes say the engine stays responsive even with thousands of options. Scroll, don't worry.
It's opinionated (portrait, female-subject, SDXL-first), but as a deterministic, reproducible prompt skeleton it does its one job well. On SDXL especially, this is a tidy little time-saver.
Inputs (37)
| Name | Type | Default | Description |
|---|---|---|---|
| library | COMBO | 3 options: comprehensive_portrait, cyberpunk_neon, everyday_casual | |
| model | COMBO | sdxl | 2 options: sdxl, flux |
| subject | COMBO | 6 options: None, Girl, Mature Woman, Teen Girl, Woman, Young Woman | |
| age | COMBO | 8 options: None, 18-22, 23-27, 28-32, 33-37, 38-42, +2 | |
| hair_color | COMBO | 29 options: None, Ash Blonde, Auburn, Baby Blue, Blue-Black, Burgundy, +23 | |
| hair_style | COMBO | 23 options: None, Afro Texture, Bob Blunt, Box Braids, Crown Braids, Fishtail Braid, +17 | |
| hair_ornament | COMBO | 15 options: None, Bandana, Barrette, Bobby Pins, Claw Clip, Crown, +9 | |
| outfit | COMBO | 30 options: None, Black Velvet Mini, Bodycon Midi, Boho Blouse Skirt, Button Down Shorts, Cotton Shirt, +24 | |
| outfit_detail | COMBO | 11 options: None, Flowing Movement, Glossy Finish, Loose Draping, Matte Surface, Natural Compression, +5 | |
| pose | COMBO | 21 options: None, Arm Over Eyes, Cat Arch, Cross Legged, Crouching Low, Deep Squat, +15 | |
| mood | COMBO | 16 options: None, Blood Red Tension, Clinical Detachment, Cyberpunk Nightlife, Delicate Lace, Dramatic Noir, +10 | |
| location | COMBO | 16 options: None, Apartment Living Room, Art Gallery, Beach Shore, Bedroom Corner, Cafe Booth, +10 | |
| location_detail | COMBO | 11 options: None, Blue Hour Twilight, Early Morning Haze, Fresh Daylight, Golden Sunset Hour, Late Night, +5 | |
| atmosphere | COMBO | 16 options: None, Cold Metallic Grey, Cool Pale Blue, Deep Blue Fog, Deep Purple Glitter, Ethereal Dreamy, +10 | |
| lighting | COMBO | 15 options: None, Backlit Haze, Beauty Dish, Candlelight Flicker, Diffused Streetlight, Even Shade, +9 | |
| angle | COMBO | 19 options: None, Birds-Eye View, Close-Up Face, Cowboy Shot, Dutch Angle, Extreme Close-Up, +13 | |
| frame | COMBO | 11 options: None, Center Framing, Deep DOF, Frame Within Frame, Leading Lines, Negative Space, +5 | |
| filter | COMBO | 16 options: None, Bleach Bypass, CineStill 800T, Cyberpunk Neon, Film Noir, Kodachrome 64, +10 | |
| technical | COMBO | 13 options: None, 35mm Wide, 50mm Natural, 70mm Standard, 85mm Portrait, Anamorphic, +7 | |
| subject_addonopt | STRING | — | |
| age_addonopt | STRING | — | |
| hair_color_addonopt | STRING | — | |
| hair_style_addonopt | STRING | — | |
| hair_ornament_addonopt | STRING | — | |
| outfit_addonopt | STRING | — | |
| outfit_detail_addonopt | STRING | — | |
| pose_addonopt | STRING | — | |
| mood_addonopt | STRING | — | |
| location_addonopt | STRING | — | |
| location_detail_addonopt | STRING | — | |
| atmosphere_addonopt | STRING | — | |
| lighting_addonopt | STRING | — | |
| angle_addonopt | STRING | — | |
| frame_addonopt | STRING | — | |
| filter_addonopt | STRING | — | |
| technical_addonopt | STRING | — | |
| customopt | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| prompt | STRING | — |