# Deployment (single-box / Caddy). Used by docker-compose + Caddyfile, not by the app itself. # APP_DOMAIN is the public hostname you point DNS at; Caddy auto-provisions its TLS cert. # ACME_EMAIL is where Let's Encrypt sends expiry notices. APP_DOMAIN= ACME_EMAIL= # Auth / Google GOOGLE_OAUTH_CLIENT_ID= GOOGLE_OAUTH_CLIENT_SECRET= GOOGLE_WORKSPACE_DOMAIN= # Public base URL. In production this MUST be https:// (Google OAuth will not # redirect to a bare IP, and cookies are set Secure). BASE_URL= # Database DATABASE_URL= # Realtime WS_TICKET_SECRET= # Server-side WS URL (worker/relay). On the box this is the internal address: ws://ws:8080 WS_PUBLIC_URL= # Browser-facing WS URL. MUST be set (NEXT_PUBLIC_* is inlined at build time) or # the client silently gets no realtime (board, inbox, notifications, presence). # Production (Caddy on the same domain): wss:///_ws NEXT_PUBLIC_WS_URL= # Storage (MinIO) # Full URL, browser-reachable. The browser POSTs presigned uploads directly here, so in a single-box # deploy this is the public https://s3. vhost, NOT the internal "minio" alias. Local dev: # http://localhost:9000 MINIO_ENDPOINT= MINIO_ACCESS_KEY= MINIO_SECRET_KEY= MINIO_BUCKET=warpdrive MAX_FILE_BYTES=26214400 # Secrets TOKEN_ENCRYPTION_KEY= # MCP server (AI assistant integration) # MCP_ENABLED gates the whole MCP plus OAuth surface. OAUTH_SIGNING_KEY signs access-token JWTs; # generate with: node -e "console.log(require('crypto').randomBytes(32).toString('base64'))" MCP_ENABLED=true OAUTH_SIGNING_KEY= # OAUTH_REGISTRATION controls RFC 7591 dynamic client registration: "open" (default) lets an MCP # client self-onboard by POSTing to /oauth/register with no credential, which is what makes # "just add the server URL" work in Claude Desktop and friends. The cost is that any stranger can # create a client and choose the name your users read on the consent screen. Once you have # connected the clients you need, set this to "disabled": existing grants keep working, and the # registration endpoint 404s and stops being advertised in discovery metadata. OAUTH_REGISTRATION=open # Business BASE_CURRENCY=USD SEED_ADMIN_EMAIL= ALLOW_FIRST_LOGIN_ADMIN=false # Update check (OSS self-hosters) # Shows admins an in-app banner when a newer GitHub release of warpdrive is published. # APP_VERSION: the running version shown as "current". Usually stamped at build (release tag); # leave empty to fall back to package.json, then "dev" (which disables the banner). APP_VERSION= # DISABLE_UPDATE_CHECK: set true to turn the banner + GitHub poll off entirely. DISABLE_UPDATE_CHECK=false # Observability (PostHog, optional) # POSTHOG_KEY is a project ingestion token that posthog-js ships to browsers, and POSTHOG_HOST is a # public URL, so neither is secret. In a production deploy they are typically set in your tracked # compose file, not here. Set them in this .env for local dev or a self-hoster not using a separate # compose. Leaving POSTHOG_KEY or POSTHOG_HOST empty disables all telemetry (browser + server). POSTHOG_HOST= POSTHOG_KEY= # DISABLE_TELEMETRY: hard off-switch; set true to disable capture even when the keys are set. DISABLE_TELEMETRY=false