Cap is configured entirely through environment variables. This reference documents all available options.
Quick Reference
These must be set for Cap to function:DATABASE_URL=mysql://cap:password@mysql:3306/cap
WEB_URL=https://cap.yourdomain.com
NEXTAUTH_URL=https://cap.yourdomain.com
NEXTAUTH_SECRET=your-32-byte-secret
DATABASE_ENCRYPTION_KEY=your-32-byte-hex-key
CAP_AWS_BUCKET=cap
CAP_AWS_REGION=us-east-1
Critical for production security:NEXTAUTH_SECRET=generate-with-openssl-rand-hex-32
DATABASE_ENCRYPTION_KEY=generate-with-openssl-rand-hex-32
MEDIA_SERVER_WEBHOOK_SECRET=generate-with-openssl-rand-hex-32
Enhance functionality:RESEND_API_KEY=re_xxxxx
RESEND_FROM_DOMAIN=yourdomain.com
DEEPGRAM_API_KEY=your-key
GROQ_API_KEY=your-key
General Configuration
DATABASE_URL
Required | MySQL connection string
DATABASE_URL=mysql://user:password@host:port/database
mysql://[user]:[password]@[host]:[port]/[database]
Examples:
DATABASE_URL=mysql://cap:password@mysql:3306/cap
Cap requires MySQL 8.0+. MariaDB or other databases are not officially supported.
WEB_URL
Required | Public URL where Cap is accessible
WEB_URL=https://cap.yourdomain.com
Used for:
- Generating share links
- Email login links
- OAuth redirect URLs
- Desktop app connections
For local development, use http://localhost:3000
NEXTAUTH_URL
Required | Should match WEB_URL
NEXTAUTH_URL=https://cap.yourdomain.com
Required by NextAuth.js for authentication. Must be identical to WEB_URL.
NEXTAUTH_SECRET
Required | 32-byte secret for session encryption
NEXTAUTH_SECRET=abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789
Generate:
Critical for security: Protects user sessions. Anyone with this secret can forge authentication tokens. Use a unique value for each deployment.
DATABASE_ENCRYPTION_KEY
Optional but strongly recommended | 32-byte hex string
DATABASE_ENCRYPTION_KEY=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
Generate:
Encrypts sensitive database fields:
- AWS access keys
- API keys stored in database
- OAuth tokens
Changing this key will make existing encrypted data unreadable. Back up before changing.
Storage (S3) Configuration
CAP_AWS_BUCKET
Required | S3 bucket name
The bucket where videos and thumbnails are stored.
CAP_AWS_REGION
Required | AWS region or equivalent
For MinIO or non-AWS providers, use any valid AWS region format (e.g., us-east-1).
CAP_AWS_ACCESS_KEY
Optional | S3 access key ID
CAP_AWS_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE
For MinIO (Docker Compose), this defaults to MINIO_ROOT_USER.
For AWS S3, use your IAM access key.
CAP_AWS_SECRET_KEY
Optional | S3 secret access key
CAP_AWS_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
For MinIO (Docker Compose), this defaults to MINIO_ROOT_PASSWORD.
For AWS S3, use your IAM secret key.
S3_PUBLIC_ENDPOINT
Optional | Public URL for S3 access
S3_PUBLIC_ENDPOINT=https://s3.yourdomain.com
Examples:
S3_PUBLIC_ENDPOINT=http://localhost:9000
Used for:
- Video playback URLs
- Thumbnail URLs
- Direct file access
S3_INTERNAL_ENDPOINT
Optional | Internal endpoint for S3 access from server
S3_INTERNAL_ENDPOINT=http://minio:9000
Useful when:
- Server-to-S3 communication can use internal network
- Avoiding public internet for uploads (cost, speed)
- Docker container networking
If not set, falls back to S3_PUBLIC_ENDPOINT.
S3_PATH_STYLE
Optional | Use path-style URLs (default: true)
true: http://endpoint/bucket/key (MinIO, Backblaze)
false: http://bucket.endpoint/key (AWS S3)
MinIO and most S3-compatible providers require S3_PATH_STYLE=true.
AWS S3 works with both but defaults to false.
CAP_AWS_BUCKET_URL
Optional | Custom public URL for bucket (CloudFront)
CAP_AWS_BUCKET_URL=https://cdn.yourdomain.com
Use when serving files through a CDN or CloudFront distribution.
CloudFront Configuration
Optional | For signed CloudFront URLs
CAP_CLOUDFRONT_DISTRIBUTION_ID=E1234567890ABC
CLOUDFRONT_KEYPAIR_ID=APKAXXXXXXXXXXXXXXXX
CLOUDFRONT_KEYPAIR_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\n...
Enables signed URLs with expiration for private videos.
Email Configuration
RESEND_API_KEY
Optional | Resend API key for email sending
RESEND_API_KEY=re_xxxxxxxxxxxxx
Get from resend.com dashboard.
Without this:
- Login links appear in server logs
- No email notifications
RESEND_FROM_DOMAIN
Optional | Verified domain for sending emails
RESEND_FROM_DOMAIN=yourdomain.com
Must be verified in your Resend account.
Emails will be sent from: noreply@yourdomain.com
Authentication
Google OAuth
Optional | Enable Google login
GOOGLE_CLIENT_ID=xxxxx.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-xxxxx
Setup:
- Create project in Google Cloud Console
- Enable Google+ API
- Create OAuth 2.0 credentials
- Add authorized redirect URI:
https://yourdomain.com/api/auth/callback/google
WorkOS SSO
Optional | Enterprise SSO via WorkOS
WORKOS_CLIENT_ID=client_xxxxx
WORKOS_API_KEY=sk_xxxxx
For enterprise deployments with SAML/OIDC requirements.
See WorkOS docs for setup.
AI Features
DEEPGRAM_API_KEY
Optional | Audio transcription
DEEPGRAM_API_KEY=xxxxxxxxxxxxx
Enables:
- Automatic video transcription
- Searchable captions
- Accessibility features
Get from deepgram.com
GROQ_API_KEY
Optional | Fast AI summaries (recommended)
Enables AI-generated video summaries using Groq’s fast LLM inference.
Get from groq.com
OPENAI_API_KEY
Optional | AI summaries via OpenAI
Fallback for AI summaries if GROQ_API_KEY not set.
Get from platform.openai.com
ANTHROPIC_API_KEY
Optional | Claude AI chat
ANTHROPIC_API_KEY=sk-ant-xxxxx
Enables AI chat features powered by Claude.
REPLICATE_API_TOKEN
Optional | Audio enhancement
REPLICATE_API_TOKEN=r8_xxxxx
Enables audio enhancement using Replicate’s models.
SUPERMEMORY_API_KEY
Optional | Supermemory integration
SUPERMEMORY_API_KEY=xxxxx
SUPERMEMORY_KNOWLEDGE_TAG=cap
Integration with Supermemory for knowledge management.
Optional | URL of media server
MEDIA_SERVER_URL=http://media-server:3456
Default in Docker Compose: http://media-server:3456
For external media server, use public URL.
Optional but recommended | Webhook authentication
MEDIA_SERVER_WEBHOOK_SECRET=generate-with-openssl-rand-hex-32
Generate:
Protects webhook endpoints from unauthorized requests.
Optional | Base URL for webhooks
MEDIA_SERVER_WEBHOOK_URL=http://cap-web:3000
Default in Docker Compose: http://cap-web:3000
For Docker Desktop on Mac/Windows, use host.docker.internal:
MEDIA_SERVER_WEBHOOK_URL=http://host.docker.internal:3000
Application Settings
CAP_VIDEOS_DEFAULT_PUBLIC
Optional | Default video visibility (default: true)
CAP_VIDEOS_DEFAULT_PUBLIC=false
true: Videos are public by default
false: Videos are private by default
CAP_ALLOWED_SIGNUP_DOMAINS
Optional | Restrict signups to specific domains
CAP_ALLOWED_SIGNUP_DOMAINS=company.com,partner.com
Comma-separated list of email domains allowed to sign up.
If not set, all domains are allowed.
Example: Only allow @acme.com emails:
CAP_ALLOWED_SIGNUP_DOMAINS=acme.com
Analytics & Monitoring
Tinybird Analytics
Optional | Video analytics via Tinybird
TINYBIRD_HOST=https://api.tinybird.co
TINYBIRD_TOKEN=p.xxxxx
Enables:
- View analytics
- Play duration tracking
- Geographic analytics
- Engagement metrics
See Cap analytics setup for provisioning.
PostHog
Optional | Product analytics
POSTHOG_PERSONAL_API_KEY=phx_xxxxx
Integration with PostHog for user analytics.
Cap Cloud Variables
These variables are only needed for hosting Cap as a paid SaaS like cap.so. Self-hosters can ignore these.
Stripe Payments
STRIPE_SECRET_KEY=sk_xxxxx
STRIPE_WEBHOOK_SECRET=whsec_xxxxx
For billing and subscription management.
Discord Webhooks
DISCORD_FEEDBACK_WEBHOOK_URL=https://discord.com/api/webhooks/xxxxx
DISCORD_LOGS_WEBHOOK_URL=https://discord.com/api/webhooks/xxxxx
Send feedback and logs to Discord channels.
Dub.co Link Shortening
Shorten share links via Dub.co.
Vercel Integration
VERCEL_ENV=production
VERCEL_TEAM_ID=team_xxxxx
VERCEL_PROJECT_ID=prj_xxxxx
VERCEL_AUTH_TOKEN=xxxxx
VERCEL_AWS_ROLE_ARN=arn:aws:iam::xxxxx
For Vercel-specific deployments and integrations.
MySQL Configuration
These are for the MySQL container in Docker Compose. Not needed if using external database.
MYSQL_PASSWORD
MYSQL_PASSWORD=your-secure-password
Password for the cap MySQL user.
MYSQL_ROOT_PASSWORD
MYSQL_ROOT_PASSWORD=your-root-password
Password for the MySQL root user.
MinIO Configuration
These are for the MinIO container in Docker Compose. Not needed if using AWS S3 or other providers.
MINIO_ROOT_USER
MinIO admin username.
MINIO_ROOT_PASSWORD
MINIO_ROOT_PASSWORD=your-secure-password
MinIO admin password.
Must be at least 8 characters.
Port Configuration
CAP_PORT
Optional | Port for Cap web (default: 3000)
Change if port 3000 is in use.
MINIO_PORT
Optional | MinIO API port (default: 9000)
MINIO_CONSOLE_PORT
Optional | MinIO web console (default: 9001)
Environment File Example
Complete .env file for production:
# Public URLs
WEB_URL=https://cap.yourdomain.com
NEXTAUTH_URL=https://cap.yourdomain.com
S3_PUBLIC_ENDPOINT=https://s3.yourdomain.com
# Security (generate with: openssl rand -hex 32)
NEXTAUTH_SECRET=your-generated-secret
DATABASE_ENCRYPTION_KEY=your-generated-key
MEDIA_SERVER_WEBHOOK_SECRET=your-generated-secret
# Database
DATABASE_URL=mysql://cap:password@mysql:3306/cap
MYSQL_PASSWORD=your-mysql-password
MYSQL_ROOT_PASSWORD=your-root-password
# S3 Storage
CAP_AWS_BUCKET=cap
CAP_AWS_REGION=us-east-1
CAP_AWS_ACCESS_KEY=capadmin
CAP_AWS_SECRET_KEY=your-minio-password
S3_INTERNAL_ENDPOINT=http://minio:9000
S3_PATH_STYLE=true
# MinIO
MINIO_ROOT_USER=capadmin
MINIO_ROOT_PASSWORD=your-minio-password
# Email (optional)
RESEND_API_KEY=re_xxxxx
RESEND_FROM_DOMAIN=yourdomain.com
# AI Features (optional)
DEEPGRAM_API_KEY=xxxxx
GROQ_API_KEY=gsk_xxxxx
# Media Server
MEDIA_SERVER_URL=http://media-server:3456
MEDIA_SERVER_WEBHOOK_URL=http://cap-web:3000
# Settings
CAP_VIDEOS_DEFAULT_PUBLIC=true
Validation
Cap validates environment variables on startup. Check logs for errors:
docker compose logs cap-web | grep -i error
Common validation errors:
- Missing required variables
- Invalid URL formats
- Incorrect secret lengths
- Database connection failures
Next Steps
S3 Storage
Detailed S3 configuration guides
Email Setup
Configure email delivery
SSL/HTTPS
Secure your deployment
Troubleshooting
Debug configuration issues