# Runtime NODE_ENV=development MONGODB_URI=mongodb://127.0.0.1:27017/opensquawk # Authentication # Generate strong, unique random values — e.g. `openssl rand -hex 32`. # The server refuses to start in production if these are unset, look like a # placeholder, or are shorter than 32 characters. JWT_SECRET=CHANGE_ME JWT_REFRESH_SECRET=CHANGE_ME # OpenAI OPENAI_API_KEY=sk-your-openai-key OPENAI_PROJECT= OPENAI_BASE_URL= # Optional: specify a custom API endpoint, e.g. http://localhost:1234/v1 LLM_MODEL=gpt-5-nano TTS_MODEL=tts-1 VOICE_ID=alloy # ATC audio generation ATC_OUT_DIR=./storage/atc FLIGHTLAB_TTS_CACHE_DIR=./.cache/flightlab-tts USE_SPEACHES=false USE_PIPER=false PIPER_PORT=5001 SPEACHES_BASE_URL= SPEECH_MODEL_ID=speaches-ai/piper-en_US-ryan-low # Optional: external webhook for bridge dome-light telemetry. Leave empty to disable. DOME_LIGHT_WEBHOOK_URL= # Notifications NOTIFY_RESEND_API_KEY= NOTIFY_EMAIL_TO= NOTIFY_EMAIL_FROM="OpenSquawk " NOTIFY_SMTP_HOST= NOTIFY_SMTP_PORT=587 NOTIFY_SMTP_SECURE=false NOTIFY_SMTP_USER= NOTIFY_SMTP_PASS= # Bootstrap invitations BOOTSTRAP_INVITE_DEADLINE=2025-09-01T00:00:00Z # Manual invitation generator MANUAL_INVITE_PASSWORD=CHANGE_ME # Cron / scheduled tasks # Required for the /api/service/cron/* endpoints (they send emails and mint # invite codes). Without it those endpoints return 503. Pass it via the # `x-cron-secret` header (preferred) or `?secret=` query param. CRON_SECRET=CHANGE_ME