ChannelHelm Docs Docs index Operator guide Roadmap App
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.

typecheck + lint + 402 tests + build clean

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.