Nodes/Modular Prompt Composer/BRKN Lifestyle Prompt Composer
ComfyUI Node

BRKN Lifestyle Prompt Composer

Roll a whole photoshoot from one seed — the BRKN Lifestyle Prompt Composer

By NUVoize·Created 2 months ago·Updated 2 months ago· 16
BRKN Lifestyle Prompt Composer
  • metadata_in
  • pack_selection
  • positive_prompt
  • negative_prompt
  • metadata
  • metadata_json
  • summary
  • character_prompt
  • fashion_prompt
  • scene_prompt
  • presentation_prompt
  • warnings
  • used_seed
seed0
compatibility_modestrict
target_modelgeneric
prompt_lengthstandard
visual_categoryany
use_charactertrue
use_wardrobetrue
use_scenetrue
use_presentationtrue
descentany
stylerandom
characterrandom
bodyrandom
skinrandom
eyesrandom
face_shaperandom
featuresrandom
browsrandom
lipsrandom
hair_colorrandom
face_paintrandom
environmentrandom
figurerandom
body_artrandom
locationrandom
atmosphererandom
actionrandom
hair_stylerandom
poserandom
fashionrandom
footwearrandom
outerwearrandom
accessoryrandom
eyewearrandom
headwearrandom
bagrandom
handheldrandom
head_positionrandom
gazerandom
expressionrandom
camerarandom
lightingrandom
action_familyany
timerandom
seasonnone
weathernone
prefix
suffix
required_terms
excluded_terms
additional_negative_prompt
enabled_packs
style_reroll0
character_reroll0
body_reroll0
skin_reroll0
eyes_reroll0
face_shape_reroll0
features_reroll0
brows_reroll0
lips_reroll0
hair_color_reroll0
face_paint_reroll0
environment_reroll0
figure_reroll0
body_art_reroll0
location_reroll0
atmosphere_reroll0
action_reroll0
hair_style_reroll0
pose_reroll0
fashion_reroll0
footwear_reroll0
outerwear_reroll0
accessory_reroll0
eyewear_reroll0
headwear_reroll0
bag_reroll0
handheld_reroll0
props_reroll0
head_position_reroll0
gaze_reroll0
expression_reroll0
camera_reroll0
lighting_reroll0
conditions_reroll0
metadata_json
reuse_from_metadataoff

This is the engine half of the BRKN pack. Give it a seed and it builds a complete lifestyle prompt - character, outfit, location, action, pose, camera, lighting - by rolling from pools of curated prompt fragments, then resolves conflicts so the outfit doesn't fight the environment and the camera doesn't fight the pose. It's the successor to the author's WAN-2.2-era BRKN prompt generator, reborn as a ComfyUI node, and the whole point is that you stop rebuilding prompts from scratch: one seed gives you one coherent scene, the next seed gives you a different coherent scene, and you never write a sentence.

Where people get burned: treating it like a tag blender and leaving everything on random. The real power is the locks and filters.

How it works

Every section of the scene - character, body, skin, hair, fashion, footwear, location, atmosphere, pose, expression, camera, lighting, dozens of them - is a dropdown with three states: random (roll it), none (leave it out entirely), or a specific ID (lock it). Behind the scenes the resolver runs a three-stage pipeline per section: filter (your exclusions, then hard rules, then parent allowlists), score (soft rules that push compatible picks together and apart), then a deterministic weighted choice on that section's sub-seed.

The determinism is the interesting part. Each sub-seed is a SHA-256 hash of global_seed | section | revision, designed to be byte-stable across machines and pack load order - Python's salted hash() is never used. That means the same seed on the same packs always produces the same scene, which is what makes the _reroll counters work: bump fashion_reroll by 1 and only the outfit changes, because only that section's revision moved. It's a genuinely well-thought-out system, and it shows.

The inputs that matter

Of the five required, set seed with control_after_generate on randomize if you want a fresh scene every run - every section derives its own sub-seed from it. compatibility_mode (strict/balanced/loose) controls how aggressively the pack's generic fallback entries are allowed in; strict is the pickiest, loose lets the pool spill over when nothing exact matches. target_model (generic, qwen_image, flux_klein, krea) picks the rendering template - krea maps to generic for now, which is fine because these are long descriptive prompts, exactly what LLM-encoded models like Krea 2 read best.

Then the switches that save you: the four master toggles (use_character, use_wardrobe, use_scene, use_presentation) turn a whole block off - turn use_character OFF when a character LoRA owns the person, or your rolled hairstyle will fight the LoRA's weights instead of helping them. excluded_terms is your comma-separated blocklist ("garage, sleepwear"). And descent filters the character pool, with unspecified as the option that names no ethnicity and lets skin, hair and eyes carry the look.

