# Character Aging Progression

> Generate visually consistent character images across different life stages using nano-banana-pro with age-specific prompts

- Skill: `fabioc-aloha/character-aging-progression` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add fabioc-aloha/character-aging-progression`
- Raw SKILL.md: https://api.skillmd.com/api/skills/fabioc-aloha/character-aging-progression/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: fabioc-aloha (https://skillmd.com/u/fabioc-aloha)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/fabioc-aloha/character-aging-progression

---


# Character Aging Progression

> Create consistent character avatars from childhood through elderhood — maintaining identity while showing natural aging.

> **Staleness Watch**: See [EXTERNAL-API-REGISTRY.md](../../EXTERNAL-API-REGISTRY.md) for source URLs and recheck cadence

---

## 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

```javascript
const AGES = [3, 7, 13, 15, 18, 21, 25, 30, 42, 55, 62, 68, 75];

async function generateAgeProgression(characterConfig, referenceImage) {
  const results = [];
  
  for (const age of AGES) {
    const prompt = buildAgePrompt(characterConfig, age);
    const result = await replicate.run("google/nano-banana-pro", {
      input: {
        prompt,
        image_input: [await toDataURI(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

```javascript
const AGE_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"
};

function buildAgePrompt(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

```javascript
const CHARACTER = {
  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:
1. **Eye consistency** — Same eye color/shape throughout
2. **Feature evolution** — Natural progression, not jarring changes
3. **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

### Common Issues

| Issue | Cause | Fix |
|-------|-------|-----|
| Age jump too drastic | Age descriptors too different | Add intermediate transition language |
| Baby/child looks different | Reference face too adult | Use neutral young adult reference |
| Senior unrecognizable | Too much aging description | Reduce weathering descriptors |

---

## File Organization

```
characters/
  {character-name}/
    reference/
      face-reference.png
    ages/
      Alex-03.png
      Alex-07.png
      ...
      Alex-75.png
    generation-report.json
```

---

## Integration with Avatar System

Alex's avatar system uses age progression for:
1. **Birthday fallback** — Show user's age-matched Alex
2. **Persona defaults** — Age 21 is default when no persona detected
3. **Age-appropriate identity** — Users see Alex at their life stage

```typescript
// From avatarMappings.ts
export const AVAILABLE_AGES = [3, 7, 13, 15, 18, 21, 25, 30, 42, 55, 62, 68, 75];

export function findClosestAge(age: number): number {
  // Returns nearest available age from set
}
```

---

## Confidence Level

**High** — Empirically validated through:
- 13 age images generated for Alex character
- Consistent identity across full progression
- 768×768 optimized avatars deployed
- User birthday → age avatar mapping working

