Creating Brand Profiles

August 26, 2026 · View on GitHub

Brand profiles let you maintain consistent visual identity across videos. Each brand defines colors, fonts, and voice settings.

Quick Start: Run /brand in Claude Code to create a brand interactively. It can extract colors from a website URL, generate a palette from a single color, or let you specify colors manually.

Brand Structure

brands/
├── default/
│   ├── brand.json     # Colors, fonts, spacing
│   ├── voice.json     # Voice settings
│   └── assets/        # Logo, backgrounds, watermarks
│       ├── logo.svg
│       └── background.mp4
└── my-company/
    ├── brand.json
    ├── voice.json
    └── assets/

Creating a New Brand

  1. Copy the default brand

    cp -r brands/default brands/my-company
    
  2. Edit brand.json

    {
      "name": "My Company",
      "description": "Corporate brand for My Company videos",
      "colors": {
        "primary": "#2563eb",
        "primaryLight": "#3b82f6",
        "textDark": "#1e293b",
        ...
      },
      "fonts": {
        "primary": "Inter, sans-serif",
        "mono": "JetBrains Mono, monospace"
      }
    }
    
  3. Configure voice settings (optional) Edit voice.json to use a different ElevenLabs voice:

    {
      "voiceId": "your-voice-id",
      "settings": {
        "stability": 0.75,
        "similarityBoost": 0.9
      }
    }
    
  4. Add brand assets Place logo, background videos, or watermarks in assets/.

Using a Brand in a Project

When creating a new project with /video, you'll be prompted to select a brand:

Which brand?

  1. default - #3B82F6 (blue)
  2. digital-samba - #3771e0 (blue)
  3. my-company - #your-color
  4. Create new brand → /brand

The selected brand's colors, fonts, and assets are automatically applied to your project via src/config/brand.ts.

Manual Brand Loading

If you prefer manual setup, reference the brand in your project's config:

// brand.ts (auto-generated by /video command)
import { loadBrand } from '../../../lib/brand';

export const brand = loadBrand('my-company');

Brand Properties

Colors

PropertyDescription
primaryMain accent color
primaryLightLighter variant for hover/highlight
textDarkPrimary text color
textMediumSecondary text color
textLightTertiary/muted text
bgLightLight background
bgDarkDark background
bgOverlaySemi-transparent overlay
dividerBorder/divider color
shadowShadow color (with alpha)

Fonts

PropertyDescription
primaryMain font for headings and body
monoMonospace font for code

Typography

Define sizes and weights for each text style:

  • h1, h2, h3 - Heading styles
  • body - Body text
  • label - Labels and captions

Voice Settings

ElevenLabs

PropertyDescription
voiceIdElevenLabs voice ID
stabilityVoice stability (0-1, higher = more consistent)
similarityBoostVoice similarity (0-1, higher = more similar to original)
styleStyle exaggeration (0-1)
modelElevenLabs model to use

Qwen3-TTS

Add an optional qwen3 section to voice.json for self-hosted TTS:

{
  "voiceId": "...",
  "settings": { ... },
  "qwen3": {
    "speaker": "Ryan",
    "language": "Auto",
    "instruct": "",
    "clone": {
      "refAudio": "assets/voice-reference.m4a",
      "refText": "Exact transcript of the reference audio."
    }
  }
}
PropertyDescription
qwen3.speakerBuilt-in speaker name (Ryan, Aiden, Vivian, etc.)
qwen3.languageLanguage hint (Auto, English, Chinese, etc.)
qwen3.instructEmotion/style instruction (e.g., "Speak warmly")
qwen3.clone.refAudioPath to reference audio, relative to brand directory
qwen3.clone.refTextExact transcript of the reference audio

Both qwen3 and qwen3.clone are optional. Set clone to null or omit it to use built-in speakers only.

Setting Up Voice Cloning

Run /voice-clone for a guided workflow that:

  1. Records or imports reference audio
  2. Tests the clone quality
  3. Saves the profile to your brand's voice.json

Once saved, use --brand to load it automatically:

uv run tools/voiceover.py --provider qwen3 --brand my-company --scene-dir public/audio/scenes --json