Outputs

positive_prompt and negative_prompt wire straight into your CLIP Text Encode nodes. The middle outputs (character_prompt, fashion_prompt, scene_prompt, presentation_prompt) are the rendered fragments, handy when you want to inspect or splice just one block. metadata / metadata_json are the reuse trick: paste metadata_json back into the metadata_json input with reuse_from_metadata set to lock_content and you can re-roll presentation without touching the scene. warnings tells you when a conflict was resolved; used_seed confirms what actually ran.

Install and gotchas

Manager (search "Modular Prompt Composer" or "BRKN"), or git clone https://github.com/NUVoize/ComfyUI-BRKN-Prompt-Randomizer into custom_nodes/, then restart and hard-refresh. The only dependency is jsonschema - the pack degrades gracefully without it, showing a "Prompt Composer (failed to load)" placeholder node instead of crashing your whole scan; run pip install -r requirements.txt and restart if you see it.

Two real-world notes from the field. First, the beta shipped a "short stature" character option that leaked into prompts and stuck - the author pulled it, and it's the kind of thing to watch for: if a rolled entry won't leave, check the locks and excluded_terms, not the sampler. Second, the prompt pools lean descriptive (the pack description is literally "maximum spread by design - consistency is what the LoRA is for"), so on 2026 LLM-encoded models keep prompt_length at standard rather than detailed and let the blocks do the work; essays don't help the attention cap. It's one of the few randomizers built around locks, seeds and filters instead of pure chaos - worth the install.

Categoryprompt_composer

Inputs (90)

