Characters
Portable characters, across models
Build a character (.char file) once from reference photos. FLUX.2 takes those references directly, with nothing to train. Krea 2 takes a LoRA trained from the same photos. One file carries both, so the same person renders on either model without re-attaching images or describing their face.
The references
Frontal
Profile
Generated from them, one prompt each
City street, low angle
Half body
Cafe window, overcast
Three-quarter
Lakeside, open water
Close portrait
Park, open shade
Half body
Street, mid-stride
Full body
Office, window light
Three-quarter
Rendered on FLUX.2 Klein 4B Base. The person is invented, not a real individual: a synthetic identity keeps the comparison honest, because a model that already knows a celebrity would score well whether the references worked or not.
Under the hood
How it actually works
Three stages. Encoding happens once on the CPU, applying happens on the GPU with every render, and scoring happens after each take.
01
Drop in a photo
One image is enough to start. The Characters panel takes a drag-and-drop, or you can turn any take you have already generated into a character.
02
It compiles a .char
Face detection, a curated reference set sized for the model, and an identity fingerprint, packed into one portable file in models/characters.
03
Pick it on a FLUX.2 node
A Character dropdown on the generation node, on FLUX.2 today. No wiring images, no re-attaching references, no describing their face in the prompt.
04
Every take is scored
Each render carries a continuity score out of 100 against the character, so drift is a number you can see rather than something you notice three shots later.
Compared
How this differs from PuLID, FaceID and img2img
These solve overlapping problems in genuinely different ways. The differences below are about mechanism, not which one wins.
| Approach | What binds the identity | Needs | Composition | Setup |
|---|---|---|---|---|
| PuLID · FaceID · InstantID | Face embedding, through a trained adapter | An adapter per base model | Free | Minutes |
| img2img | Denoises from your image | Nothing | Locked to the input | Instant |
| A LoRA per character | Fine-tuned weights | A dataset and a training run | Free | Hours |
| Characters | Your references, as tokens the model already reads | Nothing | Free | Seconds |
- img2img is the wrong tool rather than a worse one: the single strength dial controls identity and composition together, so you cannot have the same face in a different shot. FLUX.2 has no img2img path at all.
- An adapter carries a face embedding, so it brings the face without the hair, build or wardrobe around it. References carry whatever they show.
Guide
Making one that holds
Each graph imports with its nodes wired and the models it needs listed. Swap the reference images and run it.

Get started with character workflows

Flux 2: Portable consistent characters, without LoRA training
Consistent character generation with Flux2 family models, no training required. Drop 2-5 image, describe your character…

Flux 2 + Krea 2: Multi model portable consistent characters(Training only)
Multi model consistent character generation for combining Krea2 & Flux family into one .char. Drop 2-5 image, describe…

Flux 2 Klein: Generate consistent images with unified .char model
Generate consistent images with unified character model .char

Krea 2: Generate consistent images with unified .char model
Generate consistent images with unified character model .char.
The file
A character is one portable file
It lands in models/characters as a .char. Copy it to another machine, hand it to someone else, or drop it back in.
emmy.char manifest.json payload index, fingerprints, training record refs/000..004.png your reference images, immutable derived/face_000..004.png face crops, 512px text/description.md the locked description, also the trigger scoring/ per-reference embeddings and their centroids payloads/flux2-klein/ references resized for FLUX.2 payloads/krea2-lora/ the trained Krea 2 adapter
Your references and description are the truth in that file. Everything else is cache: if the format moves on, the compiled parts are thrown away and rebuilt from your originals rather than migrated.
Honestly
What it does not do
- Scenes with several people are not solved. A character's face spreads onto everyone else in frame, and the score will not catch it: it finds one match and reports success. Keep characters to single-subject shots.
- Face similarity is not identity. A close lookalike scores well; an identical twin would pass. The score compares takes, it does not assert who someone is.
- References cost render time. Five at 1024px roughly sextuple the tokens per denoising step, and attention does not scale linearly.
- A reference set has no strength dial. FLUX.2 conditions on the references for the whole denoise, so if a character overpowers a scene your levers are reference count and prompt. A trained adapter does have one, set when it is attached.
- One reference set, one person. A reference that is not clearly the same face is flagged when the character is built, because identity is matched against the closest reference rather than an average.
- Training a character LoRA on two or three photos memorises them. The adapter starts returning the training frames instead of the person in them, so spread the references across framing and lighting and stop at roughly a hundred steps per image.
- A character carries a payload per model, not for every model. FLUX.2 reads references, Krea 2 takes a trained adapter, and a model with neither cannot apply one at all.
FAQ
How is this different from PuLID or IP-Adapter FaceID?
Those inject a face embedding through a trained adapter, which is extra weights tied to one base model. A character uses FLUX.2's own multi-reference channel instead, so there is nothing to train and nothing to install, and the references carry hair, build and wardrobe rather than a face embedding alone.
Is this just img2img?
No. img2img noises your input and denoises from there, so the output inherits the input's composition. A character starts from pure noise and attends to the references as extra tokens, so the composition is completely free. FLUX.2 has no img2img path at all.
Do I still need to train a LoRA?
Not for consistency. A LoRA still binds harder and is worth it for a lead you will shoot hundreds of times, but a character takes seconds instead of hours and needs no dataset.
How many reference images do I need?
One is enough to start. Varied angles help more than more frontals, because each reference is matched independently rather than averaged. Every reference also adds tokens at every denoising step, so more is not free.
What is the continuity score?
A 0-100 measure of how closely a take matches the character, on every render. It blends a face match against your references with a whole-subject match, and falls back to the subject alone when no face is visible.
Does it work with more than one character in a shot?
Not yet. In a scene with several people the character's face tends to spread onto the others in frame, and the continuity score does not catch it, because it finds one matching face and reports success. Keep characters to shots built around one person for now.
Where does a character live?
One .char file in models/characters, next to your checkpoints. It is a zip you can copy between machines, share, or drop back in. Nothing is stored in a cloud.
Free and open source, running on your own GPU. New to the app? LoRA training covers the other way to bind a subject.