# Copy to .env and fill in. Backend reads these with the OPE_ prefix. # self_host | hosted. self_host enables single-user conveniences (e.g. header paste). OPE_DEPLOYMENT_MODE=self_host OPE_FRONTEND_URL=http://localhost:8080 # Encryption key for stored provider credentials. CHANGE THIS. OPE_SECRET_KEY=change-me-please # Public playlist sharing is OFF while OPE_PUBLIC_BASE_URL is empty. # When enabling it, also set a separate 32+ character owner access token. The # private owner API/UI then requires an encrypted HttpOnly owner session. OPE_PUBLIC_BASE_URL= OPE_OWNER_ACCESS_TOKEN= OPE_OWNER_SESSION_TTL_S=43200 # Public snapshot and recipient abuse/privacy limits. OPE_SHARE_RECIPIENT_SESSION_TTL_S=86400 OPE_SHARE_RECIPIENT_CREDENTIAL_RETENTION_S=86400 OPE_SHARE_MAX_TRACKS=1000 OPE_SHARE_MAX_SNAPSHOT_BYTES=2000000 OPE_SHARE_MAX_DOWNLOAD_BYTES=4000000 OPE_SHARE_MAX_EXPIRY_DAYS=365 OPE_SHARE_RATE_LIMIT_CAPACITY=60 OPE_SHARE_RATE_LIMIT_REFILL_PER_S=1 OPE_SHARE_IMPORT_MAX_CONCURRENT_JOBS=3 OPE_SHARE_IMPORT_DAILY_TRACK_LIMIT=1000 OPE_SHARE_ARTWORK_HOSTS=i.scdn.co,mosaic.scdn.co,i.ytimg.com,lh3.googleusercontent.com,resources.tidal.com,mzstatic.com # Youtube Music OAuth app (https://console.cloud.google.com/apis/credentials) # Important: leave empty until the app is approved for prod use, this makes the app use # a dev token from the header paste flow instead of the OAuth flow. # This is a temporary measure until the app is approved. OPE_YTMUSIC_ENABLED=true OPE_YOUTUBE_OFFICIAL_ENABLED=false OPE_YTMUSIC_CLIENT_ID= OPE_YTMUSIC_CLIENT_SECRET= # Used to match reconnected YouTube Music accounts by Google email when available. OPE_YTMUSIC_USERINFO_URL=https://www.googleapis.com/oauth2/v2/userinfo # Matching OPE_REVIEW_CONFIDENCE_THRESHOLD=0.8 OPE_ENABLE_SHARED_GRAPH=false # Conservative migration guardrails; the UI can override after a warning. OPE_MIGRATION_SAFE_MAX_PLAYLISTS_PER_JOB=1 OPE_MIGRATION_SAFE_MAX_TRACKS_PER_JOB=50 OPE_MIGRATION_SAFE_DAILY_TRACKS=250 OPE_MIGRATION_SAFE_MIN_JOB_GAP_S=120 # ARQ worker timeout for one migration job. Large Spotify playlists can exceed 5 minutes. OPE_MIGRATION_WORKER_JOB_TIMEOUT_S=3600 # Item-level history retention. 0 keeps detail indefinitely; summaries are always retained. OPE_MIGRATION_HISTORY_RETENTION_DAYS=90 # Hourly cleanup and report streaming batch sizes. OPE_MIGRATION_HISTORY_CLEANUP_BATCH_SIZE=100 OPE_MIGRATION_REPORT_BATCH_SIZE=250 # Portable exports. Track count is not capped; output streams through temporary files. OPE_EXPORT_MAX_PLAYLISTS=100 # Playlist Organizer worker pacing and bounded rate-limit retries. OPE_ORGANIZER_WORKER_JOB_TIMEOUT_S=3600 OPE_ORGANIZER_RATE_LIMIT_CAPACITY=2 OPE_ORGANIZER_RATE_LIMIT_REFILL_PER_S=1 OPE_ORGANIZER_RETRY_ATTEMPTS=3 OPE_ORGANIZER_RETRY_MAX_DELAY_S=30 # Scheduled playlist sync. Cadence values are minutes. OPE_SYNC_MIN_CADENCE_MINUTES=5 OPE_SYNC_MAX_CADENCE_MINUTES=10080 OPE_SYNC_RETRY_DELAY_S=300 # Must remain longer than the worker job timeout so a live run is never reaped. OPE_SYNC_STALE_RUN_AFTER_S=3900 OPE_SYNC_SCHEDULER_BATCH_SIZE=20 # Local playlist-file imports. Raw uploads are parsed from a bounded request stream # and closed immediately; only the normalized preview is retained temporarily. OPE_LOCAL_IMPORT_MAX_BYTES=10485760 OPE_LOCAL_IMPORT_MAX_PLAYLISTS=100 OPE_LOCAL_IMPORT_MAX_TRACKS=5000 OPE_LOCAL_IMPORT_MAX_ISSUES=200 OPE_LOCAL_IMPORT_SPOOL_MEMORY_BYTES=1048576 OPE_LOCAL_IMPORT_RETENTION_S=3600 OPE_LOCAL_IMPORT_QUEUED_RETENTION_S=7200 OPE_LOCAL_IMPORT_FAILED_RETENTION_S=900 # Public URL and pasted-text imports OPE_IMPORT_MAX_TEXT_BYTES=262144 OPE_IMPORT_MAX_ITEMS=1000 OPE_IMPORT_MAX_LINE_CHARS=2000 OPE_IMPORT_MAX_FIELD_CHARS=500 OPE_IMPORT_MAX_URL_CHARS=2048 OPE_IMPORT_MAX_RESPONSE_BYTES=2000000 OPE_IMPORT_MAX_REDIRECTS=3 OPE_IMPORT_HTTP_TIMEOUT_S=10 # Comma-separated public HTTPS hosts allowed to serve Open Playlist Engine shares. # A public HTTPS OPE_FRONTEND_URL host is included automatically. OPE_IMPORT_OPEN_PLAYLIST_HOSTS= # Local metadata-only library snapshots. Docker Compose overrides the directory to # /data/snapshots and mounts the shared `snapshots` named volume into backend + worker. OPE_SNAPSHOT_DIR=./data/snapshots OPE_SNAPSHOT_DEFAULT_RETENTION_COUNT=10 OPE_SNAPSHOT_DEFAULT_RETENTION_DAYS=90 # Maximum compressed import size (1 GiB) and verified uncompressed JSON size (4 GiB). OPE_SNAPSHOT_IMPORT_MAX_BYTES=1073741824 OPE_SNAPSHOT_MAX_UNCOMPRESSED_BYTES=4294967296 OPE_SNAPSHOT_MAX_MANIFEST_BYTES=67108864 OPE_SNAPSHOT_MAX_RECORD_BYTES=2097152 OPE_SNAPSHOT_MAX_COMPRESSION_RATIO=200 # Pending/running snapshots older than this are failed and their orphan files reconciled. OPE_SNAPSHOT_STALE_AFTER_S=86400 OPE_SNAPSHOT_WORKER_JOB_TIMEOUT_S=3600 # Playlist generator. It stays disabled until both base URL and model are set. # openai_compatible is the local-first default; copilot_sdk is optional. OPE_GENERATOR_BACKEND=openai_compatible OPE_GENERATOR_OPENAI_BASE_URL= OPE_GENERATOR_OPENAI_API_KEY= OPE_GENERATOR_COPILOT_GITHUB_TOKEN= OPE_GENERATOR_MODEL= OPE_GENERATOR_TIMEOUT_S=60 OPE_GENERATOR_MAX_PROMPT_CHARS=2000 OPE_GENERATOR_MAX_OUTPUT_CHARS=32000 OPE_GENERATOR_MAX_OUTPUT_TOKENS=4096 OPE_GENERATOR_MAX_TRACKS=25 # Spotify OAuth app (https://developer.spotify.com/dashboard) OPE_SPOTIFY_CLIENT_ID= OPE_SPOTIFY_CLIENT_SECRET= # When sharing publicly, this must use the same public origin as OPE_PUBLIC_BASE_URL. OPE_SPOTIFY_REDIRECT_URI=http://127.0.0.1:8000/api/auth/spotify/callback # Tidal OAuth app (https://developer.tidal.com) OPE_TIDAL_CLIENT_ID= OPE_TIDAL_CLIENT_SECRET= # When sharing publicly, this must use the same public origin as OPE_PUBLIC_BASE_URL. OPE_TIDAL_REDIRECT_URI=http://127.0.0.1:8000/api/auth/tidal/callback # Apple MusicKit (https://developer.apple.com/help/account/capabilities/create-a-media-identifier-and-private-key/) # Apple Music does not use OAuth client ID/client secret credentials. OPE_APPLE_MUSIC_TEAM_ID= OPE_APPLE_MUSIC_KEY_ID= # Prefer a path for local development, or use an escaped PEM value in OPE_APPLE_MUSIC_PRIVATE_KEY. OPE_APPLE_MUSIC_PRIVATE_KEY_PATH= OPE_APPLE_MUSIC_PRIVATE_KEY= OPE_APPLE_MUSIC_TOKEN_TTL_S=86400