Distinct from flyer-maker / carousel-builder:
- Single subject focus (the face). No event details, no narrative split, no embedded text.
- Identity preserve is the PRIMARY constraint — model picker defaults to nano-banana-pro.
- Multi-variant within an aspect is the common case (give user 3 takes per aspect, pick the best).
This skill does NOT:
- Generate avatars from text alone —
--photo is required (use image-prompt for text-only portrait generation).
- Render text overlays (name / handle / title) — avatars are visual only. Add text in your design tool if needed.
- Touch-up / retouch existing photos at the pixel level — the model regenerates the subject in a new style.
- Generate animal mascots / cartoon avatars without a photo reference — see
image-prompt for that.
- Handle multi-person group photos — single subject only; the model picks one face if given a group.
ROLE
Read user photo + optional style preference → pick a ref-capable identity-preserving model → assemble per-aspect prompts emphasizing identity preserve + style anchor → batch execute → save N variants per aspect → print paths.
PIPELINE
Resolve photo (required):
--photo <path-or-url>: local file or remote URL.
- Should be a clean front-facing portrait at ≥800px on the short edge for best results.
Resolve style:
--style auto: picks photoreal-friendly styles from carousel library (kinfolk-minimal, photo-editorial-bw, gradient-mesh-modern, dark-academia, …) — avoids illustration / 3D styles where identity gets lost.
--style <library-id>: explicit library entry. Uses the Style anchor (carousel) block.
--style-mod "<override>": tweak.
Pick model:
--model auto: defaults to nano-banana-pro (best identity preserve).
- If identity preserve isn't the priority (style transfer first) →
flux-2-pro or seedream-5.
- If embedded brand colors / typography needed →
ideogram-3 (rare for avatars).
--model <slug>: override.
- ONE model across all aspects + variants.
Build per-aspect prompts:
<style anchor (carousel)>
Portrait of the person from the reference image. Preserve identity: face shape, age, ethnicity, hair, distinguishing features. Apply the style's palette, lighting, and composition to the surrounding environment / clothing texture / background — but the face stays recognizably the same person.
Framing: <aspect-specific>
Aspect ratio: <ratio>
Size: <pixel dimensions>
Estimate cost + confirm — aspects × variants × per-image cost. Default 1 aspect × 3 variants × $0.05 = $0.15. Under budget.
Batch execute — common.runners.batch.run_batch(). Parallelism 3.
Output:
./generated/avatar/<slug>/
square-v1.png ... square-v<N>.png (1080×1080)
cover-v1.png ... cover-v<N>.png (1080×1350, if requested)
story-v1.png ... story-v<N>.png (1080×1920, if requested)
manifest.json
style-used.md
prompts.md
MODES
Required
avatar-maker --photo <path-or-url>
Style
--style auto|<library-id> — visual style (default: auto, picks photoreal-friendly)
--style-mod "<override>" — tweak the anchor
Aspect + variants
--aspects square,square-tight,cover,story — comma list (default: square)
--variants N — variants per aspect (default 3 — sweet spot for picking the best)
--slug <name> — output directory slug (default: derived from photo filename)
Execution
--model auto|<slug> — image provider (default nano-banana-pro)
--execute — actually generate (else returns prompts)
--output <dir> — custom output dir
--parallelism N — concurrent API calls (default 3)
--yes — skip cost confirmation
--resume — retry failed variants
--prompts-only — dry run, save prompts.md, exit
--cost-only — print total cost, exit
--strict — exit if --model <slug> can't handle photo refs
REFERENCES (load on demand)
| File |
When to load |
| references/model-picker.md |
Step 3 — identity-preserve model comparison, when to pick which |
| references/aspect-presets.md |
Step 4 — aspect dimensions, framing conventions per platform (LinkedIn / Twitter / IG / Cover banners) |
| references/troubleshoot.md |
When face doesn't look like the original / style overpowers identity / variants look identical |
EXAMPLES
See examples/before-after.md — 3 calibration runs: founder headshot for LinkedIn (kinfolk-minimal, 3 variants), photo-editorial B&W portrait set, multi-aspect avatar set for someone setting up new social accounts (square + cover-banner + story).
CONSTRAINTS
Identity preserve is paramount. Nano Banana Pro is the safest pick. If --model is overridden and identity gets lost, the troubleshoot reference covers fixes.
Use a clean source photo. ≥800px on the short edge. Front-facing or 3/4. Even lighting. Avoid heavy shadow / backlight / partial occlusion.
No mid-image text. Avatars are visual-only. Don't add --title or similar.
Default 3 variants per aspect. Models produce stochastic variation — 3 takes lets the user pick the best. Past 5, diminishing returns.
One model across the run. Mixing providers breaks consistency.
One style across the run. Same anchor across all aspects + variants.
Photoreal-friendly styles win. Carousel library has illustration / 3D / abstract styles (flat-vector-illustration, low-poly-3d, paper-cutout-craft) — these LOSE identity. --style auto filters them out. If explicitly chosen, the result will look more like "a person in that style" than "this specific person".
Cost confirm ONCE per batch. Sum across aspects × variants.
Output slug derived from photo filename by default. Override via --slug or --output.
Manifest updates after every variant. --resume retries failed only.
Photo can be local or URL. Provider routes accordingly.
Never print API keys. Mask in errors.
Output dir is ./generated/avatar/<slug>/ by default.
INVOCATION HINTS
When the user says any of:
- "make me an avatar / profile pic from this photo"
- "headshot variants", "portrait variants"
- "LinkedIn profile picture", "Twitter profile pic", "Instagram avatar"
- "professional headshot", "business portrait"
- "branded avatar set" (variants in different aspects for cross-platform consistency)
- "сделай аватарку / портрет / хедшот"
- "профиль для LinkedIn / Twitter / IG"
- "аватарка с моей фоткой"
Defaults: --aspects square --variants 3 --style auto --model nano-banana-pro. Without --execute, returns prompts; with --execute, generates.
If the user mentions LinkedIn → emphasize --aspects square (LinkedIn profile is 1:1 + a 4:1 cover-banner area; the cover aspect is closer to LinkedIn cover banner).
If the user mentions cross-platform: --aspects square,square-tight,cover gives them 1:1 for most + a tighter crop for small profile thumbs + a cover banner.
This skill is distinct from:
flyer-maker — that's events with embedded text; this is identity-preserved portraits
image-prompt — that's any image; this is specifically photo-input → variant portraits
carousel-builder — that's narrative slides; this is variants of one subject
1---2name: avatar-maker3description: Turn a user photo into N profile-pic / headshot / avatar variants in a consistent style. Identity-preserve focused, defaults to nano-banana-pro. Multi-aspect (square, square-tight, cover 4:5, story 9:16). Use when: 'make me an avatar', 'profile picture from this photo', 'headshot variants', 'LinkedIn profile pic', 'аватарка', 'портрет', 'хедшот'.4license: MIT5---67<objective>8Headshot / profile-pic / avatar generator. Input: user photo (REQUIRED) + optional style + optional aspect set. Output: N variant images at chosen aspects, each preserving the original face while applying the style's palette / lighting / composition.910Distinct from flyer-maker / carousel-builder:11- Single subject focus (the face). No event details, no narrative split, no embedded text.12- Identity preserve is the PRIMARY constraint — model picker defaults to nano-banana-pro.13- Multi-variant within an aspect is the common case (give user 3 takes per aspect, pick the best).1415This skill does NOT:16- Generate avatars from text alone — `--photo` is required (use `image-prompt` for text-only portrait generation).17- Render text overlays (name / handle / title) — avatars are visual only. Add text in your design tool if needed.18- Touch-up / retouch existing photos at the pixel level — the model regenerates the subject in a new style.19- Generate animal mascots / cartoon avatars without a photo reference — see `image-prompt` for that.20- Handle multi-person group photos — single subject only; the model picks one face if given a group.21</objective>2223## ROLE2425Read user photo + optional style preference → pick a ref-capable identity-preserving model → assemble per-aspect prompts emphasizing identity preserve + style anchor → batch execute → save N variants per aspect → print paths.2627## PIPELINE28291. **Resolve photo** (required):30 - `--photo <path-or-url>`: local file or remote URL.31 - Should be a clean front-facing portrait at ≥800px on the short edge for best results.32332. **Resolve style**:34 - `--style auto`: picks photoreal-friendly styles from carousel library (kinfolk-minimal, photo-editorial-bw, gradient-mesh-modern, dark-academia, …) — avoids illustration / 3D styles where identity gets lost.35 - `--style <library-id>`: explicit library entry. Uses the `Style anchor (carousel)` block.36 - `--style-mod "<override>"`: tweak.37383. **Pick model**:39 - `--model auto`: defaults to `nano-banana-pro` (best identity preserve).40 - If identity preserve isn't the priority (style transfer first) → `flux-2-pro` or `seedream-5`.41 - If embedded brand colors / typography needed → `ideogram-3` (rare for avatars).42 - `--model <slug>`: override.43 - ONE model across all aspects + variants.44454. **Build per-aspect prompts**:46 ```47 <style anchor (carousel)>4849 Portrait of the person from the reference image. Preserve identity: face shape, age, ethnicity, hair, distinguishing features. Apply the style's palette, lighting, and composition to the surrounding environment / clothing texture / background — but the face stays recognizably the same person.5051 Framing: <aspect-specific>52 Aspect ratio: <ratio>53 Size: <pixel dimensions>54 ```55565. **Estimate cost + confirm** — `aspects × variants × per-image cost`. Default 1 aspect × 3 variants × $0.05 = $0.15. Under budget.57586. **Batch execute** — `common.runners.batch.run_batch()`. Parallelism 3.59607. **Output**:61 ```62 ./generated/avatar/<slug>/63 square-v1.png ... square-v<N>.png (1080×1080)64 cover-v1.png ... cover-v<N>.png (1080×1350, if requested)65 story-v1.png ... story-v<N>.png (1080×1920, if requested)66 manifest.json67 style-used.md68 prompts.md69 ```7071## MODES7273### Required7475- `avatar-maker --photo <path-or-url>`7677### Style7879- `--style auto|<library-id>` — visual style (default: auto, picks photoreal-friendly)80- `--style-mod "<override>"` — tweak the anchor8182### Aspect + variants8384- `--aspects square,square-tight,cover,story` — comma list (default: `square`)85- `--variants N` — variants per aspect (default 3 — sweet spot for picking the best)86- `--slug <name>` — output directory slug (default: derived from photo filename)8788### Execution8990- `--model auto|<slug>` — image provider (default `nano-banana-pro`)91- `--execute` — actually generate (else returns prompts)92- `--output <dir>` — custom output dir93- `--parallelism N` — concurrent API calls (default 3)94- `--yes` — skip cost confirmation95- `--resume` — retry failed variants96- `--prompts-only` — dry run, save prompts.md, exit97- `--cost-only` — print total cost, exit98- `--strict` — exit if `--model <slug>` can't handle photo refs99100## REFERENCES (load on demand)101102| File | When to load |103|---|---|104| [references/model-picker.md](references/model-picker.md) | Step 3 — identity-preserve model comparison, when to pick which |105| [references/aspect-presets.md](references/aspect-presets.md) | Step 4 — aspect dimensions, framing conventions per platform (LinkedIn / Twitter / IG / Cover banners) |106| [references/troubleshoot.md](references/troubleshoot.md) | When face doesn't look like the original / style overpowers identity / variants look identical |107108## EXAMPLES109110See [examples/before-after.md](examples/before-after.md) — 3 calibration runs: founder headshot for LinkedIn (kinfolk-minimal, 3 variants), photo-editorial B&W portrait set, multi-aspect avatar set for someone setting up new social accounts (square + cover-banner + story).111112## CONSTRAINTS113114- **Identity preserve is paramount.** Nano Banana Pro is the safest pick. If `--model` is overridden and identity gets lost, the troubleshoot reference covers fixes.115116- **Use a clean source photo.** ≥800px on the short edge. Front-facing or 3/4. Even lighting. Avoid heavy shadow / backlight / partial occlusion.117118- **No mid-image text.** Avatars are visual-only. Don't add `--title` or similar.119120- **Default 3 variants per aspect.** Models produce stochastic variation — 3 takes lets the user pick the best. Past 5, diminishing returns.121122- **One model across the run.** Mixing providers breaks consistency.123124- **One style across the run.** Same anchor across all aspects + variants.125126- **Photoreal-friendly styles win.** Carousel library has illustration / 3D / abstract styles (`flat-vector-illustration`, `low-poly-3d`, `paper-cutout-craft`) — these LOSE identity. `--style auto` filters them out. If explicitly chosen, the result will look more like "a person in that style" than "this specific person".127128- **Cost confirm ONCE per batch.** Sum across aspects × variants.129130- **Output slug derived from photo filename** by default. Override via `--slug` or `--output`.131132- **Manifest updates after every variant.** `--resume` retries failed only.133134- **Photo can be local or URL.** Provider routes accordingly.135136- **Never print API keys.** Mask in errors.137138- **Output dir is `./generated/avatar/<slug>/`** by default.139140## INVOCATION HINTS141142When the user says any of:143144- "make me an avatar / profile pic from this photo"145- "headshot variants", "portrait variants"146- "LinkedIn profile picture", "Twitter profile pic", "Instagram avatar"147- "professional headshot", "business portrait"148- "branded avatar set" (variants in different aspects for cross-platform consistency)149- "сделай аватарку / портрет / хедшот"150- "профиль для LinkedIn / Twitter / IG"151- "аватарка с моей фоткой"152153Defaults: `--aspects square --variants 3 --style auto --model nano-banana-pro`. Without `--execute`, returns prompts; with `--execute`, generates.154155If the user mentions LinkedIn → emphasize `--aspects square` (LinkedIn profile is 1:1 + a 4:1 cover-banner area; the `cover` aspect is closer to LinkedIn cover banner).156157If the user mentions cross-platform: `--aspects square,square-tight,cover` gives them 1:1 for most + a tighter crop for small profile thumbs + a cover banner.158159This skill is distinct from:160- `flyer-maker` — that's events with embedded text; this is identity-preserved portraits161- `image-prompt` — that's any image; this is specifically photo-input → variant portraits162- `carousel-builder` — that's narrative slides; this is variants of one subject