Channel Production Playbook
⚠ Confidential — Internal Use Only v1.0 Living Document
Vivere Web · Proprietary & Confidential
Channel Production Playbook
The complete methodology for building, producing, and distributing a branded AI-assisted content channel — from zero to scheduled cross-post. Tool-agnostic, team-ready, and designed to evolve.
Owner: Joseph Sutliff Company: Vivere Web Version: 1.0 · June 2026 Status: Active / Living Document Distribution: Internal team — Vivere Web
Mike Olmsted — Your Quick Start
You have Claude Code. You're on a Mac. Here's your exact path from zero to first pilot episode — no fluff, no detours.
Mac Claude Code ✓
Claude Code
Installed
Mac + Terminal
Ready
This Playbook
You're reading it

1 Verify your Mac is pipeline-ready ~2 min

Open Terminal (or the integrated terminal in VS Code) and paste this. Every line should return a version number — not "command not found."

Terminal.app — paste all at once
python3 --version && ffmpeg -version | head -1 && git --version && node --version
If anything says "command not found"
Install Homebrew if you don't have it: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Then install whatever's missing (run only the lines you need):
brew install python@3.11   # if python3 not found
brew install ffmpeg        # if ffmpeg not found
brew install git           # if git not found
brew install node          # if node not found
Open a new terminal tab after installing, then re-run the verify command above.

2 Run the Bootstrap Prompt in Claude Code ~30–45 min

This is the fastest setup path. Joe has a file called MIKE-BOOTSTRAP-PROMPT.md — ask him for it. Then:

A Open Claude Code — launch a new chat and set your working directory to where you want the project (e.g. ~/Developer/VivereChannels)
B Open MIKE-BOOTSTRAP-PROMPT.md in any text editor, copy everything between the ---START PROMPT--- and ---END PROMPT--- markers
C Paste it as your first message and hit Enter — the agent detects Mac, builds the full folder structure, all template files, and walks you through .env setup
D At the end the agent asks you the 8 Stage 0 questions — answer them to begin defining your first channel
What the bootstrap builds for you
Complete folder structure · CLAUDE.md operating rules · channels.json registry · brand.json template · script template · episode queue template · .env.example · requirements.txt · publishing checklist · upload log — everything you need, zero manual setup.

3 Get your API keys ~15 min

KeyWhere to get itFromRequired for
ELEVENLABS_API_KEY elevenlabs.io → sign up → Profile → API Keys → Create → Creator plan ($22/mo) You create Voice narration on every episode
FAL_KEY fal.ai → sign up → Dashboard → Keys → Add Key → add $10 credit to start You create Image generation (Flux) + animated clips (Kling)
BLOTATO_API_KEY Ask Joe — shared Vivere account Joe sends you Cross-posting to TikTok, Instagram, Facebook
R2_* (4 values) Ask Joe — shared Cloudflare R2 bucket Joe sends you Video CDN (Blotato needs a public URL to cross-post)

Paste each key into the .env file the bootstrap created. Never commit it — it's already in your .gitignore.

4 Get the pipeline scripts from Joe once

The bootstrap builds the structure but the production engine (produce.py, make_short.py, build_timing.py) lives in Joe's repository. Ask Joe to either add you as a GitHub collaborator or zip the 06_pipeline/explainer-engine/ folder. Drop those files into the matching folder in your project.

After dropping in the scripts — install Python dependencies
cd ~/Developer/VivereChannels
pip3 install -r requirements.txt

# Verify the pipeline loads:
cd 06_pipeline/explainer-engine
python3 produce.py --help

5 Stage 0 — Define your channel do this with Joe, Session 2

Everything downstream — voice, visuals, scripts, hooks — is derived from your Stage 0 answers. Don't rush this. Read Stage 0 · Pre-Build Decisions in full, then sit down with Joe to lock your answers. The 8 questions:

1. One-line identity (mascot + universe + promise)
2. Your niche — who watches and why
3. Content pillar — your structural hook
4. Voice register — the feeling of the narrator
5. Visual world — what a single frame looks like
6. Sound identity — music feel and instrumentation
7. CTA / owned destination
8. Revenue path — now and at scale

Your Pilot Episode Checklist

Track your progress from setup to first upload. Nothing goes live until Joe approves the pilot.

Mike · Pilot Progress
Where to go next in this playbook
Stage 0
Define your channel — the 8 foundation decisions
Stage 1
Brand identity — name, palette, voice lock
Stage 4
Episode production — script to rendered video
How to Use This Document

This is a living document. The AI content production landscape changes rapidly — new tools emerge weekly, pricing shifts, platforms update their algorithms, and our own production process improves with every channel we build. This playbook is meant to be updated continuously, not filed away.

What this playbook is

  • A methodology — the proven decision sequence and production stages that apply regardless of which specific tools you use
  • A quality standard — what "Vivere quality" means at every stage
  • A team reference — any developer or contractor can pick this up and build a channel consistently with our standards
  • A knowledge base — lessons learned, pitfalls, and best practices accumulated over every build

What this playbook is not

  • A locked prescription — tool choices are made per channel based on what's best at the time
  • A log of existing channel credentials — those live in channels.json and .env only

How examples appear in this document

📋 Vivere Example
When you see a callout like this, it shows how we've applied the methodology in one of our actual builds. Use it as reference — not as a constraint. Your channel's choices may differ completely.
Living Document Protocol
  1. Update after every build. When a new channel goes live, note what worked and what didn't in the Lessons Learned section.
  2. Update when tools change. If a tool is discontinued, repriced, or replaced by something better — update the Tool Stack section immediately.
  3. Increment the version number with each meaningful update. Minor fixes = patch (v1.0 → v1.0.1). New sections or process changes = minor (v1.0 → v1.1).
  4. Log every change in the Changelog below with a date and author.
  5. Owner approval (Joseph Sutliff) required before any change to the Quality Audit Gate section — that section protects channel standing.
