Development summary
▶ YouTube Command Center shipped.
YouTube Studio's feature surface, brought into ChannelHelm as a per-brand command center at /youtube — a live video manager, deep analytics with audience-retention curves, a comments inbox, and captions and playlists. Full build: all four areas, write access, monetization, dedicated surface. Local-first throughout.
Verification
pnpm typecheck # tsc --noEmit — clean pnpm lint # biome — clean pnpm test # 402 passed (11 new youtube-format tests) pnpm build # production build — clean; /youtube (6.5 kB) + all tabs emitted pnpm db:migrate # migration 0032 applied + all 5 youtube_* tables verified
Live smoke: the
youtube_sync_videos worker executes, builds the OAuth client, calls the YouTube Data API, and correctly surfaces invalid_grant for the connected brand whose pre-scope grant expired — exactly the reconnect the banner prompts. The path is verified end-to-end up to the API; data population needs the operator's one-time reconnect.What shipped
Foundation
- force-ssl + monetary scopes; per-capability reconnect banner
- 5 synced tables (migration 0032)
- Extended youtube.ts integration (read + write)
- 5 sync workers, quota-aware, bucketed cadences
Manage
- Content: live edit + bulk edit
- Comments: 3-bucket inbox, reply + moderate
- Captions: upload + generate-from-transcript
- Playlists: CRUD + membership
Understand
- Analytics: traffic, geography, devices, demographics
- Per-video audience-retention curve (inline SVG)
- Revenue when monetized
- Dashboard channel home
Honest about the API
Heart/pin comments, end screens/cards, community posts, and Content-ID aren't in YouTube's public API — the Comments tab deep-links to Studio for heart/pin and the rest are out of scope. True new-vs-returning isn't a public dimension, so the Audience tab uses subscribed-vs-not as a labeled proxy. Every number on every screen is a real report row; unavailable capabilities are labeled, not hidden. Full details: operator guide.
Data model
Migration
0032: youtube_videos (ytv), youtube_analytics (yta), youtube_comments (ytc), youtube_captions (ytk), youtube_playlists (ytp). New job kinds: youtube_sync_videos/analytics/comments/captions/playlists. Scalar metrics still flow into signals; only dimensional data lives in youtube_analytics.