# ── Discord ────────────────────────────────────────────── # Production token (used when running on Linux). DISCORD_TOKEN= # Beta token (used automatically on non-Linux systems / local dev — see "Beta mode"). DISCORD_BETA_TOKEN= # OAuth2 client secret (needed for OAuth flows / web features). DISCORD_CLIENT_SECRET= # ── Database ───────────────────────────────────────────── DATABASE_PASSWORD= # required DATABASE_HOST=192.168.178.102 # required (default: 192.168.178.102) DATABASE_NAME= # optional; defaults to 'percy' (or 'percy_beta' in beta mode) DATABASE_POOL_MIN_SIZE=10 # optional; warm connections kept open (default 10) DATABASE_POOL_MAX_SIZE=20 # optional; pool ceiling under load (default 20) DATABASE_COMMAND_TIMEOUT=300 # optional; per-query timeout in seconds (default 300) DATABASE_POOL_MAX_IDLE=300 # optional; recycle idle connections after N seconds (default 300) # ── Lavalink (music) ───────────────────────────────────── LAVALINK_NODE_1_PASSWORD= # required for music playback # ── Optional integrations ──────────────────────────────── STATS_WEBHOOK_TOKEN= # webhook token for posting bot stats/errors GENIUS_TOKEN= # Genius API (music lyrics) GITHUB_TOKEN= # GitHub API (source links, gists) # ── klappstuhl.me API ──────────────────────────────── KLAPPSTUHL_ME_API_TOKEN= # legacy/optional personal key (non-guild media + guild-gallery fallback) KLAPPSTUHL_ME_PROVISION_TOKEN= # preferred: service token to mint per-guild gallery keys # (same value as the host's `gallery_provision_token`; no personal key needed) # ── AI (self-hosted Ollama — see docs/ai/) ─────────────── OLLAMA_ENABLED= # set "false" to hard-disable all AI features (default: true) OLLAMA_HOST= # Ollama base URL (default: http://192.168.178.102:11434) OLLAMA_FAST_MODEL= # latency-tier model (default: qwen2.5:1.5b) OLLAMA_BALANCED_MODEL= # structured-routing model (default: qwen2.5-coder:3b) OLLAMA_SMART_MODEL= # conversational model (default: llama3.2:3b) OLLAMA_TIMEOUT= # per-call hard timeout for structured calls, seconds (default: 30; raise on slow CPUs) OLLAMA_CHAT_TIMEOUT= # timeout for free-form ?ask replies, seconds (default: 120; longer than structured) OLLAMA_CHAT_NUM_PREDICT= # max tokens a ?ask reply may generate (default: 400; bounds CPU latency) OLLAMA_KEEP_ALIVE= # keep the model loaded between calls (default: 30m; '-1' = forever) OLLAMA_MAX_CONCURRENCY= # in-flight inference cap; match OLLAMA_NUM_PARALLEL (default: 1) # ── TMDB (universe watchlist metadata) ─────────────────── TMDB_API_TOKEN= # optional; v4 "API Read Access Token" from https://www.themoviedb.org/settings/api TMDB_LANGUAGE= # optional; TMDB response language (default: en-US) TMDB_TIMEOUT= # optional; per-call timeout in seconds (default: 20.0) WATCHLIST_REGIONS= # optional; comma-separated watch-provider regions (default: US,GB,DE) # ── Bot list stats & vote webhooks ─────────────────────── DBOTS_TOKEN= # discord.bots.gg stats posting TOPGG_TOKEN= # top.gg stats posting DISCORDBOTLIST_TOKEN= # discordbotlist.com stats posting TOPGG_WEBHOOK_SECRET= # top.gg vote-webhook Authorization secret DISCORDBOTLIST_WEBHOOK_SECRET= # discordbotlist.com vote-webhook Authorization secret # ── Web Dashboard (klappstuhl.me BFF) ─────────────────── INTERNAL_API_TOKEN= # pre-shared bearer token for the dashboard BFF INTERNAL_API_PORT=8090 # port for internal API (default 8090)