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."
python3 --version && ffmpeg -version | head -1 && git --version && node --version
/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
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:
~/Developer/VivereChannels)
MIKE-BOOTSTRAP-PROMPT.md in any text editor, copy everything between the ---START PROMPT--- and ---END PROMPT--- markers
3 Get your API keys ~15 min
| Key | Where to get it | From | Required 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.
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:
Your Pilot Episode Checklist
Track your progress from setup to first upload. Nothing goes live until Joe approves the pilot.
Define your channel — the 8 foundation decisions
Brand identity — name, palette, voice lock
Episode production — script to rendered video
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.jsonand.envonly
How examples appear in this document
- Update after every build. When a new channel goes live, note what worked and what didn't in the Lessons Learned section.
- Update when tools change. If a tool is discontinued, repriced, or replaced by something better — update the Tool Stack section immediately.
- 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).
- Log every change in the Changelog below with a date and author.
- Owner approval (Joseph Sutliff) required before any change to the Quality Audit Gate section — that section protects channel standing.
— Joseph Sutliff
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
| Lever | How it compounds |
|---|---|
| Same engine, new skin | One brand file swap reskins everything — voice, palette, art style, music. No new tooling. |
| Asset libraries | Each channel's AI art library is generated once and reused free forever. Back-catalog earns without new production cost. |
| Multi-platform distribution | One video → YouTube Shorts + TikTok + Instagram Reels + Facebook. Same file, 4× the reach. |
| Multi-language re-voice | Animation is made once. AI dubbing + re-render captions in 4–5 languages multiplies the catalog N×. |
| Long ↔ Short repurposing | Long-form cuts into Shorts. Shorts compile into long-form. One script, many products. |
| Portfolio math | Spin up channels cheaply, kill duds fast, pour effort into winners. The system absorbs failure by design. |
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.
| Question | Why it matters | Your 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. |
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.
{
"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"
}
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: setup → ready → live
1D. Create the Media Folder
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)
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.
| Element | What to decide |
|---|---|
| Character identity | One sentence: who are they and what's their relationship to the channel's topic? |
| Physical description | Build, approximate age range, distinctive features. Be specific — "short" is not enough; "compact, rounded, chibi proportions" is. |
| Costume & colors | Every garment piece with its hex color. This is what keeps the character consistent across art generators. |
| Signature prop | The object that is always present and always recognizable: a lantern, a magnifying glass, a coin, a notebook. |
| Emotion range | What do they express? How? (Posture, prop state, facial expression level.) Define what "happy," "curious," and "surprised" look like. |
| What they DON'T have | Explicit negatives for prompts — e.g., "no detailed face," "no bright non-amber colors," "no text on costume." |
| Appearance schedule | Opening hook, closing sign-off, or both? Scene type where mascot always appears. |
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.
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.
| Pose | Use | Priority |
|---|---|---|
| Standing idle | Neutral, reference pose — use to maintain consistency | Generate first |
| Hero / sign-off | Closing scene, CTA, thumbnails | Generate first |
| Pointing / gesturing | Hooks, scene transitions, questions | Generate first |
| Action specific to channel | Serving ice cream, examining specimen, reading map, etc. | Generate per episode need |
| Scale pose (tiny or large) | Size-comparison scenes | Generate when needed |
2C. Prompt Structure for Consistency
[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]
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.
3A. YouTube Channel
- 1Create the channelyoutube.com → Google account avatar → Create a channel. Use the exact channel name from Stage 0.
- 2Claim the handleSettings → Channel → Handle. Verify the @handle is available before you finalize the channel name. Check TikTok and Instagram availability at the same time.
- 3Upload brand assetsProfile 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).
- 4Write the About section2–3 sentences: what the channel is, what viewers should expect, how often. Include the owned site URL if one exists. No keyword stuffing.
- 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.
- 6Copy the YouTube Channel IDSettings → 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.
- 1Add each account in BlotatoBlotato → Accounts → Add Account → select platform → OAuth authorize. Repeat for YouTube, TikTok, and Instagram.
- 2Record the Blotato account IDsAfter 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.
- 3Update channels.jsonFill in the blotato block:
"blotato": {"youtube": "12345", "tiktok": "12346", "instagram": "12347"}
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)
- 1Create a Google Cloud projectconsole.cloud.google.com → New Project. One project supports ~3 channels (YouTube API quota). Create additional projects as you scale past that.
- 2Enable YouTube Data API v3Library → search "YouTube Data API v3" → Enable.
- 3Create OAuth credentialsCredentials → Create Credentials → OAuth 2.0 Client ID → Desktop app → Download JSON → rename to client_secret.json → place in the explainer-engine folder.
- 4Authorize (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.
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.
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)
- Go to your voice provider's library (ElevenLabs, Play.ht, Murf, or similar)
- Select 3 candidate voices that fit the voice register description from Stage 0
- Generate 30 seconds of your actual script narration — not the demo text — with each voice
- Listen on both speakers and earbuds. Pick the one that sounds right for the channel's world.
- Record the voiceId in brand.json. Lock it. Do not revisit this decision.
Voice tool options
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
Animation options (for hook scenes)
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
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
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
# 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.
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.
python ../../dub.py --render
Outputs per language: translated .txt, dubbed .mp3, .srt, and final .mp4. Play each localized render before marking it UPLOAD READY.
6A. Fill the Metadata Template
Copy 05_publishing/_metadata-template.md to 05_publishing/XX01-metadata.md. Fill for English and each language version.
| Field | Guidance |
|---|---|
| Title | Write 3 options (A/B/C). Pick the one with the highest-intrigue hook word. Curiosity + the key topic word. Under 70 chars. |
| Description | 1–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 comment | Optional. Use to drive a follow or direct to another video. |
6B. Publish via Blotato (Preferred Method)
- 1Open Blotato → New PostSelect the channel's YouTube, TikTok, and Instagram accounts (use the Blotato IDs from channels.json — not the account names).
- 2Upload the English MP4From the channel's UPLOAD READY folder. Never upload from the review/ or queue/ folders.
- 3Paste metadataTitle, description, and hashtags from the filled metadata file. Check that the right language version is matched to each upload.
- 4Schedule with platform-specific timingYouTube 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.
- 5Repeat for each languageSame 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.
Quality
Accuracy
Compliance
Metadata
Metrics we track
- 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
- 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
| Phase | Cadence | Goal |
|---|---|---|
| Phase 1 | 3 total videos | Prove the format and pipeline end-to-end |
| Phase 2 | 3 per week | Build algorithmic momentum |
| Phase 3 | 1 per day | Full scale — sustain quality at volume |
| Hard cap | Never exceed ~5/day | Platform trust limit — mass posting triggers demotion |
The repeating loop
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.
| Stage | Recommended | Alternatives | Avoid |
|---|---|---|---|
| Voice / TTS | ElevenLabs | Play.ht · Murf · OpenAI TTS · Azure Neural | Generic platform TTS (robotic, no API) |
| Image generation | Flux Pro 1.1 (fal.ai) | Midjourney · Leonardo AI · Ideogram 3 · Firefly | Stock photo with AI filter |
| AI video / animation | Kling v3 (fal.ai) | Runway Gen-4 · Veo 3 · Luma Dream Machine | Generic slideshow tools |
| Music generation | Stable Audio (fal.ai) | Suno · Udio · Epidemic Sound | Unlicensed YouTube audio library |
| Render / assembly | make_short.py (custom) | Creatomate (template API) | CapCut for production (no API) |
| Cross-post scheduling | Blotato | Buffer · Later · Publer | Manual-only platforms |
| Automation / orchestration | n8n (self-host or cloud) | Make.com · Zapier | No-code tools without webhook support |
| Storage / CDN (cross-post) | Cloudflare R2 | AWS S3 · Backblaze B2 | Google Drive (no stable public URLs) |
| Scripting / ideation | Claude (Sonnet) | GPT-4o · Gemini 1.5 Pro | — |
| Analytics | YouTube Studio · YouTube Analytics API | Social Blade · VidIQ | — |
Per-video cost
| Mode | Cost | Breakdown |
|---|---|---|
| Stills only (default) | ~$0.40 | Voice $0.10 + 6 Flux images × $0.05 = $0.30 |
| With animated hook | ~$1.90 | Stills cost + $1.50 Kling animation clip |
| Long-form | ~$0.80 | More images + longer voice generation |
Fixed monthly (shared across all channels)
| Service | Cost/mo | Notes |
|---|---|---|
| ElevenLabs Creator | $22 | Shared across all channels |
| Blotato Business | $39 | Unlimited accounts/posts |
| Cloudflare R2 | ~$3 | Scales with storage — minimal at current volume |
| Total fixed | ~$64/mo |
Scale projection (stills-only, daily cadence)
| Live channels | Monthly cost | Annual cost |
|---|---|---|
| 4 | ~$112 | ~$1,344 |
| 10 | ~$184 | ~$2,208 |
| 30 | ~$424 | ~$5,088 |
— Add new lessons here with the channel name and date discovered. A lesson without a source is less useful. —
- 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.
- 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.
- 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)
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.
npm install -g @anthropic-ai/claude-code claude
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.
# 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
# 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
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.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):
| Extension | ID | Why you need it |
|---|---|---|
| Python | ms-python.python | Run pipeline scripts, inline error highlighting |
| Pylance | ms-python.vscode-pylance | Smart autocomplete for Python — catches type errors before runtime |
| GitLens | eamodio.gitlens | Visual git history, blame, branch comparison — essential for collaboration |
| DotENV | mikestead.dotenv | Highlights .env keys so they're readable; never shows secrets in plain mode |
| Markdown All in One | yzhang.markdown-all-in-one | Script writing, template editing, preview pane |
| Thunder Client | rangav.vscode-thunder-client | Test ElevenLabs / fal.ai API calls without leaving VS Code |
| JSON | ZainChen.json | Validates channels.json and brand.json — catches missing commas before pipeline runs |
Step 3 — Project Setup
# 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
# 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)
# 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
| Service | Purpose | Where to sign up | Cost | Who creates it |
|---|---|---|---|---|
| ElevenLabs | Voice narration (API) | elevenlabs.io → Creator plan | $22/mo | Developer (their own account) |
| fal.ai | Image generation (Flux) + video (Kling) | fal.ai → add $10 credit to start | Pay-per-use ~$0.05/image | Developer (their own account) |
| Blotato | Cross-platform post scheduling | blotato.com — get key from Joe | $39/mo (shared) | Joe shares API key |
| Cloudflare R2 | Video CDN (Blotato cross-post needs public URL) | cloudflare.com — get keys from Joe | ~$3/mo (shared) | Joe shares keys |
| Google Cloud | YouTube auto-upload via API | console.cloud.google.com → new project → YouTube Data API v3 | Free | Developer sets up per channel |
| Anthropic | Claude Code (the AI dev environment) | anthropic.com → create account | Varies by plan | Developer (their own account) |
| GitHub | Version control + pipeline scripts | github.com → ask Joe for repo access | Free | Joe invites developer |
Step 6 — Google Cloud / YouTube API Setup
One-time setup per ~3 channels. Skip this initially — complete when ready to automate uploads.
- Go to console.cloud.google.com → Create new project (e.g. "Vivere Channels 1")
- APIs & Services → Enable APIs → search "YouTube Data API v3" → Enable
- Credentials → Create Credentials → OAuth 2.0 Client ID → Web application
- Download the JSON → rename to
client_secret.json→ place in06_pipeline/explainer-engine/ - Add your YouTube channels as "Test users" under OAuth consent screen → Test users
- First run of the pipeline with
--uploadflag will open a browser for authorization
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)
{
"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
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)
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
Key Files
| File | Purpose |
|---|---|
CLAUDE.md | Operating rules — always-on context for AI sessions |
06_pipeline/channels.json | Master channel registry — IDs, Blotato accounts, status |
channels/SLUG/brand.json | Voice ID, art model, style suffix, publish dir — per channel |
00_context/SLUG-brand.md | Human-readable brand bible — load when scripting or generating |
02_scripts/_script-template.md | Copy for every new short-form script |
02_scripts/_script-template-longform.md | Copy for every long-form script |
queue/_EPISODE-TEMPLATE/ | Copy for every new episode queue folder |
05_publishing/_metadata-template.md | Copy for every video's publish metadata |
05_publishing/publishing-checklist.md | Backup physical checklist — use Stage 7 above |
05_publishing/upload-log.md | Log every upload — review weekly |
Brand Assets/MASCOTS.md | Mascot generation prompts, seeds, pose library — per channel |
Pipeline Command Reference
# --- 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
| Stage | What happens | Who does it |
|---|---|---|
| S0 Decisions | 8 identity questions answered in writing | Channel owner + Joe |
| S1 Brand files | brand.json · brand.md · channels.json · media folder | Developer |
| S2 Mascot | Design brief → pose library → MASCOTS.md | Developer / designer |
| S3 Platforms | YouTube · TikTok · Instagram · Blotato connections | Joe (account owner) |
| S4 Episode | Script → voice → art → config → render | Developer |
| S5 Localize | dub.py → 4 language versions | Developer (automated) |
| S6 Publish | Metadata → Blotato schedule → log | Developer |
| S7 Audit | Quality · accuracy · compliance · metadata gate | Joe (must approve) |
| S8 Loop | 48h metrics → idea backlog → next episode | Developer + Joe |