FLASK_ENV=production SECRET_KEY=change-me-please # Public canonical domain, used in SEO structured data (no trailing slash) SITE_URL=https://wrapped.devmatei.com # ListenBrainz / MusicBrainz endpoints and user agents LISTENBRAINZ_API=https://api.listenbrainz.org/1 MUSICBRAINZ_API=https://musicbrainz.org/ws/2 COVER_ART_API=https://coverartarchive.org/release LISTENBRAINZ_USER_AGENT=wrapped-listenbrainz/1.0 (+https://github.com/devmatei/listenbrainz-wrapped) MUSICBRAINZ_USER_AGENT=wrapped-listenbrainz/1.0 (+https://github.com/devmatei/listenbrainz-wrapped) LISTENBRAINZ_RANGE=this_year # Optional HTTP proxy support (requests respects these automatically when set) #HTTP_PROXY=http://localhost:8080 #HTTPS_PROXY=http://localhost:8080 #NO_PROXY=localhost,127.0.0.1 # Last.fm integration (required for higher quality artist artwork) LASTFM_API_KEY=your-lastfm-api-key LASTFM_API=https://ws.audioscrobbler.com/2.0/ LASTFM_USER_AGENT=wrapped-listenbrainz/1.0 (+https://github.com/devmatei/listenbrainz-wrapped) # Libre.fm integration. Register an app key at https://libre.fm/api-keys.php # Libre.fm accepts any string as an API key for reads, but use a real one so the # app is identified properly. The secret is only needed for signed scrobbling. LIBREFM_API=https://libre.fm/2.0/ LIBREFM_API_KEY=your-librefm-api-key LIBREFM_API_SECRET= LIBREFM_USER_AGENT=wrapped-listenbrainz/1.0 (+https://github.com/devmatei/listenbrainz-wrapped) # Performance and rate limiting HTTP_TIMEOUT=10 HTTP_POOL_MAXSIZE=40 LISTENBRAINZ_CACHE_TTL=60 LISTENBRAINZ_CACHE_SIZE=256 APP_RATE_LIMIT=90 per minute APP_STATS_RATE_LIMIT=45 per minute APP_IMAGE_RATE_LIMIT=15 per minute APP_MAX_TOP_RESULTS=15 APP_IMAGE_CONCURRENCY=2 APP_IMAGE_QUEUE_LIMIT=10 APP_IMAGE_QUEUE_TIMEOUT=15 APP_API_RENDER_CONCURRENCY=1 APP_API_RENDER_QUEUE_LIMIT=16 APP_API_RENDER_QUEUE_TIMEOUT=30 TEMP_ARTWORK_TTL_SECONDS=3600 TEMP_ARTWORK_MAX_BYTES=6291456 WRAPPED_COUNT_SINCE=2024-12-01 APP_RATE_LIMIT_SALT=make-this-random APP_STATS_API_CLIENTS= APP_TRUST_PROXY_HEADERS=0 # Cloudflare Turnstile (optional but recommended for public deployments) TURNSTILE_SITE_KEY= TURNSTILE_SECRET_KEY= TURNSTILE_CACHE_TTL=120 TURNSTILE_TIMEOUT=5 # Persistent metrics # counters live in COUNTER_DB. WRAPPED_COUNT_FILE is only read once to import the old count COUNTER_DB=data/counters.db WRAPPED_COUNT_FILE=data/wrapped-count.txt # multi server (see readme): unique NODE_ID per box, same CLUSTER_SECRET everywhere, # the other boxes' private urls in CLUSTER_PEERS, and CLUSTER_PRIMARY on every box but the primary NODE_ID= CLUSTER_PEERS= CLUSTER_PRIMARY= CLUSTER_SECRET= CLUSTER_SYNC_INTERVAL=60 # Community template library # Set TEMPLATE_REVIEW_KEY to a random secret to enable the moderation API at # /api/templates/review and /admin. Leave empty to disable moderation entirely. TEMPLATE_REVIEW_KEY= TEMPLATE_LIBRARY_DIR=data/templates TEMPLATE_SUBMISSION_DIR=data/template-submissions TEMPLATE_CREATOR_DIR=data/template-creators TEMPLATE_ASSET_DIR=data/template-assets TEMPLATE_ASSET_MAX_BYTES=10485760