YouTube account diagnostics

Google OAuth for YouTube taste signals.

MULOME uses Google OAuth for YouTube account access. The prototype requests read-only scopes and falls back to mock data whenever setup or API calls are unavailable.

Environment

Configured

OAuth status

YouTube OAuth ready

Taste mode

mocked

Selected scopes

https://www.googleapis.com/auth/youtube.readonly

Account fetch status

Mock profile
Mock playlists
Mock subscriptions
Connect YouTube to use private account signals.

YouTube profile

Mock MULOME YouTube Viewer
Prototype account profile for YouTube taste signals.

Mock fallback status

Mock data is powering this view.
Liked videos remain a placeholder in this prototype.

Connection actions

Google handles sign in, passkeys, 2FA, and account selection.

Next production hardening steps

Move tokens from prototype cookies to encrypted database storage.
Add refresh token rotation and revoke tokens when users disconnect.
Track consented scopes per user and avoid write permissions.
Add quota monitoring, retry handling, and cache account results.
Add a privacy panel for exported, deleted, and disconnected data.

Taste API preview

Endpoint: /api/youtube/taste

{
  "mode": "mocked",
  "statusLabel": "YouTube mock taste signals",
  "configured": true,
  "connected": false,
  "missing": [],
  "selectedScopes": [
    "https://www.googleapis.com/auth/youtube.readonly"
  ],
  "fallbackReason": "Connect YouTube to use private account signals.",
  "channelProfile": {
    "id": "mock-channel",
    "title": "Mock MULOME YouTube Viewer",
    "description": "Prototype account profile for YouTube taste signals."
  },
  "playlists": [
    {
      "id": "anime-lore",
      "title": "Anime lore queue",
      "itemCount": 28
    },
    {
      "id": "action-choreo",
      "title": "Action choreography",
      "itemCount": 16
    },
    {
      "id": "soundtrack-videos",
      "title": "Soundtrack videos",
      "itemCount": 34
    },
    {
      "id": "trailer-watchlist",
      "title": "Trailer watchlist",
      "itemCount": 21
    }
  ],
  "subscriptions": [
    {
      "id": "anime-creators",
      "title": "Anime lore creators"
    },
    {
      "id": "film-essays",
      "title": "Film essay channels"
    },
    {
      "id": "action-design",
      "title": "Action design breakdowns"
    },
    {
      "id": "soundtrack-archives",
      "title": "Soundtrack archives"
    }
  ],
  "likedVideosPlaceholder": {
    "id": "liked-videos-placeholder",
    "title": "Liked videos placeholder",
    "description": "Google does not expose all liked video context in this prototype.",
    "itemCount": 12
  },
  "inferredInterests": [
    "anime lore",
    "fight choreography",
    "trailers",
    "soundtrack videos",
    "creator interviews"
  ],
  "recommendedSearchSignals": [
    "Naruto lore explained",
    "John Wick fight breakdown",
    "Cyberpunk ending explained",
    "dark crime interviews",
    "soundtrack video essays"
  ],
  "profileStatus": "Mock profile",
  "playlistsStatus": "Mock playlists",
  "subscriptionsStatus": "Mock subscriptions"
}