# ============================================================================= # ZOOM APP CREDENTIALS # ============================================================================= # Get these from https://marketplace.zoom.us/ → Your App → App Credentials ZOOM_CLIENT_ID=your_client_id_here ZOOM_CLIENT_SECRET=your_client_secret_here # Webhook Secret Token from Marketplace app → Features → Event Subscriptions # Required for HMAC verification of all Zoom webhooks (separate from Client Secret) ZOOM_WEBHOOK_TOKEN=your_webhook_secret_token_here # Zoom App ID (optional, for selecting meetings for auto-opening) # Get from the app marketplace: https://marketplace.zoom.us/apps # The app ID is in the path of the app page URL: # https://marketplace.zoom.us/develop/applications/{your-app-id} ZOOM_APP_ID= # Zoom for Government (ZfG) Support # For standard Zoom: leave as zoom.us (default) # For Zoom for Government: set to zoomgov.com ZOOM_HOST=zoom.us # ============================================================================= # PUBLIC URL # ============================================================================= # For local development: Your ngrok HTTPS URL (e.g., https://abc123.ngrok-free.app) # For production: Your public HTTPS URL (optional if the host injects an external URL) PUBLIC_URL=https://your-ngrok-url.ngrok-free.app # OAuth Redirect URI (automatically constructed from PUBLIC_URL) # Must match exactly what's configured in Zoom Marketplace ZOOM_APP_REDIRECT_URI=${PUBLIC_URL}/api/auth/callback # ============================================================================= # DATABASE # ============================================================================= # PostgreSQL connection string # Format: postgresql://USER:PASSWORD@HOST:PORT/DATABASE # Local development (Docker): postgresql://postgres:postgres@postgres:5432/meeting_assistant # Local development (Manual): postgresql://postgres:postgres@localhost:5432/meeting_assistant DATABASE_URL=postgresql://postgres:postgres@postgres:5432/meeting_assistant # ============================================================================= # SECURITY KEYS # ============================================================================= # Session secret for Express session management (64 hex characters) # Generate with: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" SESSION_SECRET=your_64_character_random_string_here # Encryption key for storing Zoom tokens (AES-256-GCM, 64 hex characters = 32 bytes) # Generate with: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" # Base64-encoded 32-byte keys are also accepted. TOKEN_ENCRYPTION_KEY=your_64_character_encryption_key_here # ============================================================================= # REDIS (Optional - for WebSocket scaling) # ============================================================================= # Leave empty to use in-memory store (fine for development/single instance) # For production with multiple instances: redis://localhost:6379 REDIS_URL= # ============================================================================= # AI CONFIGURATION (OpenRouter) # ============================================================================= # OpenRouter API key (OPTIONAL - free models work without key) # Get from: https://openrouter.ai/keys # Leave empty to use free models with rate limits (10 req/min) OPENROUTER_API_KEY= # Default AI model to use # Free options (no API key needed): # - google/gemini-2.0-flash-thinking-exp:free (recommended) # - meta-llama/llama-3.2-3b-instruct:free # - qwen/qwen-2.5-7b-instruct:free # Premium options (requires API key): # - anthropic/claude-3.5-sonnet # - openai/gpt-4o DEFAULT_MODEL=google/gemini-2.0-flash-thinking-exp:free # Fallback model if default fails FALLBACK_MODEL=meta-llama/llama-3.2-3b-instruct:free # ============================================================================= # FEATURE FLAGS # ============================================================================= # Enable AI features (chat, suggestions, summaries) AI_ENABLED=true # Enable background extraction jobs (action items, decisions) EXTRACTION_ENABLED=false # Enable public sharing links (future feature) PUBLIC_LINKS_ENABLED=false # Disable meeting persistence (demo mode) # When true, transcripts are NOT saved to the database # Real-time features still work, but no meeting history is kept DISABLE_MEETING_PERSISTENCE=false # ============================================================================= # SERVER CONFIGURATION # ============================================================================= # Backend server port PORT=3000 # Node environment NODE_ENV=development # Frontend URL (for CORS) FRONTEND_URL=http://localhost:3001 # ============================================================================= # RTMS CONFIGURATION # ============================================================================= # RTMS uses the same ZOOM_CLIENT_ID / ZOOM_CLIENT_SECRET as the backend. # RTMS server port (if running separately) RTMS_PORT=3002 # RTMS SDK log level (v1.0+, replaces configureLogger()) # Options: error, warn, info, debug, trace # Set via ZM_RTMS_LOG_LEVEL env var (handled in docker-compose.yml) # ZM_RTMS_LOG_LEVEL=debug # ============================================================================= # LOGGING # ============================================================================= # Log level: error, warn, info, debug # - error: Critical errors only # - warn: Warnings and errors # - info: General operational info (default) # - debug: Verbose logging including POST/PUT/PATCH request bodies (PII warning!) LOG_LEVEL=info # ============================================================================= # CORS CONFIGURATION # ============================================================================= # Allowed origins for CORS (comma-separated) CORS_ORIGINS=${PUBLIC_URL},http://localhost:3001 # ============================================================================= # RATE LIMITING # ============================================================================= # Rate limits for AI requests (requests per minute) RATE_LIMIT_FREE=10 RATE_LIMIT_PREMIUM=100 # ============================================================================= # FILE STORAGE # ============================================================================= # Directory for VTT files VTT_STORAGE_PATH=./storage/vtt # S3-compatible storage (optional, for production) S3_BUCKET= S3_REGION= S3_ACCESS_KEY= S3_SECRET_KEY=