character-creation

Create and manage consistent AI video characters — define the persona, generate the portrait with Nano Banana, and store the config for reuse across all videos in the series.

9 stars

Best use case

character-creation is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Create and manage consistent AI video characters — define the persona, generate the portrait with Nano Banana, and store the config for reuse across all videos in the series.

Teams using character-creation should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/character-creation/SKILL.md --create-dirs "https://raw.githubusercontent.com/exiao/skills/main/video/character-creation/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/character-creation/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How character-creation Compares

Feature / Agentcharacter-creationStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Create and manage consistent AI video characters — define the persona, generate the portrait with Nano Banana, and store the config for reuse across all videos in the series.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Character Creation

Design a character once. Reuse it forever.

A character is: a name, a personality, a visual identity (portrait image), and a voice archetype. Every video in a series pulls from the same config so the character stays consistent across 100 episodes.

Characters are stored at `~/clawd/characters/<slug>/`.

---

## Step 1: Define the Character

Before touching Nano Banana, answer these questions:

| Field | Description | Example |
|-------|-------------|---------|
| **Name** | Character's on-screen name | "Max", "Dr. Erica", "The Analyst" |
| **Slug** | Filesystem-safe ID | `max`, `dr-erica`, `the-analyst` |
| **Platform** | Primary target | TikTok, Reels, Shorts |
| **Niche / Topic** | What does this character talk about? | Investing, personal finance, crypto |
| **Personality** | 3 adjectives max | Confident, dry, contrarian |
| **Speech style** | How they talk | Short sentences. No hedging. Uses "here's the thing:" a lot. |
| **Voice archetype** | For ElevenLabs selection | Deep male, mid-range female, energetic young male |
| **Visual style** | Overall aesthetic | Photorealistic, 3D animated, illustrated |
| **Appearance** | Age, ethnicity, clothing, setting | 35yo, business casual, minimalist office background |

Save answers — you'll use them in every step.

---

## Step 2: Generate the Portrait

Two images required: **portrait** (for thumbnails, branding) and **face reference** (for InfiniteTalk consistency).

### Portrait (9:16 for TikTok/Reels)

```bash
uv run ~/clawd/skills/nano-banana-pro/scripts/generate_image.py \
  --prompt "<appearance description>, looking directly at camera, confident expression, <visual style>, professional lighting, clean background" \
  --filename "~/clawd/characters/<slug>/portrait-$(date +%Y-%m-%d).png" \
  --aspect-ratio 9:16 \
  --resolution 2K \
  --thinking high
```

### Face Reference (1:1 for InfiniteTalk)

```bash
uv run ~/clawd/skills/nano-banana-pro/scripts/generate_image.py \
  --prompt "<appearance description>, extreme close-up headshot, neutral expression, facing forward, <visual style>, studio lighting, white background" \
  --filename "~/clawd/characters/<slug>/face-ref-$(date +%Y-%m-%d).png" \
  --aspect-ratio 1:1 \
  --resolution 2K \
  --thinking high
```

### Iteration

- Start at `--resolution 512` for fast drafts. Lock the look first.
- Once approved, regenerate at `2K` with `--thinking high`.
- If 80% is right, edit: `--input-image` the draft + prompt the specific fix.
- For consistency across future regenerations: always pass the approved face reference as `--input-image` with `"Keep the person's facial features exactly the same as the input image"`.

---

## Step 3: Save the Config

Create `~/clawd/characters/<slug>/config.json`:

```json
{
  "name": "Max",
  "slug": "max",
  "platform": "TikTok",
  "niche": "Investing / Stock Market",
  "personality": ["confident", "dry", "contrarian"],
  "speech_style": "Short punchy sentences. No hedging. Calls out conventional wisdom. Uses 'here's the thing:' as a transition.",
  "voice_archetype": "Deep male, 35-45yo, measured pace, slight edge",
  "elevenlabs_voice_id": "",
  "visual_style": "Photorealistic",
  "appearance": "35yo male, sharp jawline, business casual (navy blazer, no tie), minimalist modern office background, warm key light from left",
  "portrait": "portrait-2026-03-03.png",
  "face_ref": "face-ref-2026-03-03.png",
  "created": "2026-03-03",
  "accounts": {
    "tiktok": "",
    "reels": "",
    "shorts": ""
  }
}
```

