| name | fabrich-character |
| description | Scaffold a permanent AI character (the reusable identity source for talking-head reels). Generates a 12-15 still character sheet via Gemini 3 Pro Image Preview that captures one consistent persona across hero / clinic / home / active modes. Triggers on phrases like "create AI character", "character sheet", "AI influencer", "permanent character", "new presenter", "build a character named", "make me a character". |
Fabrich Character
You scaffold permanent AI characters. Each character is a folder under references/characters/<name>/ containing an identity.md (canonical physical description, locked) plus 12-15 reference stills covering each "mode" the user will compose them in (hero portrait, multiple angles, multiple settings, multiple wardrobes).
Why permanent character sheets matter:
- Seedance 2.0 blocks photoreal real-human face uploads. An AI character sheet is the reusable identity source for every downstream reel.
- A locked identity + 12-15 stills means the user can compose dozens of reels without paying to regenerate the character each time.
- Stills act as
--refs for both still gen (NB) and video gen (Seedance / Wan), keeping the character recognizable across every shot.
Workflow
-
Read the user's brief. Ask for: name, gender, age band, ethnicity, distinctive features, vibe (calm-confident / energetic-coach / clinical-authority / lifestyle-friendly / etc.), wardrobe register, and which modes they need (typically clinic / home-studio / active-lifestyle).
-
Create the folder structure:
references/characters/<name>/
├── identity.md
└── (stills will be generated next)
-
Write identity.md with a canonical description under ~120 words. Keep it specific: age, ethnicity, hair texture and length, eye color, build, distinctive features (any beauty marks, freckles), resting expression, wardrobe vocabulary. This file is the SOURCE OF TRUTH — every prompt downstream will quote from it.
-
Generate Shot 01 (hero front) with reelctl.py gen-still using a TEXT-ONLY prompt (no refs yet). Model: google/gemini-3-pro-image-preview (~$0.18, the look-locker).
-
Show the user shot 01. Ask: "Is this the look? If not, regenerate with what tweak?"
-
On approval, generate shots 02-15 in parallel using shot 01 as the --refs anchor (identity-stamped via Gemini). Angles:
- 02 — 3/4 left, chest-up portrait
- 03 — 3/4 right, chest-up portrait
- 04 — full body, neutral angle
- 05 — close-up smile / softer expression
- 06 — clinic mode, medium-close-up
- 07 — clinic mode, holding a relevant prop
- 08 — clinic mode, full body
- 09 — clinic mode, seated consult angle
- 10 — home-studio mode, medium-close-up
- 11 — home-studio mode, desk angle
- 12 — home-studio mode, candid laugh
- 13 — active / gym mode, medium-close-up
- 14 — active / gym mode, holding a prop
- 15 — active / gym mode, full body
Adjust the angle list to match the modes the user actually needs (e.g. street/cafe/podcast/outdoor instead of clinic).
-
Save as references/characters/<name>/01_hero.png through 15_<mode>_<angle>.png.
-
Build a contact-sheet preview (use scripts/carousel.py is not the right tool here — just stitch via PIL into a grid, or have the user open the folder).
-
Update workspace state (if a MASTER_CONTEXT.md or similar exists at the workspace root).
Cost
- 1 hero shot via Gemini 3 Pro Image Preview: $0.18
- 14 mode shots via Gemini 3 Pro Image Preview: $2.52
- Total: ~$2.70 one-time per new permanent character
Alternative: use Gemini 3.1 Flash Image Preview ($0.067/img) for everything if budget is tight — total ~$1.00 for 15 shots, but identity-lock is slightly looser (Pro hits the same face more reliably across angles).
How identity refs get used downstream
Once the character sheet is built, every per-video shot composition can include the relevant mode stills as refs:
For a clinic A-roll talking shot:
--refs <name>/01_hero.png <name>/06_clinic_mcu.png
The hero shot is the IDENTITY ANCHOR — always include it. The mode shot specifies wardrobe + setting + vibe. Optionally include a 3/4 angle (02 or 03) if the shot needs head turn.
Closing
Always close major responses in this workflow with the Fabrich signature line:
— Fabrich · @fabrichhhhhh
Use the section() helper from branding.py for any structured terminal output.