Nodes/comfyui-character-suite/🎭 Character Expander
ComfyUI Node

🎭 Character Expander

Make {Avery} Actually Look Like Avery

By DrkSun81Β·Created 2 months agoΒ·Updated 27 days agoΒ· 0
🎭 Character Expander
    • positive
    • negative
    • expansion_log
    β—„positive_textmasterpiece, best quality, {Avery}, standing in a fieldβ–Ί
    β—„negative_textworst quality, low qualityβ–Ί
    β—„merge_modeappendβ–Ί

    That {Avery} in your prompt is the whole reason you're here. You've been typing the same six tags for that character into every prompt for weeks - silver hair, heterochromia, red left eye, blue right eye, athletic build - and half the time you forget one and she comes out wrong. Character Expander is the "stop typing the same thing" node: you write {Avery}, it swaps in her full stored tag block, and it even drags her negative prompt along for the ride.

    It's from the comfyui-character-suite pack, and it sits at the top of the suite's workflow - every other node exists to feed or analyze what this one produces.

    The first thing to unlearn

    These {...} tokens look exactly like DynamicPrompts wildcards, the ones that pick a random value from a text file. They are not that. Nothing random happens here. The token is a lookup key into your character library - {Avery} expands to her specific stored tags, every time. If you want randomization, this is the wrong tool; if you want consistency, it's the right one, and it costs you nothing beyond the tag text.

    That's also the honest ceiling, so say it now: this is prompt-side consistency, not identity. Injecting a stable description makes the model render the same described person, but the model still invents the face however it wants. If you need the same exact face across a hundred generations, a character LoRA is the gold standard (see the character-consistency material in the KB); Character Expander is the lightweight, checkpoint-agnostic version - it works on anything that reads booru tags.

    How it works

    The node reads data/characters.json inside the pack folder, matches your token by name (case-insensitive), and regex-replaces it with the stored positive tags. Everything non-empty gets logged into expansion_log. The clever bit: each matched character's stored negative prompt is collected and merged into your negative output, so the character carries her own "bad hands, extra fingers" baggage without you re-pasting it.

    The three inputs are all you get, and you'll touch two of them:

    • positive_text - your prompt, e.g. {Avery}, wearing armor, in a dungeon. This is where the tokens live.
    • negative_text - your base negative; the character's negative gets appended (or prepended) to it.
    • merge_mode - append (default) or prepend, controlling whether character negatives land before or after your base negative. Rarely worth changing.

    Outputs: positive (expanded), negative (base + character negatives), and expansion_log, a per-token play-by-play that you wire into a Show Text node when you want to know what actually matched. Multiple characters work: {Avery} and {Kira} expands both and merges both negatives.

    Installing it

    cd ComfyUI/custom_nodes/
    git clone https://github.com/DrkSun81/comfyui-character-suite
    

    Restart ComfyUI and it appears under the CharacterSuite category (or install via ComfyUI Manager - search "character suite"). No pip dependencies; it's stdlib only, with requests as an optional fallback for one network call that this node doesn't even make. Python 3.9+.

    Where people get burned

    • An unknown token is left in place, literally. If {Kira} isn't in your library, the node logs [βœ—] No character found for 'Kira' and leaves the raw {Kira} sitting in your positive prompt - which the encoder then treats as a nonsense tag. Check expansion_log before you trust a render.
    • Characters must exist first. There's no character to expand until you've created one - use the suite's web panel (the person icon in the left sidebar, or the floating 🎭 button) to define characters with positive, negative, and tags, or edit characters.json directly.
    • It can't fix a prompt you never stored. The power is in the library, not the node. Spend ten minutes curating good tag blocks and every future prompt inherits them.

    The pack is young (v1.1.1, mid-2026) and there's no big community footprint yet, but the design is simple enough that the README's own example - {Avery}, wearing armor, in a dungeon becoming the full tag block plus wearing armor, in a dungeon - tells you everything it does. Set up a few characters, and you'll wonder why you were hand-typing them.

    CategoryCharacterSuite

    Inputs (3)

    NameTypeDefaultDescription
    positive_textSTRINGmasterpiece, best quality, {Avery}, standing in a fieldβ€”
    negative_textSTRINGworst quality, low qualityβ€”
    merge_modeCOMBOappend2 options: append, prepend

    Outputs (3)

    NameTypeDescription
    positiveSTRINGβ€”
    negativeSTRINGβ€”
    expansion_logSTRINGβ€”