NameTypeDefaultDescription
seedINT00–9223372036854776000Every section derives its own sub-seed from this. Set control_after_generate to randomize for a fresh scene each run.
compatibility_modeCOMBOstrict3 options: strict, balanced, loose
target_modelCOMBOgeneric4 options: generic, qwen_image, flux_klein, krea
prompt_lengthCOMBOstandard3 options: compact, standard, detailed
visual_categoryCOMBOany7 options: any, cinematic, commercial, editorial, hyper_realistic, photographic, +1
use_characteroptBOOLEANtrueFace, body, hair, expression. Turn OFF when a character LoRA owns the person.
use_wardrobeoptBOOLEANtrueOutfit, footwear, outerwear, accessories.
use_sceneoptBOOLEANtrueEnvironment, location, pose, props. (The action always stays.)
use_presentationoptBOOLEANtrueVisual style, camera, lighting. Turn OFF when a style LoRA owns the look.
descentoptCOMBOanyFilter the character pool by descent. 'any' keeps the full spread; 'unspecified' names no ethnicity at all and lets skin, hair and eyes carry the look.
styleoptCOMBOrandom25 options: random, none, brkn_base.visual_style.anamorphic_cinema, brkn_base.visual_style.candid_iphone, brkn_base.visual_style.cinematic_photo, brkn_base.visual_style.clean_lifestyle, +19
characteroptCOMBOrandom29 options: random, none, brkn_base.character.black_early20s, brkn_base.character.black_early30s, brkn_base.character.black_late20s, brkn_base.character.black_mid20s, +23
bodyoptCOMBOrandom26 options: random, none, brkn_base.body.athletic_toned, brkn_base.body.athletic_toned_thighs, brkn_base.body.compact_strong, brkn_base.body.curvy_thick_hips, +20
skinoptCOMBOrandom21 options: random, none, brkn_base.skin.caramel_complexion, brkn_base.skin.clear_glowing, brkn_base.skin.dark_complexion, brkn_base.skin.deep_dark_glow, +15
eyesoptCOMBOrandom21 options: random, none, brkn_base.eyes.almost_black, brkn_base.eyes.amber, brkn_base.eyes.blue, brkn_base.eyes.brown, +15
face_shapeoptCOMBOrandom9 options: random, none, brkn_base.face_shape.diamond, brkn_base.face_shape.heart, brkn_base.face_shape.long, brkn_base.face_shape.oval, +3
featuresoptCOMBOrandom17 options: random, none, brkn_base.features.button_nose, brkn_base.features.dimpled_chin, brkn_base.features.geometric_features, brkn_base.features.high_cheekbones, +11
browsoptCOMBOrandom9 options: random, none, brkn_base.brows.arched, brkn_base.brows.dark, brkn_base.brows.pale, brkn_base.brows.straight_bold, +3
lipsoptCOMBOrandom9 options: random, none, brkn_base.lips.defined_cupids_bow, brkn_base.lips.full, brkn_base.lips.heart_shaped, brkn_base.lips.plump, +3
hair_coloroptCOMBOrandom25 options: random, none, brkn_base.hair_color.ash_blonde, brkn_base.hair_color.ash_brown, brkn_base.hair_color.auburn, brkn_base.hair_color.black_with_bleached_streak, +19
face_paintoptCOMBOrandom2 options: random, none
environmentoptCOMBOrandom85 options: random, none, brkn_base.environment.back_alley, brkn_base.environment.bakery_cafe, brkn_base.environment.beach_house, brkn_base.environment.bookshop_cafe, +79
figureoptCOMBOrandom18 options: random, none, brkn_base.figure.athletic_flat, brkn_base.figure.broad_shoulders_narrow_hips, brkn_base.figure.flat_stomach_toned, brkn_base.figure.full_figure, +12
body_artoptCOMBOrandom18 options: random, none, brkn_base.body_art.behind_ear, brkn_base.body_art.collarbone_script, brkn_base.body_art.fine_line_forearm, brkn_base.body_art.full_sleeve, +12
locationoptCOMBOrandom78 options: random, none, brkn_base.location.alley_doorway, brkn_base.location.astride_the_saddle, brkn_base.location.attic, brkn_base.location.back_deck, +72
atmosphereoptCOMBOrandom40 options: random, none, brkn_base.atmosphere.autumn_gold, brkn_base.atmosphere.autumn_grey, brkn_base.atmosphere.autumn_mist, brkn_base.atmosphere.autumn_wet_leaves, +34
actionoptCOMBOrandom125 options: random, brkn_base.action.adjusting_her_sleeve, brkn_base.action.applying_mascara, brkn_base.action.asleep_against_the_window, brkn_base.action.astride_the_saddle, brkn_base.action.browsing_a_rail, +119
hair_styleoptCOMBOrandom45 options: random, none, brkn_base.hair_style.air_dried_texture, brkn_base.hair_style.asymmetric_bob, brkn_base.hair_style.bantu_knots, brkn_base.hair_style.beachy_waves, +39
poseoptCOMBOrandom358 options: random, none, brkn_base.pose.crouching_while_leaning_forward, brkn_base.pose.crouching_with_both_elbows_resting_on_her_knees, brkn_base.pose.crouching_with_both_feet_flat_on_the_floor, brkn_base.pose.crouching_with_both_hands_resting_on_her_knees, +352
fashionoptCOMBOrandom69 options: random, none, brkn_base.outfit.backless_halter_trousers, brkn_base.outfit.band_tee_baggy_jeans, brkn_base.outfit.belted_shirt_dress, brkn_base.outfit.blazer_over_tee, +63
footwearoptCOMBOrandom24 options: random, none, brkn_base.footwear.ballet_flats, brkn_base.footwear.barefoot, brkn_base.footwear.black_ankle_boots, brkn_base.footwear.black_high_top_converse, +18
outerwearoptCOMBOrandom23 options: random, none, brkn_base.outerwear.beige_trench, brkn_base.outerwear.brown_suede_jacket, brkn_base.outerwear.canvas_work_jacket, brkn_base.outerwear.charcoal_wool_coat, +17
accessoryoptCOMBOrandom49 options: random, none, brkn_base.accessory.anklet, brkn_base.accessory.chain_belt, brkn_base.accessory.chandelier_earrings, brkn_base.accessory.charm_bracelet, +43
eyewearoptCOMBOrandom53 options: random, none, brkn_base.eyewear.angular_geometric_sunglasses, brkn_base.eyewear.aviator_sunglasses, brkn_base.eyewear.black_glossy_sunglasses, brkn_base.eyewear.butterfly_sunglasses, +47
headwearoptCOMBOrandom53 options: random, none, brkn_base.headwear.baker_boy_cap, brkn_base.headwear.beret, brkn_base.headwear.boater_hat, brkn_base.headwear.bucket_hat, +47
bagoptCOMBOrandom43 options: random, none, brkn_base.bag.acrylic_statement_clutch, brkn_base.bag.baguette_bag, brkn_base.bag.belt_bag_worn_crossbody, brkn_base.bag.boxy_purse, +37
handheldoptCOMBOrandom43 options: random, none, brkn_base.handheld.boarding_pass, brkn_base.handheld.bouquet_of_flowers, brkn_base.handheld.car_keys, brkn_base.handheld.clear_water_bottle, +37
head_positionoptCOMBOrandom113 options: random, none, brkn_base.head_position.chin_lifted_above_its_neutral_position, brkn_base.head_position.chin_lifted_while_looking_directly_at_the_camera, brkn_base.head_position.chin_lifted_with_the_neck_elongated, brkn_base.head_position.chin_lowered_slightly, +107
gazeoptCOMBOrandom103 options: random, none, brkn_base.gaze.eyelids_partially_lowered, brkn_base.gaze.eyes_caught_in_the_middle_of_looking_sideways, brkn_base.gaze.eyes_closed_while_facing_the_camera, brkn_base.gaze.eyes_closed_while_the_head_is_turned_sideways, +97
expressionoptCOMBOrandom218 options: random, none, brkn_base.expression.absorbed_expression, brkn_base.expression.acknowledging_something_with_a_small_smile, brkn_base.expression.amused_expression_with_pursed_lips, brkn_base.expression.amused_sideways_smile, +212
cameraoptCOMBOrandom45 options: random, none, brkn_base.camera_preset.close_birds_eye, brkn_base.camera_preset.close_dutch, brkn_base.camera_preset.close_eye_level, brkn_base.camera_preset.close_high, +39
lightingoptCOMBOrandom34 options: random, none, brkn_base.lighting_preset.backlight, brkn_base.lighting_preset.blue_hour, brkn_base.lighting_preset.bounced_fill, brkn_base.lighting_preset.bright_daylight, +28
action_familyoptCOMBOany14 options: any, browsing, cleaning, commuting, cooking, creating, +8
timeoptCOMBOrandom9 options: random, none, early morning, mid morning, midday, afternoon, +3
seasonoptCOMBOnone6 options: none, random, spring, summer, autumn, winter
weatheroptCOMBOnone7 options: none, random, clear, overcast, light rain, heavy rain, +1
prefixoptSTRING
suffixoptSTRING
required_termsoptSTRING
excluded_termsoptSTRINGComma-separated tags to exclude, e.g. garage, sleepwear
additional_negative_promptoptSTRING
enabled_packsoptSTRINGComma-separated pack ids. Empty means every loaded pack.
style_rerolloptINT00–10000
character_rerolloptINT00–10000
body_rerolloptINT00–10000
skin_rerolloptINT00–10000
eyes_rerolloptINT00–10000
face_shape_rerolloptINT00–10000
features_rerolloptINT00–10000
brows_rerolloptINT00–10000
lips_rerolloptINT00–10000
hair_color_rerolloptINT00–10000
face_paint_rerolloptINT00–10000
environment_rerolloptINT00–10000
figure_rerolloptINT00–10000
body_art_rerolloptINT00–10000
location_rerolloptINT00–10000
atmosphere_rerolloptINT00–10000
action_rerolloptINT00–10000
hair_style_rerolloptINT00–10000
pose_rerolloptINT00–10000
fashion_rerolloptINT00–10000
footwear_rerolloptINT00–10000
outerwear_rerolloptINT00–10000
accessory_rerolloptINT00–10000
eyewear_rerolloptINT00–10000
headwear_rerolloptINT00–10000
bag_rerolloptINT00–10000
handheld_rerolloptINT00–10000
props_rerolloptINT00–10000
head_position_rerolloptINT00–10000
gaze_rerolloptINT00–10000
expression_rerolloptINT00–10000
camera_rerolloptINT00–10000
lighting_rerolloptINT00–10000
conditions_rerolloptINT00–10000
metadata_jsonoptSTRINGPaste metadata_json from a previous run to reuse its scene.
reuse_from_metadataoptCOMBOoff3 options: off, lock_content, lock_everything
metadata_inoptPROMPT_COMPOSER_METADATA
pack_selectionoptBRKN_PACK_SELECTION

Outputs (11)

NameTypeDescription
positive_promptSTRINGRendered positive prompt.
negative_promptSTRINGMerged, de-duplicated negative prompt.
metadataPROMPT_COMPOSER_METADATAStructured metadata for another Prompt Composer node.
metadata_jsonSTRINGThe same metadata as JSON. Paste this back into metadata_json to reuse a scene.
summarySTRINGHuman-readable summary of what was selected.
character_promptSTRINGCharacter and expression fragment.
fashion_promptSTRINGOutfit fragment.
scene_promptSTRINGEnvironment, location, action, pose and props fragment.
presentation_promptSTRINGStyle, camera and lighting fragment.
warningsSTRINGWarnings and conflicts. Empty when everything resolved cleanly.
used_seedINTThe seed actually used.