Changelog
Add a row every time this document is updated.
v1.0
Jun 2026
Initial release. All stages documented through first Vivere builds. Tool stack, cost model, lessons learned from Wanderers of the Cosmos, Hidden Lives, Mimi's Sweet Treats, and Cosmic Calm.
— Joseph Sutliff
v1.1
Next update goes here. Include: what changed, why, and your name.
The Channel Network Model
Why this system compounds — and how to think about scaling it.

The core idea: One production pipeline, many channel identities. The same workflow — script → voice → art → render → review → publish → cross-post — runs every channel. Changing a brand.json file reskins the entire output. This makes new channels cheap to start and the portfolio value compound over time.

The leverage points

LeverHow it compounds
Same engine, new skinOne brand file swap reskins everything — voice, palette, art style, music. No new tooling.
Asset librariesEach channel's AI art library is generated once and reused free forever. Back-catalog earns without new production cost.
Multi-platform distributionOne video → YouTube Shorts + TikTok + Instagram Reels + Facebook. Same file, 4× the reach.
Multi-language re-voiceAnimation is made once. AI dubbing + re-render captions in 4–5 languages multiplies the catalog N×.
Long ↔ Short repurposingLong-form cuts into Shorts. Shorts compile into long-form. One script, many products.
Portfolio mathSpin up channels cheaply, kill duds fast, pour effort into winners. The system absorbs failure by design.
Scale rule
1 script → 1 master render → 4 platforms → 5 languages = ~20 distributions from a single build. Across a portfolio, the catalog (and back-catalog ad revenue) compounds while marginal cost per asset trends toward zero.
Channel Catalog — Clone Options
12 proven niche concepts. Each reuses the full pipeline — new brand identity is the only requirement.

These are frameworks — not final brand decisions. The name, mascot, palette, and voice for each would be developed in Stage 0–2 of the build process.

History — "The Long Way Here"
Lantern-bearing owl or time-traveler
⭐ Priority 1Good RPMBrand safe
The Inner Cosmos (Biology)
Tiny explorer inside the human body
⭐ Priority 2Good RPMBrand safe
Cosmic Calm (Ambient/Sleep)
No mascot — beauty visuals only
⭐ Priority 3Medium RPMNear-zero cost
Why Your Brain Does That
A small curious "thinker" figure
Good RPMYMYL — fact-check rigorously
How the Money Works
A thrifty fox / coin sprite
High RPMYMYL — "educational not advice"
Hidden Lives (Nature/Animals)
A field-guide naturalist
Medium RPMBrand safe
Old Gods & Lantern Tales
A storyteller by a fire
Good RPMEvergreen
The Quiet Mind (Stoicism)
A calm wanderer / philosopher
Good RPMStrong on Shorts
Restless Earth (Geology/Weather)
A small geologist-explorer
Medium RPMDramatic visuals
Under the Hood (Everyday Tech)
A tinkerer mascot
High RPMDiagrams shine here
Word Wanderer (Etymology)
A pocket-sized scribe
Low RPMCheap + daily cadence
Science & Local Business
Business-specific mascot
Local funnelClient revenue model
⚠ YMYL Channels
Health, Money, Law, and Safety (Your Money Your Life) topics require stricter fact-checking, "educational — not advice" framing in every video, and closer legal review. Don't skip this.
S0
Stage 0 — Pre-Build Decisions
Answer every question before touching any tool. Everything downstream locks to these answers.
Gate
Do not proceed to Stage 1 until every row in the decision table has a written answer. Skipping this is the single most common reason channels fail to have a coherent identity.
The 8 Foundation Questions
QuestionWhy it mattersYour answer (fill before building)
One-line identity
Name + mascot + universe + hook
The filter for every future decision. If a video idea doesn't serve this line, it doesn't get made.e.g. "A tiny explorer shrinks into the human body to explain biology one organ at a time."
Niche
Who searches for this and why
Determines SEO, hashtags, and what YouTube's algorithm serves it alongside.e.g. "Curious adults 25–45 who want to understand science but don't want a lecture."
Content pillar
The structural hook: why does / what if / how big / myth vs. fact
Gives every episode the same storytelling shape, building viewer expectation.
Voice register
Tone — not a person clone
Guides every word in the script and which AI voice to audition.e.g. "Warm, unhurried baritone. Knowledgeable friend, not a professor."
Visual world
Palette, art style, key recurring metaphor
The brand style suffix that gets appended to every image prompt.
Sound identity
Music mood, branded sting
The first 2 seconds of audio is a brand signal. Lock this early.
CTA / owned destination
Website, newsletter, membership
Platform algorithms change. The owned destination is the long-term asset.
Revenue path
Ad → affiliate → owned audience → products
Determines how aggressively to pursue YPP and when to add off-platform monetization.
S1
Stage 1 — Brand Identity Lock
Translate Stage 0 decisions into files that the production system reads automatically.

1A. Create brand.json

Every channel has exactly one brand.json. This file controls what the pipeline produces — voice settings, art model, image style, output directory. Copy the template and fill every field.

File: 06_pipeline/explainer-engine/channels/YOUR-SLUG/brand.json
{
  "channel": "your-channel-slug",
  "name": "Full Channel Name",
  "voice": {
    "voiceId": "ELEVENLABS_VOICE_ID_GOES_HERE",
    "stability": 0.5,
    "similarity_boost": 0.75,
    "style": 0.0,
    "use_speaker_boost": true
  },
  "art": {
    "model": "fal-ai/flux-pro/v1.1",
    "aspect_ratio": "2:3",
    "style_suffix": "YOUR BRAND STYLE SUFFIX — append this to every image prompt"
  },
  "music": {
    "mood": "describe the music mood here",
    "lufs": -26
  },
  "publish_dir": "C:/Users/USERNAME/Desktop/Developer/Media Channels/CHANNEL NAME/UPLOAD READY"
}
Voice ID — Critical Rule
The voice ID is the channel's permanent signature. Once a channel is live and has published videos, the voice ID never changes. Viewers recognize the voice. Swapping it mid-series breaks trust. Audition before you publish — lock it forever after.

