Character Loader
A character sheet for your prompts — same face, every batch
- eyes
- hair_type
- hair_style
- makeup
- jewelry
- body_type
Here's the honest pitch for CharacterLoader: it won't give you consistent characters by itself. It's not IP-Adapter, it's not a LoRA, and it doesn't touch your model. What it is is a tidy, reusable way to store the prompt fragments that describe one character - eyes, hair, makeup, body type - so the same tags end up in every generation and you stop retyping them.
That matters more than it sounds. One of the oldest tricks for pseudo-consistency is exactly this: keep the descriptive tags fixed and batch over everything else - "batch 32 and get the same person across different cameras, lighting and moods, no training involved." CharacterLoader is a native ComfyUI version of that habit, organized per character instead of per clipboard.
What it does
You keep JSON files under data/characters/ inside the pack folder, one per character:
{
"eyes": "blue eyes, detailed eyes",
"hair_type": "long hair, black hair",
"hair_style": "ponytail, hair ribbon",
"makeup": "eyeliner",
"jewelry": "gold earrings, necklace",
"body_type": "slim, tall"
}
Pick a character in the dropdown, and the node pushes those tags out as plain strings. Wire them into whatever assembles your prompt - a PromptLayoutFiller slot, a concat node, a text box - and you've got one consistent block of identity tags you can reuse forever.
Inputs and outputs
Six string inputs - eyes, hair_type, hair_style, makeup, jewelry, body_type - and six matching outputs. In the editor these are just multiline text fields you can edit directly, and the character_file dropdown picks which JSON populates them.
Under the hood the node is a glorified passthrough: the frontend reads the JSON over a local endpoint and fills the widget fields, and the node hands those values back out. No model loading, no CLIP work, nothing to go wrong at inference time.
The buttons in the header are the useful part: ➕ New, 💾 Save, 📋 Clone and 🗑️ Delete let you manage characters without touching the file system. Subfolders are supported, so anime/heroine.json and realism/erin.json can coexist.
Installing it
It's part of ComfyUI-RE-CustomUtils - search that in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/relhamdi/ComfyUI-RE-CustomUtils
Restart ComfyUI. No extra dependencies, no downloads; the pack declares only torch, which you already run.
Where people get burned
- The folder. JSON files go in
ComfyUI-RE-CustomUtils/data/characters/. The README sometimes calls itsrc/data/characters/, but the code resolves todata/characters/at the pack root. Put a file in the wrong place and the dropdown stays empty. - Refresh. Files you add externally only show up after a browser refresh (F5). Files created via the
➕button appear immediately - that's the difference. - It's not magic. Keep expectations honest: if you want true identity consistency, this is the organization layer, and you pair it with a trained LoRA or an identity method for the actual lock. What it does give you for free is a reusable character definition that survives across workflows and is easy to swap.
The boring nodes are the ones that actually keep your workflow clean, and this is the pack's most boring node in the best way.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| character_file | COMBO | 1 options: -- | |
| eyes | STRING | — | |
| hair_type | STRING | — | |
| hair_style | STRING | — | |
| makeup | STRING | — | |
| jewelry | STRING | — | |
| body_type | STRING | — |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| eyes | STRING | — |
| hair_type | STRING | — |
| hair_style | STRING | — |
| makeup | STRING | — |
| jewelry | STRING | — |
| body_type | STRING | — |