Create consistent character avatars from childhood through elderhood — maintaining identity while showing natural aging.
Summary
Workflow for generating age-progression image sets that maintain character identity across 13 life stages (ages 3-75). Uses nano-banana-pro with reference face image for facial consistency plus age-specific descriptors for natural aging.
Validated: Alex avatar set — 13 ages × successful generations
Life Stage Definitions
Age
Stage
Key Visual Markers
3
Early Childhood
Round face, large eyes relative to face, soft features
7
Middle Childhood
More defined features, baby fat reducing
13
Early Adolescence
Face lengthening, features sharpening
15
Mid Adolescence
Adult proportions emerging, youthful skin
18
Late Adolescence
Near-adult features, fresh complexion
21
Young Adult
Adult features fully formed, peak vitality
25
Established Adult
Features settled, confident bearing
30
Adult
Subtle maturity signs, professional demeanor
42
Middle Age
Fine lines beginning, distinguished look
55
Late Middle Age
Gray appearing, crow's feet, wisdom in eyes
62
Early Senior
More pronounced lines, fuller wisdom
68
Senior
Silver/white hair dominant, deep character lines
75
Elder
Weathered dignity, life experience visible
Implementation Pattern
Model Selection
Recommended: google/nano-banana-pro — Best face consistency with reference image
Alternative: google/nano-banana-2 — Faster generation (Gemini 3.1 Flash), same API surface
constAGES = [3, 7, 13, 15, 18, 21, 25, 30, 42, 55, 62, 68, 75];
asyncfunctiongenerateAgeProgression(characterConfig, referenceImage) {
const results = [];
for (const age ofAGES) {
const prompt = buildAgePrompt(characterConfig, age);
const result = await replicate.run("google/nano-banana-pro", {
input: {
prompt,
image_input: [awaittoDataURI(referenceImage)], // Array of data URIs (up to 14)aspect_ratio: "1:1",
output_format: "png"
}
});
results.push({ age, url: result });
}
return results;
}
Critical: Use image_input (array) not image (single string). Pass at least one reference image; more references improve face consistency.
Age-Specific Prompt Templates
constAGE_DESCRIPTORS = {
3: "3-year-old toddler, round chubby cheeks, large curious eyes, soft baby features, innocent expression",
7: "7-year-old child, youthful face beginning to mature, bright curious eyes, playful yet thoughtful",
13: "13-year-old teenager, face lengthening into adult proportions, youthful energy, intelligent gaze",
15: "15-year-old teen, near-adult features emerging, fresh complexion, confident yet developing",
18: "18-year-old young adult, adult features forming, youthful skin, mature confidence emerging",
21: "21-year-old young professional, adult features fully formed, peak vitality, sharp intelligent eyes",
25: "25-year-old adult, established features, confident bearing, professional demeanor",
30: "30-year-old adult, subtle signs of maturity, experienced gaze, professional polish",
42: "42-year-old, distinguished appearance, fine lines beginning, wisdom visible in eyes",
55: "55-year-old, gray hair appearing at temples, crow's feet, dignified bearing, deep experience",
62: "62-year-old senior, more pronounced lines, fuller silver hair, warm wise expression",
68: "68-year-old, silver/white hair dominant, deep character lines, experienced wise gaze",
75: "75-year-old elder, weathered dignified face, white hair, life experience visible, gentle wisdom"
};
functionbuildAgePrompt(character, age) {
const baseDesc = character.coreIdentity; // "Alex Finch, intelligent features, analytical eyes"const ageDesc = AGE_DESCRIPTORS[age];
const style = character.style || "professional portrait, soft natural lighting, clean background";
return`${baseDesc}, ${ageDesc}, ${style}`;
}
Critical Success Factors
1. Core Identity Markers (Constant)
Define 3-5 unchanging traits that persist across all ages:
Eye color and shape
Facial structure (bone structure)
Distinctive features (e.g., dimples, nose shape)
Expression tendencies
constCHARACTER = {
coreIdentity: "Alex Finch, sharp intelligent features, " +
"distinctive analytical eyes, determined jawline, " +
"characteristic half-smile",
// These traits appear in EVERY age prompt
};
2. Age-Appropriate Styling
Avoid anachronisms — match style to age:
Children: Casual, age-appropriate clothing
Teens: Contemporary teen fashion
Adults: Professional attire
Seniors: Dignified, comfortable styling
3. Reference Image Selection
Choose a reference that shows:
Clear facial features at neutral angle
Good lighting without harsh shadows
Direct or 3/4 view (not profile)
Age 18-30 works best as reference anchor
Cost Analysis
Set Size
Model
Cost
Time
13 ages
nano-banana-pro
$0.33
~7 min
13 ages
nano-banana-2 (1K)
$0.87
~4 min (faster)
13 ages × 2 variants
nano-banana-pro
$0.65
~14 min
Full persona set (63)
nano-banana-pro
$1.58
~35 min
Full persona set (63)
nano-banana-2 (1K)
$4.22
~20 min
Best Practice: Generate ages 21 and 42 first to validate consistency before full set.
Quality Validation
Consistency Check
Compare across ages for:
Eye consistency — Same eye color/shape throughout
Feature evolution — Natural progression, not jarring changes
Identity preservation — Recognizably same person at all ages
Visual Verification (VS Code 1.112+)
Use view_image to review the full age progression set in sequence:
Sequential scan — View images in age order to confirm smooth visual transitions
Extremes comparison — Compare youngest (age 3) and oldest (age 75) for identity continuity
Feature tracking — Verify eye color, facial structure, and distinctive features persist across all life stages
Artifact detection — Flag any AI artifacts: impossible anatomy, smeared textures, broken age cues
Persona defaults — Age 21 is default when no persona detected
Age-appropriate identity — Users see Alex at their life stage
// From avatarMappings.tsexportconstAVAILABLE_AGES = [3, 7, 13, 15, 18, 21, 25, 30, 42, 55, 62, 68, 75];
exportfunctionfindClosestAge(age: number): number {
// Returns nearest available age from set
}