APP_TITLE=My App DATABASE_URL=postgresql://user:password@localhost:5432/dbname NODE_ENV=development NUXT_PUBLIC_SITE_URL=http://localhost:3000 JWT_SECRET=your-super-secret-jwt-key-change-this # SendGrid (transactional email: invites, password resets, verification). # Sends through the v3 JSON API. The From address in SMTP_FROM must be on a # domain authenticated in the SendGrid account. SENDGRID_API_KEY=your-sendgrid-api-key # Optional API host override; defaults to api.sendgrid.com (use api.eu.sendgrid.com for EU) SENDGRID_HOST= SMTP_FROM=noreply@yourdomain.com SMTP_FROM_NAME=My App S3_ENDPOINT=https://s3.us-west-004.backblazeb2.com S3_REGION=us-west-004 S3_ACCESS_KEY_ID=your-access-key-id S3_SECRET_ACCESS_KEY=your-secret-access-key S3_BUCKET_NAME=your-bucket-name # Optional: only required if you call uploadToS3(..., 'public') or getPublicUrl() # Set to the custom domain attached to your bucket (e.g. Cloudflare R2 custom domain) S3_PUBLIC_BASE_URL=https://cdn.example.com # Prayer Tools integration NUXT_PRAY_BASE_URL=https://pray.doxa.life NUXT_PUBLIC_PRAY_BASE_URL=https://pray.doxa.life FORM_API_KEY=your-form-api-key # Mapbox (used by the prayer map on /pray) NUXT_PUBLIC_MAPBOX_TOKEN=your-mapbox-public-token # Cloudflare Turnstile NUXT_TURNSTILE_SITE_KEY=your-turnstile-site-key NUXT_TURNSTILE_SECRET_KEY=your-turnstile-secret-key # Feedback widget (site-wide chat bubble). No PROJECT_ID = widget not rendered. NUXT_PUBLIC_FEEDBACK_API_BASE=https://support.example.org NUXT_PUBLIC_FEEDBACK_PROJECT_ID=your-feedback-project-id # Statinator analytics (self-hosted tracking-server) # Project must exist on the tracking-server with this site's hostname in allowed_domains. # Set NUXT_PUBLIC_STATINATOR_ENABLED=false (or unset) to disable tracking entirely. NUXT_PUBLIC_STATINATOR_URL=https://statinator.doxa.life NUXT_PUBLIC_STATINATOR_PROJECT_ID=doxa NUXT_PUBLIC_STATINATOR_ENABLED=true # Cookie domain for the shared visitor ID (links activity across doxa.life and pray.doxa.life). # Set to empty in dev to make the cookie host-only. NUXT_PUBLIC_STATINATOR_COOKIE_DOMAIN=.doxa.life # OpenRouter (used by the CMS "Auto-translate" workflow on /admin/pages/:id # and the translate_text / translate_page MCP tools) OPENROUTER_API_KEY=your-openrouter-api-key # Optional model override. Admins can also set it at /admin/settings, which wins # over this. Defaults to anthropic/claude-opus-5 when both are unset. TRANSLATION_MODEL= # Cloudflare cache purge on deploy (server/plugins/cloudflare-purge.ts). # On container boot the edge cache is purged so stale prerendered HTML can't # reference content-hashed assets the new deploy replaced. Leave both blank to # disable (e.g. in dev). Token: My Profile → API Tokens → Custom Token with # Zone → Cache Purge for the doxa.life zone. Zone ID: zone Overview page. CF_API_TOKEN= CF_ZONE_ID= # OAuth 2.1 server # Issuer is derived from NUXT_PUBLIC_SITE_URL; resource is `${siteUrl}/mcp`. # Generate with: openssl rand -hex 32 OAUTH_CONSENT_COOKIE_SECRET=replace-me-at-least-32-bytes-of-random-hex-or-base64 OAUTH_ALLOW_DCR=false # Path to the OAuth Nuxt layer (extends). Optional — leave blank to skip. # Local dev typically points at a sibling checkout (e.g. ../../base-code/layers/oauth); # prod can use a github: shorthand or a pinned path. OAUTH_LAYER_PATH= # MCP server layer (extends; depends on the OAuth layer). # Path to the MCP Nuxt layer. Leave blank to skip the MCP transport. MCP_LAYER_PATH= # MCP server identity advertised in the `initialize` response. MCP_SERVER_NAME=marketing-rebuild MCP_SERVER_VERSION=1.0.0