File size: 3,143 Bytes
00d3a75
 
 
 
 
 
 
03940ee
 
00d3a75
03940ee
00d3a75
 
 
 
 
 
 
03940ee
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3101940
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# ===============================================
# IDO Backend Environment Variables
# ===============================================
# Copy this file to .env and fill in your values
# DO NOT commit .env to version control
# ===============================================

# CORS allowed origins (comma-separated) - the frontend origin(s). Keep in sync with
# the "Authorized JavaScript origins" on your Google OAuth client.
# Example: http://localhost:3000,https://your-frontend.vercel.app
ALLOWED_ORIGINS=http://localhost:3000,http://127.0.0.1:3000

# Storage path for temporary files (optional)
STORAGE_PATH=./storage

# Future: ML Model settings
# SPACY_MODEL=en_core_web_sm
# ENABLE_TOPIC_MODELING=true

# Google Data Portability (enables the "Connect Google" flow)
#
# TWO OAuth clients are required, because Google forbids mixing data-portability scopes
# with any other scope in one request (and each client auto-includes its previously
# granted scopes). Create two Web application clients at
# https://console.cloud.google.com/apis/credentials and add your frontend origin as an
# authorised JavaScript origin on BOTH. Only the client IDs are needed -- the browser
# holds the tokens, the backend never does, so there are no client secrets here.
#
# 1. GOOGLE_CLIENT_ID        - authorises ONLY the Data Portability scope
#                              (.../auth/dataportability.myactivity.youtube), used for the
#                              export initiate/poll/download.
# 2. GOOGLE_OAUTH_CLIENT_ID  - authorises openid + .../auth/youtube.readonly, used for
#                              identity (saving Wrappeds) and subscriptions.
GOOGLE_CLIENT_ID=
GOOGLE_OAUTH_CLIENT_ID=

# Storage for saved Wrapped cards (only generated cards, never uploaded data)
# REQUIRED - Supabase (Postgres) only, no SQLite fallback. Used identically in local
# development and production.
#
# Supabase: Project Settings -> Database -> Connection string -> URI.
# Use the "Transaction pooler" URI (port 6543) for containers/serverless; the code
# already disables prepared statements so pgbouncer is happy.
# Remember to URL-encode any special characters in the password.
#
# For tests that exercise the store, set TEST_DATABASE_URL (falls back to DATABASE_URL).
# Only fixed test-user rows are ever cleaned; real users are untouched.
DATABASE_URL=postgresql://postgres.<ref>:<password>@aws-0-<region>.pooler.supabase.com:6543/postgres?sslmode=require

# YouTube Data API v3 key (optional).
# Enables real names for taste worlds and the niche_meter card.
# Quota: channels.list costs 1 unit per 50 channels, against 10,000/day.
# Without it, taste worlds fall back to channel-name labels and niche_meter is hidden.
YOUTUBE_API_KEY=

# OpenRouter API key (optional) for naming taste worlds.
# Only used when the user ticks the consent box on the upload screen.
# Sends at most 5 channel names per cluster plus their YouTube topic categories -
# never watch history, timestamps, video titles, or anything identifying.
# Without it, taste worlds are labelled with their own top channel names.
OPENROUTER_API_KEY=
# OPENROUTER_MODEL=openrouter/free