# ============================================================================== # Development Environment Configuration # ============================================================================== # This is for local development. For production/self-hosting, see .env.self-host.example # ============================================================================== # Environment & Security # ============================================================================== NODE_ENV=development JWT_SECRET=hBx9Xh8J6KOMAGAsSjvcZJBT5TWyIkFX # Port the API server listens on (default: 8080) # PORT=8080 # ============================================================================== # Application URLs # ============================================================================== # Set to 'true' for HTTPS in production (only used when auto-generating URIs from domains) USE_HTTPS=false API_URI=http://localhost:8080 WIKI_URI=http://localhost:1000 DASHBOARD_URI=http://localhost:3000 LANDING_URI=http://localhost:4000 # ============================================================================== # Plunk API (Optional - for sending emails via Plunk API) # ============================================================================== # API key for authenticating with the Plunk API (obtained from dashboard) PLUNK_API_KEY= # From address used for platform notification emails (project disabled, billing limits, etc.) # PLUNK_FROM_ADDRESS= # ============================================================================== # Database & Redis # ============================================================================== REDIS_URL=redis://127.0.0.1:56379 DATABASE_URL=postgresql://postgres:postgres@localhost:55432/postgres DIRECT_DATABASE_URL=postgresql://postgres:postgres@localhost:55432/postgres # ============================================================================== # S3-compatible Storage (Minio - for file uploads) # ============================================================================== # For local development, make sure Minio is running via docker compose S3_ENDPOINT=http://localhost:9000 S3_ACCESS_KEY_ID=plunk S3_ACCESS_KEY_SECRET=plunkminiopass S3_BUCKET=uploads S3_PUBLIC_URL=http://localhost:9000/uploads S3_FORCE_PATH_STYLE=true # ============================================================================== # AWS SES (Required - for sending emails) # ============================================================================== AWS_SES_REGION=eu-north-1 AWS_SES_ACCESS_KEY_ID= AWS_SES_SECRET_ACCESS_KEY= # Configuration sets for email tracking SES_CONFIGURATION_SET=plunk-configuration-set # Default: with open/click tracking SES_CONFIGURATION_SET_NO_TRACKING=plunk-configuration-set-no-tracking # Optional: without tracking (enables toggle in UI) # Email sending rate limit (emails per second) # If not set, automatically fetches from AWS SES account quota (recommended) # Set this to override AWS quota (useful for setting lower limits or testing) # Default: Fetched from AWS (typically 14 for sandbox, higher for production accounts) # EMAIL_RATE_LIMIT_PER_SECOND=14 # Email worker concurrency (number of emails processed in parallel) # If not set, derived from the effective rate limit (~ rate * 0.5, min 5, capped # by EMAIL_WORKER_MAX_CONCURRENCY). Set this to pin a fixed value when the # Prisma connection pool or memory is the binding constraint. # EMAIL_WORKER_CONCURRENCY=10 # Upper bound for auto-derived worker concurrency # Raise this when your SES quota is high AND the Prisma pool has been sized for it. # Default: 50 # EMAIL_WORKER_MAX_CONCURRENCY=50 # ============================================================================== # OAuth (Optional - for social login) # ============================================================================== GITHUB_OAUTH_CLIENT= GITHUB_OAUTH_SECRET= GOOGLE_OAUTH_CLIENT= GOOGLE_OAUTH_SECRET= # ============================================================================== # Stripe (Optional - for billing) # ============================================================================== STRIPE_SK= STRIPE_WEBHOOK_SECRET= STRIPE_PRICE_ONBOARDING= # Optional: One-time onboarding fee price ID (e.g., price_xxxxx) STRIPE_PRICE_EMAIL_USAGE= # Required: Metered price ID for pay-per-email billing STRIPE_METER_EVENT_NAME=emails # Meter event name (API key from your Stripe meter, default: emails) # ============================================================================== # Security (Optional) # ============================================================================== # Controls whether projects are automatically disabled when bounce/complaint rate thresholds are exceeded # Set to 'false' to disable automatic project suspension (useful for self-hosters who manage manually) # Default: true (automatic project disabling enabled) # AUTO_PROJECT_DISABLE=true # ============================================================================== # Notifications (Optional - system notifications via ntfy) # ============================================================================== # ntfy topic URL for internal system notifications (e.g. project disabled, billing limits). # When unset, ntfy notifications are disabled. # Examples: # - Public ntfy.sh: https://ntfy.sh/your-unique-topic-name # - Self-hosted: https://your-ntfy-server.com/your-topic # NTFY_URL= # ============================================================================== # Attachments (Optional) # ============================================================================== # Limits applied to attachments on transactional emails. # AWS SES caps total message size at 40 MB; the defaults below leave headroom. # MAX_ATTACHMENT_SIZE_MB=10 # MAX_ATTACHMENTS_COUNT=10 # ============================================================================== # User Management (Optional) # ============================================================================== # When 'true', the signup endpoint rejects new user registrations. # Default: false # DISABLE_SIGNUPS=false # When 'true', validates emails on signup (disposable domains, plus-addressing, # domain existence, MX records). # Default: false # VERIFY_EMAIL_ON_SIGNUP=false # ============================================================================== # Phishing Detection (Optional - AI-powered phishing scan via OpenRouter) # ============================================================================== # When OPENROUTER_API_KEY is set, a random sample of outgoing emails is # analyzed by an LLM. Projects can be auto-disabled if a single email exceeds # PHISHING_CONFIDENCE_THRESHOLD, or if PHISHING_CUMULATIVE_THRESHOLD emails are # flagged within PHISHING_CUMULATIVE_WINDOW_MS. # OPENROUTER_API_KEY= # OPENROUTER_MODEL=anthropic/claude-3-haiku # PHISHING_DETECTION_SAMPLE_RATE=0.1 # PHISHING_CONFIDENCE_THRESHOLD=95 # PHISHING_CUMULATIVE_THRESHOLD=3 # PHISHING_CUMULATIVE_WINDOW_MS=3600000