KIE • Save Character Pack
Write the Character Down Once, Reuse It Forever
- portrait
- full_body
- profile
- expression_sheet
- character_pack
- manifest_json
The problem it's solving isn't the model, it's your notes
Character consistency in 2026 mostly works. One good reference image plus an edit model gets you the same character in a new scene, and that's the default advice the whole community settled on. What's still a nightmare is bookkeeping: which portrait was the approved one, what exact phrasing describes the nose, whether the scar is on the left cheek in the version you shipped last month.
This node is a filing cabinet for that. It saves a versioned Character Pack - an approved portrait plus optional full-body, profile and expression-sheet references, along with identity, style and continuity notes - into ComfyUI's user data folder, and hands back a CHARACTER_PACK you can feed to the pack's other character nodes (KIE • Load Character Pack, KIE • Character Reference, KIE • Character Consistency Test Plan).
Being clear about scope, because the README itself is: a reference image and a prompt are not a universal identity lock. Consistency still depends on the model you then run it through. What you're buying here is repeatability of inputs.
Inputs
Required, and all text: name, version, identity_description, visual_style, continuity_rules. The version tooltip is the design philosophy in one line - "Use a new version for any approved identity/reference change."
Optional: the four image slots - portrait, full_body, profile, expression_sheet - plus wardrobe_notes, real_person_reference, and consent_confirmed.
Outputs are character_pack (wire it into the loader/reference nodes) and manifest_json (the record that got written). It's also marked as an output node, so it executes when you hit run even if nothing downstream consumes it - handy, because saving a pack is a deliberate act, not a side effect of some other branch.
How it behaves on disk
Packs live in the Comfy user directory, under KIE-Nodes-Next/character_packs/<name>__v<version>/ - outside custom_nodes, so updating or reinstalling the pack doesn't touch them. Each pack is a folder with character.json plus your references as PNGs, and the manifest carries a SHA-256 of the content. That checksum drives the important behaviour: re-saving byte-identical content is a no-op that just returns the existing manifest, but trying to save different content under an existing name+version throws rather than silently overwriting. Saved versions are immutable by design, which is exactly what you want in a pipeline where "regenerate the scene with the character" must mean the same character as last week.
Saves are staged in a temporary directory and published atomically, so an interrupted save doesn't leave a half-valid pack in the picker.
Three constraints worth knowing before you hit run:
- A portrait is mandatory. No portrait, no pack - it throws, and it's the canonical view every downstream node leans on.
- One image per slot. Pass a batch and it refuses with "Split image batches before saving the pack." Use an Image From Batch or a Save/Load round-trip first.
- Consent gate. If you flag
real_person_reference, saving requiresconsent_confirmedto be true or the save fails. That's not decoration; it's the author building the permission step into the API surface.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
pip install -r ComfyUI-KIE-Nodes-Next/requirements.txt
Restart, then set your KIE key once at Settings → KIE.ai Nodes Next → Connection - you need it for any generation node, though saving a pack itself is local.
How I'd actually use it
Treat the pack as the identity layer and everything else as variation, which is the same advice the consistency literature gives for keeping wardrobe and scene changes out of your identity anchors. Save version 1, run the consistency test plan, look at the eight cases, and only bump the version when you deliberately redefine the character. Avoid the temptation to quietly re-save "just a slightly better portrait" under the same version; the checksum will stop you, which is the point.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| name | STRING | My Character | — |
| version | STRING | 1 | Use a new version for any approved identity/reference change. |
| identity_description | STRING | — | |
| visual_style | STRING | — | |
| continuity_rules | STRING | — | |
| portraitopt | IMAGE | — | |
| full_bodyopt | IMAGE | — | |
| profileopt | IMAGE | — | |
| expression_sheetopt | IMAGE | — | |
| wardrobe_notesopt | STRING | — | |
| real_person_referenceopt | BOOLEAN | false | — |
| consent_confirmedopt | BOOLEAN | false | Required when references depict a real person. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| character_pack | CHARACTER_PACK | — |
| manifest_json | STRING | — |