# --- Required --------------------------------------------------------- # Bot API key from Echoed (starts with zbot_) BOT_TOKEN=zbot_your_token_here # Postgres. The bot owns the `panda` schema; multiple bots share the same # database via per-bot schemas, so use a dedicated panda role with USAGE + # CREATE on its schema (or grant CREATE on the database to let it bootstrap # the schema itself). DATABASE_URL=postgresql://user:pass@host:5432/dbname # --- Optional: Echoed endpoints -------------------------------------- ECHOED_API_URL=https://go.echoed.gg ECHOED_SOCKET_URL=https://socket.echoed.gg # --- Optional: behavior ---------------------------------------------- # Default command prefix. Per-guild overrides live in panda.guild_config. COMMAND_PREFIX=! LOG_LEVEL=info NODE_ENV=production # Soft rate-limit per channel: ignore commands fired faster than this PER_CHANNEL_COOLDOWN_MS=2000 # --- Optional: Twitch integration ------------------------------------ # Register an app at https://dev.twitch.tv/console/apps to enable # !twitch follow/unfollow/list. Without these the commands surface a # friendly "not configured" message and the scheduler skips its tick. TWITCH_CLIENT_ID= TWITCH_CLIENT_SECRET= # YouTube integration uses the public RSS feed and needs no API key. # --- Optional: AI moderation ----------------------------------------- # Servers bring their own OpenRouter key; it is stored encrypted with a key # derived from this secret. Set the SAME value here and in the dashboard's # environment — a long random string (at least 32 characters), e.g. # node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" # Unset → AI moderation stays off everywhere. Changing it later makes every # saved key unreadable (owners re-enter theirs). PANDA_AI_KEY_SECRET=