ToonKit Shorts: setup
Everything here is $0. Rendering needs no accounts at all. Uploading needs the user's own Google account.
1. Render stack (no accounts)
- Need:
python33.10+,ffmpegwith libass (brew install ffmpeg/sudo apt install ffmpeg), Node 18+ only for uploads. - From the plugin root:
./setup.sh(orSKIP_YTKIT=1 ./setup.shfor render-only). It createstoonkit/.venv, installstoonkit/requirements.txt, downloads every Piper voice named intoonkit/look.yamlandtoonkit/looks/*.yamlintotoonkit/voices/(from huggingface.co/rhasspy/piper-voices), caches faster-whispersmall.en,npm installs YtKit, and createstoonkit/look.yamlfrom the mort-and-blitz preset if missing. - Verify:
./test.sh(renders the sample episode offline, then a DRY_RUN upload). It must printALL TESTS PASSED.
2. YouTube uploads (optional, the user's own Google account)
Walk the user through this in their browser. Never ask them to paste secrets into chat.
- https://console.cloud.google.com → create a project (e.g.
ytkit). "No organization" is fine for personal accounts. - APIs & Services → Library → enable YouTube Data API v3.
- Google Auth Platform (OAuth consent screen) → Branding: fill ALL of App name, User support email, Application home page, Privacy policy link (any public page they own, e.g. their GitHub profile/repo, works for a personal app). Publishing is blocked until these are filled.
- Audience → User type External → click PUBLISH APP (move to In production). This is critical: while the app is in Testing, Google refresh tokens EXPIRE AFTER 7 DAYS and the daily upload silently breaks every week. The "unverified app" warning is expected for a personal app; no verification is needed for your own channel.
- Clients → Create client → Desktop app → download JSON → save as
~/.ytkit/client_secret.json(never commit it). cd ytkit && npx tsx src/cli.ts auth→ browser opens → on "Google hasn't verified this app" click Advanced → Go to (app name) → pick the right channel (brand channels show up separately) → allow all scopes. Token lands in~/.ytkit/token.json.npx tsx src/cli.ts whoamimust print the channel title.- Optional playlist:
npx tsx src/cli.ts playlist ensure "My Show"then setupload.playlistin look.yaml.
Troubleshooting: invalid_grant = token expired/revoked (usually the app was still in Testing): publish the app, re-run auth.
Custom thumbnails need a phone-verified channel; thumbnail set exit 3 means "not eligible yet" and the upload is still fine.