1B. Create the Brand Context File

Copy 00_context/_channel-brand-template.md to 00_context/YOUR-SLUG-brand.md. This is the human-readable brand bible — used when writing scripts, generating assets, and briefing contractors.

Must include: palette (hex values), mascot brief, voice register description, art direction notes, music brief, content guardrails, and at least 3 sign-off catchphrases (rotate — never repeat back-to-back).

1C. Register in channels.json

The central registry at 06_pipeline/channels.json controls every automated workflow. Add one block per channel:

"your-slug": {
  "name":               "Full Channel Name",
  "brand":              "your-slug",
  "media_dir":          "Channel Folder Name",
  "handle":             "@channelhandle",
  "niche":              "topic / niche",
  "youtube_channel_id": "",
  "youtube_category":   "27",
  "publish_time":       "12:00",
  "blotato":            { "youtube": "", "tiktok": "", "instagram": "" },
  "status":             "setup",
  "ep_prefix":          "XX"
}

YouTube category codes: 27 = Education · 24 = Entertainment · 26 = Howto & Style · 22 = People & Blogs
Status lifecycle: setupreadylive

1D. Create the Media Folder

Folder structure — create this manually
Media Channels/
└── Channel Folder Name/
    ├── Brand Assets/
    │   ├── brand.json          (copy from channels/SLUG/brand.json)
    │   ├── MASCOTS.md          (mascot generation prompts + pose library)
    │   └── music/              (music beds + outro sting files)
    ├── UPLOAD READY/           (final MP4s — pipeline writes here)
    ├── Pilot Draft/            (renders before approval)
    └── social_posts/           (static social image output)
Stage 1 Checklist
S2
Stage 2 — Mascot & Visual World
Design the character and visual language before generating any episode art. Consistency starts here.

2A. Define the Mascot in Writing First

Write a complete mascot brief before generating a single image. Every downstream prompt references this brief. If the brief is vague, the images will be inconsistent.

ElementWhat to decide
Character identityOne sentence: who are they and what's their relationship to the channel's topic?
Physical descriptionBuild, approximate age range, distinctive features. Be specific — "short" is not enough; "compact, rounded, chibi proportions" is.
Costume & colorsEvery garment piece with its hex color. This is what keeps the character consistent across art generators.
Signature propThe object that is always present and always recognizable: a lantern, a magnifying glass, a coin, a notebook.
Emotion rangeWhat do they express? How? (Posture, prop state, facial expression level.) Define what "happy," "curious," and "surprised" look like.
What they DON'T haveExplicit negatives for prompts — e.g., "no detailed face," "no bright non-amber colors," "no text on costume."
Appearance scheduleOpening hook, closing sign-off, or both? Scene type where mascot always appears.
📋 Vivere Example — The Little Wanderer (Wanderers of the Cosmos)

