Environment variables
Every variable is validated at startup by the Zod schema in packages/types/src/env.ts β the app refuses to boot if a required variable is missing or malformed. Required means the app will not start without it. Secrets are marked and their defaults are never printed here; set them via your environment or secrets manager, never in code.
| Variable | Required | Default | Notes |
|---|---|---|---|
DATABASE_URL | yes | β | |
REDIS_URL | yes | β | |
MINIO_ENDPOINT | yes | β | |
MINIO_PORT | yes | β | |
MINIO_USE_SSL | no | false | |
MINIO_ACCESS_KEY | yes | β | secret β set via environment |
MINIO_SECRET_KEY | yes | β | secret β set via environment |
MINIO_BUCKET | yes | β | |
TYPESENSE_HOST | yes | β | |
TYPESENSE_PORT | yes | β | |
TYPESENSE_API_KEY | yes | β | secret β set via environment |
TYPESENSE_PROTOCOL | no | http | |
AUTH_SECRET | yes | β | secret β set via environment |
JWT_SECRET | yes | β | secret β set via environment |
JWT_EXPIRY_SECONDS | no | 3600 | |
REFRESH_TOKEN_EXPIRY_DAYS | no | 30 | |
ONBOARDING_TOKEN_TTL_HOURS | no | 168 | |
ENCRYPTION_KEY | yes | β | secret β set via environment |
SMTP_HOST | no | β | |
SMTP_PORT | no | β | |
SMTP_USER | no | β | |
SMTP_PASS | no | β | secret β set via environment |
SMTP_FROM | no | β | |
NEXT_PUBLIC_API_URL | yes | β | |
NEXT_PUBLIC_PIP_URL | yes | β | |
NEXT_PUBLIC_PIC_URL | yes | β | |
NEXT_PUBLIC_ADMIN_URL | yes | β | |
NEXT_PUBLIC_HOME_URL | yes | β | |
API_INTERNAL_URL | yes | β | |
SIGNUP_MODE | no | review | |
CAPTCHA_PROVIDER | no | none | |
CAPTCHA_SECRET | no | β | secret β set via environment |
RATE_LIMIT_FREE | no | 60 | |
RATE_LIMIT_STARTER | no | 300 | |
RATE_LIMIT_GROWTH | no | 1000 | |
RATE_LIMIT_BUSINESS | no | 5000 | |
GOOGLE_AI_STUDIO_API_KEY | no | β | secret β set via environment |
GOOGLE_AI_STUDIO_RPM_LIMIT | no | 5 | |
GOOGLE_AI_STUDIO_TPM_LIMIT | no | 500000 | |
GOOGLE_AI_STUDIO_RPD_LIMIT | no | 20 | |
GOOGLE_AI_STUDIO_CONCURRENCY | no | 4 | |
ENRICH_MAX_PRODUCTS_PER_JOB | no | 100 | |
ENRICH_MAX_PRODUCTS_PER_FILTER | no | 1000 | |
ENRICH_MAX_RATE_LIMIT_RETRIES | no | 20 | |
ENRICH_PIPELINE_CONCURRENCY | no | 2 | |
REGWATCH_ENABLED | no | false | |
GDSN_ENABLED | no | false | |
GDSN_DEFAULT_POOL | no | mock | |
GDSN_INBOUND_POLL_SECONDS | no | 900 | |
GDSN_POOL_ENDPOINT | no | β | |
GDSN_POOL_AUTH | no | β | secret β set via environment |
GDSN_VALIDATE_BEFORE_PUBLISH | no | false | |
SYNDICATION_SCHEDULER_ENABLED | no | false | |
SYNDICATION_SCHEDULER_TICK_SECONDS | no | 300 | |
DAM_THUMBNAIL_ON_UPLOAD | no | true | |
DAM_RENDITIONS_CONCURRENCY | no | 3 | |
WORKFLOW_SLA_ENABLED | no | true | |
WORKFLOW_SLA_CRON | no | */15 * * * * | |
NOTIFICATIONS_ENABLED | no | true | |
NOTIFICATIONS_DIGEST_CRON | no | 0 7 * * * | |
COMPLIANCE_RELATIONSHIP_TRAVERSAL | no | false | |
PDF_EXPORT_BASE_URL | yes | β | |
ANALYTICS_SNAPSHOT_ENABLED | no | true | |
ANALYTICS_SNAPSHOT_CRON | no | 0 2 * * * | |
ANALYTICS_SNAPSHOT_RETENTION_DAYS | no | 400 | |
ANALYTICS_FINE_SCOPE_RETENTION_DAYS | no | 90 | |
DPP_RESOLVER_BASE_URL | yes | β | |
DPP_REGISTRY_ENABLED | no | false | |
DPP_REGISTRY_BASE_URL | no | β | |
DPP_REGISTRY_API_KEY | no | β | secret β set via environment |
DPP_REGISTRY_PLATFORM_FALLBACK | no | true | |
DPP_REGISTRY_DATA_URL_MODE | no | page | |
BRAND_PORTAL_BASE_URL | yes | β | |
BILLING_PROVIDER | no | manual | |
BILLING_ENFORCEMENT_ENABLED | no | false | |
USAGE_ROLLUP_ENABLED | no | true | |
USAGE_ROLLUP_CRON | no | 0 * * * * | |
STRIPE_SECRET_KEY | no | β | secret β set via environment |
STRIPE_WEBHOOK_SECRET | no | β | secret β set via environment |
API_KEY_ROTATION_GRACE_HOURS | no | 24 | |
SANDBOX_RATE_PER_MIN | no | 60 | |
SSO_ENABLED | no | false | |
SSO_HANDOFF_TTL_SECONDS | no | 120 | |
SSO_STATE_TTL_SECONDS | no | 600 | |
NODE_ENV | no | development | |
LOG_LEVEL | no | info |