Keys.
What each one switches on, and who pays.
Every key is the operator's own account with the provider: usage is billed to you, not included in the purchase. Enter keys in the console under Settings, Integrations. Most fields have a "Test" button; saved keys are encrypted with ADMIN_SECRET_KEY and never shown again. You can also pin some keys in .env (the variable names are below); the console then shows that field locked. System health lists every key that is missing and what it switches on.
01The keys
| Key | .env variable | What it switches on | Where to get it |
|---|---|---|---|
| Anthropic API key | ANTHROPIC_API_KEY | The whole AI side: Idea Lab, research with web search, outline and script, fact check, the chapter storyboards, titles, description, thumbnails, Shorts picks, language versions, chat edits. Without it people can only edit storyboards by hand. | console.anthropic.com, API keys |
| ElevenLabs API key | ELEVENLABS_API_KEY | Narration, and captions timed to the spoken words. | elevenlabs.io, Developers, API keys (needs text-to-speech and voices read) |
| Pexels API key | PEXELS_API_KEY | Stock video and photos for footage scenes. Free. | pexels.com/api |
| Pixabay API key | (console only) | More stock video and photos. Free. | pixabay.com/api/docs (shown when signed in) |
| Google OAuth client ID and secret | (console only) | Connecting YouTube channels and publishing. See Publishing to YouTube. | Google Cloud console, APIs & Services, Credentials |
| Stripe secret key | STRIPE_SECRET_KEY | Selling plans and credit packs. Only needed when Settings, Customer billing, "Sell plans and credit packs" is on. | Stripe, Developers, API keys |
| Stripe webhook signing secret | STRIPE_WEBHOOK_SECRET | Recording payments. See Stripe webhook. | Stripe, Developers, Webhooks |
| Resend API key | RESEND_API_KEY | E-mail: invites, password resets, "your episode is ready for review", review comments. Also set the sender under Settings, E-mail. Without it you copy invite links by hand. | resend.com, API Keys (verify your sending domain) |
Wikimedia Commons footage needs no key; turn it on or off under Settings, Channels and publishing.
02Narration without ElevenLabs: the built-in local voice (optional)
Instead of ElevenLabs, the server can narrate with a local voice model, Kokoro-82M, on its own CPU. It needs no account and no key, and costs nothing per character. Know its limits before you offer it:
- English only (American and British voices). A storyboard in any other language is refused with a message that names the language; use ElevenLabs for those.
- Slower. It runs on the same CPU as the renders. On a busy server, recording takes longer than the narration lasts.
- Word timing is estimated from the recorded sentences, so captions follow the words a little less exactly than with ElevenLabs.
Not installed by default. It is an add-on you choose to install, because of the licences of what it brings:
- the model weights (Kokoro-82M) and
kokoro-jsare Apache-2.0; - it phonemizes text with the
phonemizernpm package, which contains eSpeak NG compiled to WebAssembly.
eSpeak NG is licensed GPL-3.0. Read both licences and decide whether that fits how you run and distribute your server before you install it.
- the model weights (Kokoro-82M) and
On Windows: the server is meant to run on Linux. On a Windows PC, run the commands on this page inside WSL 2 with Ubuntu (in PowerShell: wsl --install -d Ubuntu), or use Docker Desktop with its WSL 2 backend.
To install it, on the server in the studio's folder:
npm run voice:local
With Docker, build the image with docker build --build-arg LOCAL_VOICE=1 -t channelsmith .. The model (about 100 MB) downloads from Hugging Face on first use into DATA_DIR/models. Then choose Settings, Voice, Voice engine, "Built-in local voice", or set VOICE_ENGINE=local in .env. System health shows whether it is installed and downloaded. npm ci (for example during an update) removes it again: run npm run voice:local after every update.
03Who pays for what
- Anthropic bills you for every AI call, and web search is billed per search on top of tokens. A long episode makes many calls: research, outline, script, fact check and one storyboard call per chapter. The console's AI usage page lists each call with its model and tokens, so you can set your credit prices from real numbers. Settings, Channels and publishing, "Web searches per research run" caps the searches. Settings, AI director, "Workspaces may bring their own Anthropic key" lets a workspace pay its own AI usage.
- ElevenLabs bills you per character of narration. A 10-minute script is roughly 8,000 to 9,000 characters. Clips are cached per scene, so re-rendering after an edit only records the scenes whose words changed.
- Pexels, Pixabay, Wikimedia Commons: free, within their terms and rate limits.
- Google: the YouTube Data API is free within the project's daily quota (see Publishing to YouTube).
- You charge your customers in credits (see Plans and credits) and Stripe pays you.
04The secret key itself
ADMIN_SECRET_KEY (64 hex characters, openssl rand -hex 32) encrypts the saved keys and every connected YouTube channel's sign-in. If it is not set, the server generates one into DATA_DIR/.admin-secret-key and warns in the log. Either way: back it up. A restored backup with a different key starts fine, but every saved API key has to be entered again and every YouTube channel connected again.