.env.example to .env and fill in the values. Variables marked Required must be set for the application to start. Optional variables enable specific features that degrade gracefully when absent.
Setting
ENVIRONMENT=Production changes several behaviors: Swagger is disabled, detailed error messages are suppressed, and missing Stripe configuration throws on startup rather than logging a warning.Database
DATABASE_URL is used by the .NET application. POSTGRES_DB, POSTGRES_USER, and POSTGRES_PASSWORD are used by the postgres Docker container to initialize the database. They should be consistent with each other.
Redis
For local development with the Docker Compose setup, use
REDIS_URL=redis:6379 (the service name). For production, use your Redis host and port.
JWT
Both key variables must be base64-encoded PEM format with no line breaks. See JWT Key Generation for the exact commands.
Stripe
*Required in
Production. In Development, missing Stripe config logs a warning and the application starts; billing endpoints will return errors.
Test keys start with sk_test_. Live keys start with sk_live_. Never use live keys in development.
Resend (email)
*Required in
Production. In Development, missing Resend config logs a warning; email sending fails silently and the error is logged.
For local development, you can use onboarding@resend.dev as EMAIL_FROM_ADDRESS without domain verification.
OAuth
OAuth providers are optional. The application works without them — only the Google and GitHub login buttons on the login page will fail.
Application
APP_URL is used in email templates to build links (e.g., the email verification link, magic link). API_URL is the backend’s own base URL, used in OAuth callback construction.
Frontend
Vite only exposes environment variables prefixed with
VITE_ to the browser bundle. VITE_API_URL is the only frontend environment variable — everything else is server-side.