apps/api/.env.example in the repo — it’s the file the API actually reads, with comments next to each variable. This page is the same set of variables organized by purpose so you can scan it before a deploy.
Core (required to boot)
These four are non-negotiable. The API refuses to start without them.HTTP server
Documentation links
If you mirror the docs at, say,
https://docs.example.internal, set DOCS_BASE_URL=https://docs.example.internal and every error response will link there.
Media (S3)
The API uses a single bucket, with environments separated by an in-bucket key prefix. The current build talks to AWS S3 directly — there is no endpoint override, so S3-compatible providers (R2, MinIO, Wasabi) need a follow-up PR to expose the AWS SDK’sendpoint option. See troubleshooting for the workaround.
The bucket itself needs Block Public Access OFF (objects are served by URL), ACLs disabled (Object Ownership: “Bucket owner enforced”), and an IAM user with
s3:PutObject, GetObject, DeleteObject, AbortMultipartUpload, ListMultipartUploadParts on objects, plus ListBucket / ListBucketMultipartUploads on the bucket itself.
Optional dashboard sign-in providers
Set both*_CLIENT_ID and *_CLIENT_SECRET to enable each provider; leave blank to disable. The default is email + password.
Platform OAuth credentials
These are only required when you want users to connect that platform. The full per-platform setup (portal links, exact scope strings, app review status) lives in platform credentials.
The Meta family runs on three independent OAuth apps in v1 — Facebook Pages, Instagram (Instagram API with Instagram Login), and Threads are all separate developer apps with separate client credentials. See platform credentials for why.
Operational toggles
What’s not in scope today
Three names appear in the example file but are not yet read by the source code. Don’t carry these into your.env expecting them to do anything in v1:
YOUTUBE_CLIENT_ID/YOUTUBE_CLIENT_SECRET— placeholders for a future YouTube provider.TIKTOK_CLIENT_KEY/TIKTOK_CLIENT_SECRET— deferred to v2.
MEDIA_S3_BUCKET,MEDIA_S3_REGION,MEDIA_S3_ENDPOINT,MEDIA_S3_ACCESS_KEY_ID,MEDIA_S3_SECRET_ACCESS_KEY— superseded by theAWS_REGION+S3_*+MEDIA_*set above.ENCRYPTION_KEY— superseded byKEK_MASTER(AES-256-GCM, base64 of 32 bytes).WEBHOOK_SIGNING_SECRET— there is no global signing secret. Each webhook endpoint generates its own signing secret at registration time and returns it once in the create response.