Small hooded child-explorer. Chibi proportions — head ≈ 45% of height. Deep night-blue cloak (#26405E), darker hood shadow (#1D3147), slate satchel (#3A5670), brass lantern with amber glow (#FFB23E). No facial detail at normal distance. Readable as a black silhouette. Lantern is the emotion meter — dim = mystery, bright = understanding. Never speaks; communicates through posture and lantern brightness. Appears in opening hook and closing sign-off.

📋 Vivere Example — Mimi (Mimi's Sweet Treats)

Warm, joyful young woman. Short brown pixie cut, small hoop earrings, radiant smile. Vertical red-and-white striped soda-jerk outfit, 1950s diner aesthetic. Appears in closing scene only — always interacting with a product (holding a cone, waving, serving). Vibrant pastel illustration style, soft watercolor textures.

2B. Generate the Pose Library

Generate all poses from the same base description before any video production begins. One drifting detail in the first prompt will cascade through every future image if you don't lock the library first.

PoseUsePriority
Standing idleNeutral, reference pose — use to maintain consistencyGenerate first
Hero / sign-offClosing scene, CTA, thumbnailsGenerate first
Pointing / gesturingHooks, scene transitions, questionsGenerate first
Action specific to channelServing ice cream, examining specimen, reading map, etc.Generate per episode need
Scale pose (tiny or large)Size-comparison scenesGenerate when needed

2C. Prompt Structure for Consistency

Mascot prompt formula — paste this into any image AI tool
[ART STYLE] of [CHARACTER FULL DESCRIPTION with exact hex values],
[POSE DESCRIPTION — specific action],
[BACKGROUND — on-brand setting],
[BRAND STYLE SUFFIX from brand.json],
negative: [list what NOT to include]
Consistency tips
Lock one seed if your tool supports it. Save the seed number in MASCOTS.md. Use a reference image (img2img) when regenerating poses — it anchors the character more reliably than text alone. If a pose drifts, regenerate it from the idle reference pose, not from the drifted version.

2D. Save & Document

Save all mascot images to Media Channels/Channel Name/Brand Assets/mascot/.
Naming: mascot_idle.png, mascot_hero.png, mascot_action_[description].png
Document the full generation prompt, seed, and tool version in Brand Assets/MASCOTS.md.

Stage 2 Checklist
S3
Stage 3 — Platform Accounts
These steps cannot be automated. Account creation, OAuth, and billing are always manual.
Non-delegable tasks
Only account owners should create social accounts and authorize OAuth connections. Do not share Google credentials with contractors — use YouTube channel transfer features instead.

3A. YouTube Channel

  1. 1
    Create the channel
    youtube.com → Google account avatar → Create a channel. Use the exact channel name from Stage 0.
  2. 2
    Claim the handle
    Settings → Channel → Handle. Verify the @handle is available before you finalize the channel name. Check TikTok and Instagram availability at the same time.
  3. 3
    Upload brand assets
    Profile picture: mascot or channel icon, square, 800×800 min. Banner: 2560×1440, tagline in the safe area (the center 1235×338 area is always visible).
  4. 4
    Write the About section
    2–3 sentences: what the channel is, what viewers should expect, how often. Include the owned site URL if one exists. No keyword stuffing.
  5. 5
    ⚠ Critical: Set audience to "Not made for kids"
    Settings → Channel → Advanced Settings → Audience → "No, it's not made for kids." This unlocks full monetization features. Missing this step will cost you money.
  6. 6
    Copy the YouTube Channel ID
    Settings → Channel → Advanced Settings → Channel ID (starts with UC...). Paste into channels.json → youtube_channel_id.

3B. TikTok & Instagram Accounts

Create both with the same @handle as YouTube. Switch to a Business or Creator account on Instagram (required for scheduling via third-party tools). Use the same profile picture across all three platforms.

3C. Connect to Blotato (Cross-Post Scheduler)

Blotato is the scheduling layer. Every channel's YouTube, TikTok, and Instagram accounts must be connected before any automated or scheduled posting works.

  1. 1
    Add each account in Blotato
    Blotato → Accounts → Add Account → select platform → OAuth authorize. Repeat for YouTube, TikTok, and Instagram.
  2. 2
    Record the Blotato account IDs
    After connecting, click each account in Blotato — the numeric ID appears in the account detail or URL. These IDs are what the automation uses to target the right account.
  3. 3
    Update channels.json
    Fill in the blotato block: "blotato": {"youtube": "12345", "tiktok": "12346", "instagram": "12347"}
Account ID storage
Blotato account IDs for all active channels are stored in 06_pipeline/channels.json — the authoritative registry. Never hardcode IDs in scripts. Always read from channels.json.

3D. Google Cloud / YouTube API (for auto-upload)

  1. 1
    Create a Google Cloud project
    console.cloud.google.com → New Project. One project supports ~3 channels (YouTube API quota). Create additional projects as you scale past that.
  2. 2
    Enable YouTube Data API v3
    Library → search "YouTube Data API v3" → Enable.
  3. 3
    Create OAuth credentials
    Credentials → Create Credentials → OAuth 2.0 Client ID → Desktop app → Download JSON → rename to client_secret.json → place in the explainer-engine folder.
  4. 4
    Authorize (one-time per channel)
    Run python yt_autopublish.py — a browser window opens, sign in to the channel's Google account, authorize. Token is saved automatically for future runs.
Stage 3 Checklist
S4
Stage 4 — Episode Production
Script → Voice → Art → Config → Render. The goal of the pilot is not views — it's proving the pipeline.

4A. Script the Episode

Copy 02_scripts/_script-template.md to 02_scripts/XX01-topic-slug.md. The episode ID format is: prefix + sequential number + topic slug (e.g. S001-why-ice-floats, MT01-brain-freeze).

Script quality gates — no render without all three:

  • Hook: one sentence, the surprise or the unanswered question. Must land in ≤ 3 seconds of audio.
  • Payoff: the hook's promise is fully honored before the end. No bait and switch.
  • Fact-check table: every factual claim has a source. Complete this table before you touch ElevenLabs.
Script approval gate
No voice is generated, no art is generated, and no render is run on a script that hasn't been approved and fact-checked. This is the cheapest gate — fixing a script costs $0. Fixing it after render costs time and API credits.

4B. Voice Generation

The channel's voice is permanently locked in brand.json → voice.voiceId. Always use this ID — never substitute a different voice for any episode.

Voice Audition Process (for a new channel)

  1. Go to your voice provider's library (ElevenLabs, Play.ht, Murf, or similar)
  2. Select 3 candidate voices that fit the voice register description from Stage 0
  3. Generate 30 seconds of your actual script narration — not the demo text — with each voice
  4. Listen on both speakers and earbuds. Pick the one that sounds right for the channel's world.
  5. Record the voiceId in brand.json. Lock it. Do not revisit this decision.

Voice tool options

ElevenLabs (recommended) Play.ht Murf Azure Neural TTS Resemble.AI OpenAI TTS

The key criteria for any voice tool: (1) stable API, (2) consistent voice reproduction across sessions, (3) per-character pricing that scales without shocking surprises. ElevenLabs scores best on #2 — critical for channel consistency.

4C. Image & Art Generation

Each scene in the episode needs one image. The image prompt = scene description + brand style suffix (from brand.json). The style suffix must be appended to every prompt — it's what keeps images looking like they belong to the same channel.

Image tool options

Flux Pro 1.1 via fal.ai (recommended) Midjourney Leonardo AI Adobe Firefly Ideogram 3 Google Imagen 4

Animation options (for hook scenes)

Kling v3 via fal.ai Runway Gen-4 Veo 3 (Google) Luma Dream Machine

Animated clips cost significantly more than stills ($1.50–$3+ per clip vs. $0.05 per image). Use animation selectively — the opening hook earns it. Default to stills for the explanation scenes.

4D. Music Generation

Music tool options

Stable Audio via fal.ai Suno Udio Mubert Original recorded score Licensed library (Epidemic Sound, Artlist)

For clips longer than 47 seconds, crossfade-loop the generated audio:

ffmpeg -i music_47s.mp3 -filter_complex "[0][0]acrossfade=d=5[a];[a][0]acrossfade=d=5" music.mp3

4E. Build the Episode Queue Folder

PowerShell — copy the episode template
xcopy /E /I "queue\_EPISODE-TEMPLATE" "queue\XX01"

The queue folder holds: captions.txt (one line per caption beat), config.py (scene-to-time mapping), voice.mp3, all scene images, and music.mp3.

config.py scene structure:

CONFIG = {
  "voice": "voice.mp3",
  "out": "XX01_topic.mp4",
  "wordmark_text": "Channel Name",
  "scenes": [
    {
      "image": "hook.png",
      "video": "hook.mp4",   # generated if animate:True
      "animate": True,       # True = AI video clip (costs more — use for hook only)
      "t": [0, None],
      "zoom": "slow",
      "prompt": "scene description ... [BRAND STYLE SUFFIX]"
    },
    {
      "image": "scene2.png",
      "t": [0, None],
      "zoom": "in",
      "prompt": "..."
    },
    {
      "image": "mascot.png",
      "t": [0, None],
      "zoom": "out",
      "prompt": "[MASCOT FULL DESCRIPTION], [POSE], [BRAND STYLE SUFFIX]"
    }
  ],
  "elements": []
}

4F. Pipeline Commands

Run from: 06_pipeline/explainer-engine/
# Full pipeline: voice + art + render
python produce.py XX01 --channel your-channel-slug

# Voice + art only (review before render)
python produce.py XX01 --channel your-channel-slug --no-render

# Render only (art and voice already generated)
python produce.py XX01 --channel your-channel-slug --skip-art --skip-voice

# Build caption timings (run AFTER voice is generated)
# groups = comma-separated caption counts per scene, must sum to total lines in captions.txt
python build_timing.py queue/XX01 3,4,3,4,5 --sub "your sign-off phrase" --signoff

Render output lands in review/XX01_topic.mp4. Do not move to UPLOAD READY without running the Stage 7 quality gate.

Stage 4 Checklist
S5
Stage 5 — Localization
Multi-language re-voice multiplies the catalog without re-animating. Do this before publishing.

Localization generates translated captions, dubbed audio, and separate MP4s for each language — all from the same animation. The animation is made once; the language is swapped.

Default target languages: Spanish (es) · Portuguese (pt) · Hindi (hi) · German (de)

Choose languages based on the channel's audience. A cooking channel may prioritize Spanish and Portuguese. A tech channel may prioritize German and Japanese. Don't add a language just to have it — it costs API credits and time.

Run from inside the episode queue folder (queue/XX01/)
python ../../dub.py --render

Outputs per language: translated .txt, dubbed .mp3, .srt, and final .mp4. Play each localized render before marking it UPLOAD READY.

When to localize
Don't localize a channel until it's proven (3+ videos live, retention data shows the format works). Dubbing costs real credits. Only the winners get the multi-language treatment.
S6
Stage 6 — Publish & Cross-Post
Upload once, schedule everywhere. Blotato is the cross-post layer.

6A. Fill the Metadata Template

Copy 05_publishing/_metadata-template.md to 05_publishing/XX01-metadata.md. Fill for English and each language version.

FieldGuidance
TitleWrite 3 options (A/B/C). Pick the one with the highest-intrigue hook word. Curiosity + the key topic word. Under 70 chars.
Description1–2 sentences only. Include the owned site URL. No keyword stuffing.
Hashtags#shorts + 2–3 topic tags. Keep it tight — more is not better.
Pinned commentOptional. Use to drive a follow or direct to another video.

6B. Publish via Blotato (Preferred Method)

  1. 1
    Open Blotato → New Post
    Select the channel's YouTube, TikTok, and Instagram accounts (use the Blotato IDs from channels.json — not the account names).
  2. 2
    Upload the English MP4
    From the channel's UPLOAD READY folder. Never upload from the review/ or queue/ folders.
  3. 3
    Paste metadata
    Title, description, and hashtags from the filled metadata file. Check that the right language version is matched to each upload.
  4. 4
    Schedule with platform-specific timing
    YouTube and Instagram: same day at the channel's publish_time. TikTok: typically 01:00 UTC the following day (audience timing differs). Record the schedule in channels.json.
  5. 5
    Repeat for each language
    Same video file, swapped title/description/hashtags in the target language. Schedule on a rolling weekly cadence if producing multiple language versions.

6C. Automated Cross-Post (when R2 is configured)

# Publishes/schedules all live channels automatically
python network.py daily

# Check what's scheduled and what's running low
python network.py status
python network.py runway   # flags channels with < 14 days scheduled ahead

6D. Log the Upload

Add a row to 05_publishing/upload-log.md immediately after scheduling. This is how we track what's been posted and catch gaps in the schedule.

Stage 6 Checklist
S7
Stage 7 — Quality Audit Gate
Run this on every video before it posts. This checklist is the human gate — nothing bypasses it.
This section is owner-protected
Changes to the Quality Audit Gate require approval from Joseph Sutliff. This is the section that protects channel standing, monetization eligibility, and brand reputation.

Quality

Accuracy

Compliance

Metadata

S8
Stage 8 — Analytics & The Loop
A video isn't done at upload. The numbers close the feedback loop back to ideation.

Metrics we track

Per Video
  • Hook retention (first 3 seconds) — did they stay?
  • Overall average view duration
  • CTR (click-through rate on suggested)
  • Likes-to-views ratio
  • Subscriber conversion from this video
Per Channel
  • Total subscribers · monthly views
  • Watch hours (progress toward YPP)
  • Runway (days of content scheduled ahead)
  • RPM once monetized
  • YPP eligibility status

The 48-hour read

Log first-48h metrics in upload-log.md. Hook retention > 50% = the hook worked → use a similar open next time. If retention drops sharply at a specific beat → that beat needs to move faster. Top performer each week feeds the idea backlog.

Cadence phases

PhaseCadenceGoal
Phase 13 total videosProve the format and pipeline end-to-end
Phase 23 per weekBuild algorithmic momentum
Phase 31 per dayFull scale — sustain quality at volume
Hard capNever exceed ~5/dayPlatform trust limit — mass posting triggers demotion

The repeating loop

Ideation → Script → Assets → Render → Review Gate → Publish → Analytics → Ideation

Automation (n8n, network.py) only gets added when a manual step has been proven and repeated 3+ times. Never automate what you haven't fully validated by hand.

Tool Stack & Alternatives
This section changes frequently. Update it whenever a tool is deprecated, repriced, or replaced by something better.
Tool selection rule
Prefer tools with a stable API and a free or cheap tier to test. Avoid all-in-one "magic button" platforms for the core visual output — they make every channel look identical. Use them only for low-stakes pieces where originality doesn't matter.
StageRecommendedAlternativesAvoid
Voice / TTSElevenLabsPlay.ht · Murf · OpenAI TTS · Azure NeuralGeneric platform TTS (robotic, no API)
Image generationFlux Pro 1.1 (fal.ai)Midjourney · Leonardo AI · Ideogram 3 · FireflyStock photo with AI filter
AI video / animationKling v3 (fal.ai)Runway Gen-4 · Veo 3 · Luma Dream MachineGeneric slideshow tools
Music generationStable Audio (fal.ai)Suno · Udio · Epidemic SoundUnlicensed YouTube audio library
Render / assemblymake_short.py (custom)Creatomate (template API)CapCut for production (no API)
Cross-post schedulingBlotatoBuffer · Later · PublerManual-only platforms
Automation / orchestrationn8n (self-host or cloud)Make.com · ZapierNo-code tools without webhook support
Storage / CDN (cross-post)Cloudflare R2AWS S3 · Backblaze B2Google Drive (no stable public URLs)
Scripting / ideationClaude (Sonnet)GPT-4o · Gemini 1.5 Pro
AnalyticsYouTube Studio · YouTube Analytics APISocial Blade · VidIQ
Cost Model
What it actually costs to run the network. Update this when pricing changes.

Per-video cost

ModeCostBreakdown
Stills only (default)~$0.40Voice $0.10 + 6 Flux images × $0.05 = $0.30
With animated hook~$1.90Stills cost + $1.50 Kling animation clip
Long-form~$0.80More images + longer voice generation

Fixed monthly (shared across all channels)

ServiceCost/moNotes
ElevenLabs Creator$22Shared across all channels
Blotato Business$39Unlimited accounts/posts
Cloudflare R2~$3Scales with storage — minimal at current volume
Total fixed~$64/mo

Scale projection (stills-only, daily cadence)

Live channelsMonthly costAnnual cost
4~$112~$1,344
10~$184~$2,208
30~$424~$5,088
Lessons Learned
Hard-won. Add to this section after every build. No lesson too small.
Caption word-wrap must be tested at render time, not script time
Long caption lines clip at the right edge and are invisible on mobile. The script may look fine in a text editor but render broken. Add a word-wrap helper to the caption renderer and test every line on a phone-sized preview before approving. Discovered: Mimi's Sweet Treats MT01–MT03 — retroactively fixed MT04–MT08.
Voice ID must be auditioned on your actual script — not the demo text
AI voice demos are engineered to sound good. Paste your actual narration into the audition. The same voice that sounds smooth on a demo can rush pacing or mispronounce topic-specific words in your real content. Audition 3 voices with real content before locking.
Blotato account IDs ≠ social handles — always use the numeric ID
Blotato uses internal numeric IDs to identify accounts — not the @handle. Using the wrong ID posts to the wrong account silently. Always cross-reference the ID in channels.json before any scheduled post. Keep a "which ID is which account" comment in channels.json.
"Not made for kids" must be set on the channel — not just each video
Setting it per-video is not enough. The channel-level setting overrides everything and controls monetization eligibility. Set it once on the channel in YouTube Studio → Settings → Channel → Advanced Settings and verify it stuck.
Generate the mascot pose library before starting any episode production
If you generate mascot art per-episode without a reference library, the character drifts over time — different hair, different proportions, different colors. Generate all 3–5 base poses in a single session from the same prompt, lock the seed, and reference those images for every future prompt.
The pilot video's only job is proving the pipeline — not getting views
Don't pick the pilot topic based on search volume. Pick it based on how clean the pipeline will run: a topic with 4–6 concrete visual scenes, a clear one-idea hook, and easy-to-verify facts. Use the pilot to find every bottleneck in the workflow before you're trying to maintain a schedule.

— Add new lessons here with the channel name and date discovered. A lesson without a source is less useful. —

Evolving Best Practices
The AI tool landscape changes almost daily. This section tracks what's working now — and what's emerging.
Current Best Practices (as of June 2026)
  • Stills over video for scale. AI video clips cost 30–40× more than stills. The Ken Burns slow-zoom on high-quality stills performs comparably in retention. Reserve video clips for the hook only.
  • Style suffix is a first-class asset. The brand.json style suffix is as important as the mascot design. It's what makes every image look like it belongs to the same channel. Spend real time on it and test it against 10 prompts before locking.
  • Multi-language from day one sets you up for compounding. Adding localization retroactively is painful. Build the pipeline to support it from the first episode even if you don't publish other languages immediately.
  • Hook at second 1, not second 3. Algorithms measure 3-second retention, but actual human attention decides in the first second. Design the first frame to visually communicate the hook even before audio starts.
  • Captions are not optional. 85% of Shorts are watched without sound in many contexts. No captions = half your audience reads nothing.
  • Shorter is better until 45 seconds. For Shorts, 35–45 seconds consistently outperforms 55–60 seconds on retention rate, which is the primary ranking signal.
Emerging Capabilities — Watch These
  • Veo 3 (Google): First AI video model with native audio generation — ambient sound, foley, even basic narration. Changes the animation-cost calculus if quality holds. Test before adopting at scale.
  • Consistent character generation: Both Midjourney and Flux are improving character consistency across generations. When this becomes reliable, mascot poses will no longer need hand-curated reference images.
  • YouTube multi-language audio tracks: YouTube now natively serves different audio to viewers in different regions. This is a better long-term approach than separate localized uploads — adopt when the workflow matures.
  • AI video at stills cost: Kling and Runway pricing will continue to drop. Track monthly. When the cost crosses parity with 3 Flux images, default to video for every scene.
  • Real-time analytics feedback: n8n + YouTube Analytics API can pull retention data, feed it to a script-writer, and generate the next video topic automatically. This is the next major automation layer to build.
What to Reevaluate Quarterly
  • Voice tool pricing and quality (ElevenLabs alternatives improve rapidly)
  • Image model quality at the brand's art style (Flux vs. Midjourney vs. new entrants)
  • Animation cost per second (drops every quarter)
  • Platform algorithm changes (Shorts feed behavior, TikTok ranking signals)
  • Blotato alternatives (cross-post scheduling market is competitive and changing)
New Hire Onboarding
Machine setup for a new developer on their own workstation — works on macOS and Windows. Complete everything in this section before starting any production work.
Shortcut: One-Paste Bootstrap
Don't do this manually — use the Bootstrap Prompt. A copy-paste prompt is provided that instructs Claude Code to build the entire folder structure, all template files, and your environment automatically — on Mac or Windows. Ask Joe for the MIKE-BOOTSTRAP-PROMPT.md file. Paste its contents into a new Claude Code chat and the agent handles Steps 1–7 below automatically.

The manual steps below are here so you understand what is being built and why.

Step 0 — Install Claude Code

Claude Code is the AI coding environment used for every Vivere build. Install it first — you'll use it to run the bootstrap prompt and for all future development work.

macOS — Terminal
npm install -g @anthropic-ai/claude-code
claude
Windows — PowerShell (run as Admin)
npm install -g @anthropic-ai/claude-code
claude

Running claude opens a browser for Anthropic account authentication. Create a free account at anthropic.com if needed. Alternatively, download the Claude Code desktop app from claude.ai/code — same features, no terminal launch required.

Step 1 — Install System Prerequisites

The pipeline requires Python 3.11+, ffmpeg, git, and Node. Install all four before continuing.

macOS
Homebrew + core tools
# Install Homebrew (if not installed)
/bin/bash -c "$(curl -fsSL \
https://raw.githubusercontent.com/Homebrew/\
install/HEAD/install.sh)"

# Install tools
brew install python@3.11
brew install ffmpeg
brew install git
brew install node

# Verify (open new terminal first)
python3 --version
ffmpeg -version
git --version
node --version
Windows
PowerShell — run as Administrator
# Install via winget (comes with Windows 11)
winget install Python.Python.3.11
winget install Gyan.FFmpeg
winget install Git.Git
winget install OpenJS.NodeJS

# Open a NEW PowerShell window, then verify:
python --version
ffmpeg -version
git --version
node --version
PATH issues (Windows)
If python or ffmpeg says "not recognized," the tool is not on your PATH. For Python: re-run the installer and check "Add Python to PATH." For ffmpeg: open System Properties → Advanced → Environment Variables → edit Path → add the ffmpeg \bin folder path.
PATH issues (macOS)
After brew install, open a new terminal tab before verifying. If python3 is not found, add Homebrew to your PATH: echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile then restart terminal.

Step 2 — Install VS Code & Extensions

Download from code.visualstudio.com (same installer works on both platforms). Then install these extensions (Cmd+Shift+X on Mac / Ctrl+Shift+X on Windows):

ExtensionIDWhy you need it
Pythonms-python.pythonRun pipeline scripts, inline error highlighting
Pylancems-python.vscode-pylanceSmart autocomplete for Python — catches type errors before runtime
GitLenseamodio.gitlensVisual git history, blame, branch comparison — essential for collaboration
DotENVmikestead.dotenvHighlights .env keys so they're readable; never shows secrets in plain mode
Markdown All in Oneyzhang.markdown-all-in-oneScript writing, template editing, preview pane
Thunder Clientrangav.vscode-thunder-clientTest ElevenLabs / fal.ai API calls without leaving VS Code
JSONZainChen.jsonValidates channels.json and brand.json — catches missing commas before pipeline runs

Step 3 — Project Setup

macOS — set up project directory
# Create project directory
mkdir -p ~/Developer/VivereChannels
cd ~/Developer/VivereChannels

# Get pipeline scripts from Joe (two options):
# A) Clone repo (if Joe gives you access):
git clone [REPO URL] .

# B) Unzip the scripts Joe sends you, then:
pip3 install -r requirements.txt

# Verify pipeline loads:
python3 produce.py --help
Windows — set up project directory
# Create project directory
New-Item -ItemType Directory -Force `
  -Path "C:\Users\$env:USERNAME\Desktop\Developer\VivereChannels"
Set-Location "C:\Users\$env:USERNAME\Desktop\Developer\VivereChannels"

# Get pipeline scripts from Joe (two options):
# A) Clone repo (if Joe gives you access):
git clone [REPO URL] .

# B) Unzip the scripts Joe sends, then:
pip install -r requirements.txt

# Verify pipeline loads:
python produce.py --help

Step 4 — Environment File (.env)

Copy .env.example → .env — then fill all values
# Voice generation — create your own account at elevenlabs.io
ELEVENLABS_API_KEY=

# Image + video generation — create your own account at fal.ai (add $10 credit)
FAL_KEY=

# Cross-post CDN — get from Joe (shared Cloudflare R2 account)
R2_ACCOUNT_ID=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_BUCKET_NAME=vivere-media
R2_PUBLIC_URL=

# Cross-post scheduling — get from Joe (shared Blotato account)
BLOTATO_API_KEY=

# YouTube auto-upload — set up per channel (see Stage 3 · Platform Accounts)
YOUTUBE_CLIENT_ID=
YOUTUBE_CLIENT_SECRET=

⚠ Never commit the .env file. It is in .gitignore — confirm with git status before any push. The file must exist at the project root (same level as channels.json).

Step 5 — Required External Accounts

ServicePurposeWhere to sign upCostWho creates it
ElevenLabsVoice narration (API)elevenlabs.io → Creator plan$22/moDeveloper (their own account)
fal.aiImage generation (Flux) + video (Kling)fal.ai → add $10 credit to startPay-per-use ~$0.05/imageDeveloper (their own account)
BlotatoCross-platform post schedulingblotato.com — get key from Joe$39/mo (shared)Joe shares API key
Cloudflare R2Video CDN (Blotato cross-post needs public URL)cloudflare.com — get keys from Joe~$3/mo (shared)Joe shares keys
Google CloudYouTube auto-upload via APIconsole.cloud.google.com → new project → YouTube Data API v3FreeDeveloper sets up per channel
AnthropicClaude Code (the AI dev environment)anthropic.com → create accountVaries by planDeveloper (their own account)
GitHubVersion control + pipeline scriptsgithub.com → ask Joe for repo accessFreeJoe invites developer

Step 6 — Google Cloud / YouTube API Setup

One-time setup per ~3 channels. Skip this initially — complete when ready to automate uploads.

  1. Go to console.cloud.google.com → Create new project (e.g. "Vivere Channels 1")
  2. APIs & Services → Enable APIs → search "YouTube Data API v3" → Enable
  3. Credentials → Create Credentials → OAuth 2.0 Client ID → Web application
  4. Download the JSON → rename to client_secret.json → place in 06_pipeline/explainer-engine/
  5. Add your YouTube channels as "Test users" under OAuth consent screen → Test users
  6. First run of the pipeline with --upload flag will open a browser for authorization
macOS vs Windows path difference
The pipeline reads client_secret.json by relative path from the script directory. On Mac, your home directory is /Users/yourname/. On Windows it is C:\Users\yourname\. The Python scripts use os.path so both work — just confirm the file is placed in the correct folder.

Step 7 — Required VS Code Settings (recommended)

.vscode/settings.json — add to your project (gitignored)
{
  "python.defaultInterpreterPath": "python3",
  "editor.formatOnSave": false,
  "files.exclude": { "**/__pycache__": true, "**/*.pyc": true },
  "editor.rulers": [100],
  "[markdown]": { "editor.wordWrap": "on" },
  "dotenv.enableAutocloaking": true
}

Note: On Windows, set "python.defaultInterpreterPath": "python" (without the 3). On macOS, python3 is correct.

Step 8 — Verify Full Setup

macOS — verification
python3 --version        # 3.11+
ffmpeg -version          # any version
git --version            # any version
python3 -c "import PIL; print('Pillow OK')"
python3 -c "import dotenv; print('.env OK')"
python3 -c "import fal_client; print('fal OK')"
python3 -c "import elevenlabs; print('11labs OK')"
ls .env                  # should exist (not .env.example)
Windows — verification
python --version         # 3.11+
ffmpeg -version          # any version
git --version            # any version
python -c "import PIL; print('Pillow OK')"
python -c "import dotenv; print('.env OK')"
python -c "import fal_client; print('fal OK')"
python -c "import elevenlabs; print('11labs OK')"
Test-Path .env           # should return True
New Hire Onboarding Checklist
Quick Reference

Key Files

FilePurpose
CLAUDE.mdOperating rules — always-on context for AI sessions
06_pipeline/channels.jsonMaster channel registry — IDs, Blotato accounts, status
channels/SLUG/brand.jsonVoice ID, art model, style suffix, publish dir — per channel
00_context/SLUG-brand.mdHuman-readable brand bible — load when scripting or generating
02_scripts/_script-template.mdCopy for every new short-form script
02_scripts/_script-template-longform.mdCopy for every long-form script
queue/_EPISODE-TEMPLATE/Copy for every new episode queue folder
05_publishing/_metadata-template.mdCopy for every video's publish metadata
05_publishing/publishing-checklist.mdBackup physical checklist — use Stage 7 above
05_publishing/upload-log.mdLog every upload — review weekly
Brand Assets/MASCOTS.mdMascot generation prompts, seeds, pose library — per channel

Pipeline Command Reference

All commands run from: 06_pipeline/explainer-engine/
# --- EPISODE PRODUCTION ---
# Full pipeline (voice + art + render)
python produce.py XX01 --channel your-slug

# Voice + art only (review assets before render)
python produce.py XX01 --channel your-slug --no-render

# Render only (skip generation — assets already exist)
python produce.py XX01 --channel your-slug --skip-art --skip-voice

# Force regenerate specific assets
python produce.py XX01 --channel your-slug --force-voice
python produce.py XX01 --channel your-slug --force-art

# Build caption timings (groups must sum to lines in captions.txt)
python build_timing.py queue/XX01 3,4,3,4,5 --sub "sign-off phrase" --signoff

# --- LOCALIZATION ---
# Run from inside queue/XX01/
python ../../dub.py --render

# --- NETWORK OPERATIONS ---
python network.py status      # all channels + scheduled runway
python network.py runway      # flags any channel under 14 days ahead
python network.py cost        # current cost model output
python network.py daily       # publish/schedule everything ready

# --- ADD A NEW CHANNEL ---
python network.py new-channel SLUG --name "Channel Name" --handle @handle \
  --niche "topic" --prefix XX --time 12:00 --category 27

Stage Summary

StageWhat happensWho does it
S0 Decisions8 identity questions answered in writingChannel owner + Joe
S1 Brand filesbrand.json · brand.md · channels.json · media folderDeveloper
S2 MascotDesign brief → pose library → MASCOTS.mdDeveloper / designer
S3 PlatformsYouTube · TikTok · Instagram · Blotato connectionsJoe (account owner)
S4 EpisodeScript → voice → art → config → renderDeveloper
S5 Localizedub.py → 4 language versionsDeveloper (automated)
S6 PublishMetadata → Blotato schedule → logDeveloper
S7 AuditQuality · accuracy · compliance · metadata gateJoe (must approve)
S8 Loop48h metrics → idea backlog → next episodeDeveloper + Joe