Charactermanager
Character Manager does the LoRA-swapping grunt work
- model
- clip
- model
- clip
- lora_activation
- description
- negative_prompt
- preferred_face
- random_face
- face_grid
- character_name
- seed
Character Manager is a library for your recurring characters. Instead of rebuilding the same chain every time - swap the LoRA loader, retype the activation trigger, dig up the face reference - you pick a name from a dropdown and the node applies that character's whole config: its LoRA, its activation text, its negative prompt, and its face images. It's a workflow-organizer, not a magic consistency fix.
That distinction matters. Character consistency across generations is still the community's most-cited unsolved problem, and the reliable path when you'll reuse a character is a dedicated LoRA (the gold standard every guide points to). What this node does is make that LoRA easy to actually use: once a character's LoRA exists, it lives here alongside everything else that character needs, and switching between characters is one click instead of five.
How it works
Characters live in a characters.json file saved at your ComfyUI base directory. Pick "New Character" from the dropdown, fill in the optional fields - new_name, lora_path, face_images_dir, activation_text, description, negative_prompt - and the node writes the character to that file. Next time, the name appears in the dropdown and selecting it loads the saved config.
Mechanically, it's thin but solid: it applies the character's LoRA through the same code path as ComfyUI's built-in LoraLoader (both model and CLIP strengths = lora_strength), then reads your face images from the directory - a preferred one, a random pick, and a contact-sheet grid, all resized for reference use.
The inputs and outputs that matter
The required trio is model, clip, and character (the dropdown of saved names, plus "Random" and "New Character"). lora_strength defaults to 1.0 and goes from −10 to 10 - negative values are the LoraLoader way of pushing away from a character. seed feeds the random face picker so it's reproducible.
The outputs are where it earns its keep:
modelandclip- your pipeline, now with the character's LoRA applied. Wire into your sampler.lora_activation,description,negative_prompt- STRING outputs carrying the character's prompt data. Feed them into whatever text node you use for prompt assembly (a text-concat node, rgthree-style text, etc.), since vanilla CLIPTextEncode won't take a wire.preferred_face,random_face,face_grid- IMAGE tensors of the character's face(s), for a preview or as a reference input for an IPAdapter-style setup.character_nameandseed- handy for logging or workflow bookkeeping.
The sharp edges
The dropdown list is built when the node is created. Create a new character and the saved JSON updates immediately - but the dropdown won't show the new name until you recreate the node or reload ComfyUI. Cheap to hit, annoying the first time.
"Random" picks from your saved characters - if characters.json doesn't exist or is empty, random.choice on an empty list raises an error. Save at least one character before you gamble.
Everything is stored globally in that one characters.json at the ComfyUI root, not per-workflow. And the lora_path is used as-is, so rename or move the LoRA file and the character silently breaks. Keep paths stable.
One genuinely nice thing: if a character has no face directory, random_face and face_grid return black tensors instead of erroring, so the workflow keeps running - you just get no useful reference.
Installing it
Same install as the whole pack - it ships in Comfyui-calbenodes, and needs nothing ComfyUI doesn't already have:
cd ComfyUI/custom_nodes
git clone https://github.com/caleboleary/Comfyui-calbenodes
restart, and the nodes appear under the calbenodes menu. ComfyUI Manager users can just search "Comfyui-calbenodes" and hit install.
The honest take
This is a personal-use convenience node, and it shows - zero community footprint, a few rough edges, and a dropdown that needs a refresh to catch up. But the core idea is sound, and if you generate a small cast of characters regularly, it genuinely collapses the busywork of swapping LoRAs and prompts by hand. Treat characters.json as your source of truth, back it up with your workflows, and it's a tidy little rolodex.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| clip | CLIP | — | |
| character | COMBO | 2 options: Random, New Character | |
| lora_strength | FLOAT | 1.00-10–10 | — |
| seed | INT | 00–18446744073709550000 | — |
| new_nameopt | STRING | — | |
| lora_pathopt | STRING | — | |
| face_images_diropt | STRING | — | |
| preferred_face_imageopt | STRING | — | |
| activation_textopt | STRING | — | |
| descriptionopt | STRING | — | |
| negative_promptopt | STRING | — |
Outputs (10)
| Name | Type | Description |
|---|---|---|
| model | MODEL | — |
| clip | CLIP | — |
| lora_activation | STRING | — |
| description | STRING | — |
| negative_prompt | STRING | — |
| preferred_face | IMAGE | — |
| random_face | IMAGE | — |
| face_grid | IMAGE | — |
| character_name | STRING | — |
| seed | INT | — |