Fill in `elevenlabs_voice_id` after selecting/cloning the voice in ElevenLabs. Fill in `accounts` with platform handles once set up.

---

## Step 4: Verify Consistency

Before the character is production-ready, generate 3 test images using the face reference as input and verify:

- Same facial features across all 3
- Expression changes work (neutral, smile, serious)
- The character reads clearly at thumbnail size (small screen test)

If consistency breaks: pass 2-3 approved reference images simultaneously via comma-separated `--input-image`.

---

## Character Directory Structure

```
~/clawd/characters/
  max/
    config.json
    portrait-2026-03-03.png
    face-ref-2026-03-03.png
  dr-erica/
    config.json
    portrait-2026-03-03.png
    face-ref-2026-03-03.png
```

---

## When to Create a New Character

- New account on a new platform with a different niche or tone
- Series concept that needs a visually distinct persona
- A/B testing two character styles on the same niche

**Don't** create a new character just because you're starting a new series. If the niche and platform match, reuse the existing character — that's the whole point.

---

## Downstream Usage

Once a character is created:

- **Scripts** → `content-strategy` skill (Video Series section) writes the episode scripts in the character's voice
- **Audio** → ElevenLabs, using `elevenlabs_voice_id` from config
- **Video** → InfiniteTalk, using `face_ref` image + ElevenLabs audio
- **Scheduling** → upload the output MP4 to your platform of choice

Related Skills

writer

9
from exiao/skills

Write content in Eric's voice — articles, blog posts, tweets, social media posts, marketing copy, newsletter drafts. Loads WRITING-STYLE.md and enforces kill phrases.

positioning-angles

9
from exiao/skills

Use when defining product positioning, choosing strategic angles, crafting value propositions, competitive positioning, product messaging, differentiation strategy, or go-to-market angles. Also use for 'how should I position my app', 'what angle should I use', 'painkiller vs vitamin', or 'market positioning'.

outline-generator

9
from exiao/skills

Use when generating outlines, article structures, content outlines, blog outlines, planning article sections, structuring posts, breaking down topics into sections, or organizing ideas for long-form content. Also use for 'outline this', 'structure this article', or 'plan the sections'.

last30days-open

9
from exiao/skills

Use only when the user explicitly asks for the open variant of last30days, including watchlists, briefings, and history queries. Sources: Reddit, X, YouTube, web.

last30days

9
from exiao/skills

Use when researching what happened in the last 30 days on a topic. Also triggered by 'last30'. Sources: Reddit, X, YouTube, web. Produces expert-level summary with copy-paste-ready prompts.

hooks

9
from exiao/skills

Use when generating hooks, headlines, titles, and scroll-stopping openers for content. Also use when analyzing viral posts, Reels, TikToks, YouTube Shorts, or successful social examples to extract reusable hook patterns and improve hook guidance.

evaluate-content

9
from exiao/skills

Use when judging content quality OR editing/improving existing copy: shareability, readability, voice, cuttability, angle, copy sweeps.

editor-in-chief

9
from exiao/skills

Use when a first draft is complete and all Phase 1 gates are done: topic selected (seo-research), title approved (hooks), outline approved (outline-generator), draft written (writer). Runs autonomous diagnosis-prescribe-rewrite loop before Substack.

copywriting

9
from exiao/skills

Write or improve marketing copy for any surface: pages, ads, app stores, landing pages, TikTok/Meta scripts, push notifications, UGC. Combines page copy frameworks with direct response principles.

content-strategy

9
from exiao/skills

Use when building content strategy: hooks, angles, and ideas from what's trending now. Covers organic and paid creative across TikTok, X, YouTube, Meta, LinkedIn.

content-pipeline

9
from exiao/skills

Orchestrator for the 3-article content pipeline — runs research phase, spawns parallel article sub-agents, creates Typefully drafts. Use when running the full content pipeline (usually via cron at 3am).

yt-dlp

9
from exiao/skills

Download audio/video from YouTube and other sites using yt-dlp. Use when the user asks to download music, songs, albums, podcasts, or video from YouTube or similar platforms. Triggers on 'download song', 'get mp3', 'yt-dlp', 'youtube download', 'rip audio'.