Skip to main content

Configuration

Compass uses compass.yaml for self-hosting and local development. The file is visible, diffable, and contains secrets, so keep it out of git and back it up with the Docker volumes.

Examples:

  • local development: compass.example.yaml
  • self-hosting: self-host/compass.example.yaml

Runtime

keyRequiredDescription
runtime.versionSelf-hostDocker image tag used by the self-host compose stack. Defaults to latest. Pin this for reproducible installs.
runtime.nodeEnvYesRuntime mode. Use production for self-hosted and staging; development for local dev.
runtime.timezoneYesBackend timezone. Only Etc/UTC and UTC are accepted.
runtime.logLevelNoWinston log level. Defaults to info. Set to debug to include health-check requests (GET /api/health) in the logs, which are otherwise hidden.

Web

keyRequiredDescription
web.port9080Host port bound to the web container on 127.0.0.1.
web.urlYesPublic frontend URL as seen by the backend. Example: https://compass.example.com.

Backend

keyRequiredDescription
backend.port3000Host port bound to the backend container on 127.0.0.1.
backend.apiUrlYesPublic API URL. Example: https://compass.example.com/api. This is baked into the web bundle when the web image is rebuilt.
backend.originsAllowedYesYAML list of allowed CORS origins. Include web.url.
backend.compassTokenYesBearer token protecting internal sync endpoints.

MongoDB

keyRequiredDescription
mongo.uriYesBackend MongoDB connection string. For self-hosted installs, must include authSource=admin and replicaSet=rs0.
mongo.usernameSelf-hostMongoDB root username created on first container startup. Must match the credentials in mongo.uri.
mongo.passwordSelf-hostMongoDB root password. Changing it after first startup requires a MongoDB user migration.
mongo.replicaSetKeySelf-hostShared secret used for internal authentication between replica set members.

SuperTokens

SuperTokens handles user-sessions for us.

keyRequiredDescription
supertokens.uriYesSuperTokens Core URL as seen by the backend. Self-hosted Docker uses http://supertokens:3567.
supertokens.keyYesAPI key shared by backend and SuperTokens Core.
supertokens.postgres.userSelf-hostPostgres user for the SuperTokens database container.
supertokens.postgres.passwordSelf-hostPostgres password for the SuperTokens database container.
supertokens.postgres.databaseSelf-hostPostgres database name for SuperTokens.

Google

These values are only necessary if you want to enable Google Oauth and/or 2-way sync between Compass and Google Calendar

Both google.clientId and google.clientSecret must be real values for Google features to activate. Setting only one causes backend startup to fail.

keyRequiredDescription
google.clientIdNoGoogle OAuth client ID. Rebuild the web image after changing it.
google.clientSecretNoGoogle OAuth client secret. Backend-only.

See Google Calendar for full setup instructions.

Microsoft

Both microsoft.clientId and microsoft.clientSecret must be set together. Setting only one causes startup to fail. See Microsoft Calendar.

keyRequiredDescription
microsoft.clientIdNoEntra app client ID (/common). Rebuild the web image after changing it.
microsoft.clientSecretNoEntra app client secret. Backend-only.

Apple

Sign in with Apple is all-four-or-none. iCloud calendar connect is separate and needs sync.credentialEncryptionKey. See iCloud Calendar.

keyRequiredDescription
apple.signIn.servicesIdNoSign in with Apple Services ID. Baked into the web bundle.
apple.signIn.teamIdNoApple Developer team ID.
apple.signIn.keyIdNoSign in with Apple key ID.
apple.signIn.privateKeyNo.p8 private key contents.

Sync Service

Standalone service (packages/sync) that owns Google Calendar sync end to end. Every deployment runs it — the backend exits at startup without sync.serviceUrl/sync.internalAuthToken configured, and the self-host installer writes the sync: block by default (see Self-Hosting). Sync uses an isolated Mongo database and must not share the backend's database user/data.

keyRequiredDescription
sync.portNoSync HTTP port. Defaults to 3010 in examples.
sync.mongoUriYesIsolated Sync Mongo URI. Never point this at the API database.
sync.internalAuthTokenYesShared secret for Sync internal routes. Must match what the API uses.
sync.callbackBaseUrlYesPublic base URL for provider OAuth/webhook callbacks (proxied as /sync/*).
sync.postConnectRedirectUrlNoBrowser redirect after OAuth connect. Set this to web.url — an unset value falls back to callbackBaseUrl (Sync's own API host), which strands the user there instead of back on the calendar.
sync.serviceUrlYesBase URL the backend uses to reach Sync (e.g. http://localhost:3010). The backend refuses to start without this and internalAuthToken set.
sync.cloudMutationModeNoenabled (default) or maintenance. Maintenance rejects cloud edits/connect with typed MAINTENANCE (503).
sync.executionNopassive (default) or active. Active is required for OAuth begin and provider import/jobs.
sync.maxConcurrencyNoJob concurrency hint for Sync workers.
sync.enforceLeastPrivilegeNoWhen true, Sync verifies its Mongo user cannot read the API database.
sync.compassApiDatabaseNoAPI database name the least-privilege check must be denied access to.
sync.credentialEncryptionKeyYes when any provider is configured32-byte base64 key that encrypts password and OAuth refresh credentials at rest. Required when Google, Microsoft, or Apple calendar is configured (32 bytes of base64; generate with openssl rand -base64 32).

Optional Integrations

keyRequiredDescription
posthog.keyNoPostHog project key injected into the web bundle.
posthog.hostNoPostHog host injected into the web bundle.
stripe.secretKeyNoStripe secret (sk_test_... is fine on staging). All four Stripe keys are required together; omit the whole stripe: block on self-host. Hosted deploys set STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, STRIPE_PRICE_ID, and STRIPE_PUBLISHABLE_KEY on the GitHub Environment; missing any one omits the block.
stripe.webhookSecretNoStripe webhook signing secret.
stripe.priceIdNoStripe Price id for the hosted subscription. The amount lives on that Price in Stripe.
stripe.publishableKeyNoStripe publishable key (pk_test_... is fine on staging). Served to the web as billing.publishableKey on /api/config so Stripe.js can load on the first checkout surface without a rebuild.
email.providerNoresend or log. Omit the whole email: block to keep email off (no enrollment, poller, or send routes). Self-host defaults to off.
email.apiKeyYes when provider is resendResend API key. Required together with from, webhookSecret, and unsubscribeSecret when using resend.
email.fromYes when provider is resendFrom address (for example Compass <hello@mail.compasscalendar.com>).
email.webhookSecretYes when provider is resendResend webhook signing secret (Svix).
email.unsubscribeSecretYes when provider is resendHMAC key for one-click unsubscribe links (openssl rand -base64 32). Rotating this value invalidates outstanding unsubscribe links.
email.scheduleProfileNoreal (default) or fast. fast compresses step delays for staging; config refuses fast when runtime.nodeEnv is production.
email.allowlistNoOptional send-time guard. Non-listed addresses still enroll but sends are skipped until the allowlist is cleared. Matched case-insensitively; empty when omitted.