Character Select (World Weaver)
The dropdown that remembers your character
- text
If you've ever trained a character LoRA, tried to hold a face together with an IP-Adapter, or just generated the same woman three times and gotten three different women, you know the problem Character Select is aimed at. It's the front door of World Weaver, a young pack from the ComfyUI YouTuber Creepybits that takes an unfashionable bet: instead of training weights, it stores the character as text - a "written DNA" description - and splices it into your prompt every run. This node is the part that actually remembers who the character is.
The name undersells the mechanism, so let's be clear about what it isn't. It calls no API, loads no model, and needs no key. It reads one JSON file - assets/scripts/characters.json inside the pack - and turns a saved character into a prompt string you can feed the rest of your graph.
How it works
World Weaver's whole trick is placeholder substitution. When you saved a character in the pack's Vault node, you left holes in the description like {clothing}, {hairstyle}, and {accessories}. Character Select is where those holes get filled in. It grabs the character template by name, then does a string replace for each placeholder with what you type into the fields, a "Mad Libs for your character" as the author calls it. The pack ships one demo character, "Zara," so you can watch the whole thing work before you build your own.
The inputs you actually touch are just these:
character_name- a dropdown of everything incharacters.json. Pickingnonemakes the node output an empty string, which is handy for A/B testing or for a workflow that doesn't always need a character.clothing- multiline, defaults tobusiness casual.hairstyle- single line, empty by default, so the saved hair stays unless you override it.accessories- multiline, defaults tono accessories.
The single output, text, is the finished description. In the pack's own workflows it feeds a text concatenation node and then the Master Key (which slaps the system prompt in front of it), and from there into a CLIP or an LLM encode. You can also just wire it straight into any prompt encoder you like.
Installing it
World Weaver installs like any pack. In ComfyUI Manager, search for "world weaver" (or "Creepybits"), hit install, restart. Prefer the terminal?
cd ComfyUI/custom_nodes
git clone https://github.com/Creepybits/World_weaver
Restart ComfyUI and let it pip-install the dependencies (google-genai, opencv-python, sounddevice, numpy, and friends - nothing exotic, no model downloads). The character system itself needs zero models; you still need the actual checkpoint you're generating with, and the workflows the repo ships target Flux, Qwen, and Wan 2.2.
Where people get burned
The dropdown is populated when ComfyUI starts, not when you save a character. Save someone new in the Character Vault and the Select node won't show them until you restart ComfyUI and refresh the node definitions. The pack's own docs say this, and people still trip on it. Related gotcha: the dropdown won't refresh if you hand-edit characters.json mid-session either.
Two more, both minor: if the node returns empty, the character name you picked isn't in the file (or the file is unreadable - watch the console for a warning at startup). And the database lives inside the pack's folder, so updating the pack can clobber your characters. Back up characters.json before you pull updates.
Is this "the answer" to character consistency? Realistically, no - the community's center of gravity is LoRAs and instruction-editing, and a text template won't pin a face the way trained weights will. But as a way to keep a cast of characters organized and swap their outfits without touching a model, it's genuinely pleasant. It's the least magical node in the pack and, honestly, one of the more useful ones.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| character_name | COMBO | 1 options: none | |
| clothing | STRING | business casual | — |
| hairstyle | STRING | — | |
| accessories | STRING | no accessories | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| text | STRING | — |