Skip to main content
Version: 57.2.0

Environment Variables Reference

Comprehensive guide to environment variables used across Terreno packages and example applications.

Build-time client variables: EXPO_PUBLIC_* variables are inlined into the JavaScript bundle at build time. They are not secrets and cannot be changed without rebuilding the web or native export. Set EXPO_PUBLIC_API_URL before bun run export, not on the hosting platform after deploy.

Table columns

ColumnMeaning
Read byPackage or app that reads the variable
RequiredMust be set for production use
SecretTreat as credential — never commit or expose in client bundles
Scopeserver = backend runtime; client = build-time (inlined); tooling = CI/scripts/tests only

Database

VariableRead byRequiredDefaultSecretScope
MONGO_URI@terreno/api, example-backend✅ prodmongodb://localhost:27017Yesserver
MONGODB_URItests, scriptsYestooling
TEST_MONGO_URIexample-backend testsmongodb://localhost:27017/testYestooling
TERRENO_TEST_MONGODB_URI@terreno/testautoYestooling
TERRENO_TEST_USE_MEMORY_MONGO@terreno/testNotooling
TERRENO_TEST_USE_REPLSET@terreno/testNotooling
TERRENO_TEST_USE_FIXTURE_CACHE@terreno/testNotooling
TERRENO_TEST_CACHE_DIR@terreno/testNotooling
BUN_TEST_DISABLE_DBtest harnessNotooling
DEBUG_MONGO_PRELOADtestsNotooling
DEBUG_TEST_TRANSACTIONtestsNotooling

Auth — JWT

VariableRead byRequiredDefaultSecretScope
AUTH_PROVIDER@terreno/apijwtNoserver
TOKEN_SECRET@terreno/api✅ if JWTYesserver
TOKEN_ISSUER@terreno/api✅ if JWTNoserver
REFRESH_TOKEN_SECRET@terreno/api✅ if JWTYesserver
SESSION_SECRET@terreno/api✅ if JWTYesserver
TOKEN_EXPIRES_IN@terreno/api15mNoserver
REFRESH_TOKEN_EXPIRES_IN@terreno/api30dNoserver
SIGNUP_DISABLED@terreno/apifalseNoserver

Auth — Better Auth

VariableRead byRequiredDefaultSecretScope
BETTER_AUTH_SECRET@terreno/api✅ if Better AuthYesserver
BETTER_AUTH_URL@terreno/api✅ if Better AuthNoserver
GOOGLE_CLIENT_ID@terreno/apiNoserver
GOOGLE_CLIENT_SECRET@terreno/apiYesserver
APPLE_CLIENT_ID@terreno/apiNoserver
APPLE_CLIENT_SECRET@terreno/apiYesserver
GITHUB_CLIENT_ID@terreno/apiNoserver
GITHUB_CLIENT_SECRET@terreno/apiYesserver
GITHUB_CALLBACK_URL@terreno/apiNoserver

Server configuration

VariableRead byRequiredDefaultSecretScope
PORT@terreno/api (terrenoApp.ts)9000Noserver
NODE_ENVvariousdevelopmentNoserver
HOSTserversall interfacesNoserver
ENABLE_SWAGGER@terreno/apifalseNoserver
APP_ENVexample-backenddevelopmentNoserver
BACKEND_URLscripts, deployNoserver
FRONTEND_URLexample-backend CORSautoNoserver
API_URLmicroservice splitNoserver
DISABLE_LOG_ALL_REQUESTS@terreno/api loggingNoserver

Client / build-time

VariableRead byRequiredDefaultSecretScope
EXPO_PUBLIC_API_URL@terreno/rtk✅ prod webdev auto-detectNoclient
EXPO_PUBLIC_DEV_API_PORT@terreno/rtk4000Noclient
EXPO_PUBLIC_BUILD_NUMBERexample-frontendNoclient
OPENAPI_URLexample-frontend sdk scripthttp://localhost:4000/openapi.jsonNotooling

app.json extra (not process.env)

Configured in expo.extra and read via expo-constants:

KeyRead byNotes
BASE_URL@terreno/rtkProduction fallback when EXPO_PUBLIC_API_URL unset; use __SAME_ORIGIN__ for same-origin admin SPA
DEV_API_PORT@terreno/rtkOverride dev API port (mirrors EXPO_PUBLIC_DEV_API_PORT)
AUTH_DEBUG@terreno/rtk"true" enables auth debug logs
WEBSOCKETS_DEBUG@terreno/rtk"true" enables socket debug logs
APP_ENV@terreno/rtkLogged at startup

Resolution order for API base URL (rtk/src/constants.ts):

  1. EXPO_PUBLIC_API_URL (production and dev)
  2. extra.BASE_URL (production only, when env unset)
  3. Dev fallbacks: hostUri, experience URL, localhost

AI

VariableRead byRequiredDefaultSecretScope
GEMINI_API_KEY@terreno/aiYesserver
OPENAI_API_KEY@terreno/aiYesserver
GOOGLE_VERTEX_PROJECT@terreno/aiNoserver
GOOGLE_VERTEX_LOCATION@terreno/aiNoserver
GOOGLE_VERTEX_ALLOWED_MODELS@terreno/aiallNoserver
CLAUDE_KEYtoolingYestooling
LANGFUSE_SECRET_KEY@terreno/aiYesserver
LANGFUSE_PUBLIC_KEY@terreno/aiNoserver
LANGFUSE_BASE_URL@terreno/aiNoserver
LANGFUSE_ORGANIZATION@terreno/aiNoserver
LANGFUSE_PROJECT@terreno/aiNoserver
LANGFUSE_PROJECT_ID@terreno/aiNoserver

Storage (GCS)

VariableRead byRequiredDefaultSecretScope
GCS_BUCKETexample-backend, adminNoserver
GCS_PROJECT_IDGCS clientsNoserver
GCS_SERVICE_ACCOUNT_KEYGCS clientsYesserver

Feature flags

VariableRead byRequiredDefaultSecretScope
FEATURE_FLAGS_DEBUG@terreno/feature-flagsNoserver

Communications

VariableRead byRequiredDefaultSecretScope
COMMS_ENABLEDexample-backendtrueNoserver
COMMS_DEFAULT_FROMexample-backend / @terreno/commsNoserver
COMMS_DEFAULT_FROM_NAMEexample-backendNoserver
SENDGRID_API_KEY@terreno/comms/adapters/sendgridYesserver
SENDGRID_SANDBOX_MODEexample-backendNoserver

Set COMMS_ENABLED=false to omit the example backend's communications plugin and routes. When SENDGRID_API_KEY is set, the example backend registers SendGridMailProvider (optional peer @sendgrid/mail). Without a key, non-production environments keep the console mail provider; production leaves mail unconfigured until a provider is wired. SENDGRID_SANDBOX_MODE=true forces SendGrid sandbox mode for non-test runtimes. Sender identity must be verified in SendGrid before real delivery works.

Observability

VariableRead byRequiredDefaultSecretScope
SENTRY_DSN@terreno/api, frontendsNoserver / client
SENTRY_ENVIRONMENTSentry SDKNoserver
SENTRY_TRACES_SAMPLE_RATESentry SDKNoserver
USE_SENTRY_LOGGING@terreno/apifalseNoserver
SLOW_REQUEST_THRESHOLD_MS@terreno/api5000Noserver
SLOW_DB_QUERY_THRESHOLD_MS@terreno/api100Noserver
TERRENO_LOG_FILEloggerNoserver
TRACE_SAMPLING_RATEexample-backend OTEL0.1Noserver
MEMORY_SAMPLE_INTERVAL_MSexample-backend60000Noserver
JOB_TRACE_LOGSworkersNoserver

Caching

VariableRead byRequiredDefaultSecretScope
VALKEY_URL@terreno/apiYesserver
REDIS_URLvariousYesserver

Webhooks & notifications

VariableRead byRequiredDefaultSecretScope
SLACK_WEBHOOKS@terreno/apiYesserver
SLACK_WEBHOOK_URLscriptsYesserver
GOOGLE_CHAT_WEBHOOKS@terreno/apiYesserver
GOOGLE_CHAT_WEBHOOK_URLscriptsYesserver
ZOOM_CHAT_WEBHOOKS@terreno/apiYesserver
ZOOM_WEBHOOK_URLscriptsYesserver
WEBHOOK_SECRETwebhooksYesserver

Admin SPA

VariableRead byRequiredDefaultSecretScope
ADMIN_SPA_ENABLEDexample-backendNoserver
ADMIN_SPA_DIST_DIRexample-backend DockerfileNoserver
ADMIN_SPA_DEV_PROXYadmin-spa pluginNoserver
ADMIN_SPA_BACKEND_URLadmin-spa testsNotooling
ADMIN_SPA_E2E_EMAILe2eNotooling
ADMIN_SPA_E2E_PASSWORDe2eYestooling

MCP server

VariableRead byRequiredDefaultSecretScope
MCP_SERVER_URLMCP clientsNotooling
TERRENO_MCP_DOCS_DIR@terreno/mcpNotooling
TERRENO_MCP_EVALMCP evalNotooling
TERRENO_PROJECT_ROOTMCP localNotooling

Example backend (app-specific)

VariableRead byRequiredDefaultSecretScope
FLOURISH_SERVICEOpenTelemetryflourish-backendNoserver
PR_NUMBERPR preview deployNoserver
PR_SERVICE_URLPR preview deployNoserver
DEFAULT_PAGE_SIZEConfiguration model20Noserver
CRON_SECRET_KEYtestsYestooling
WIDGET_CLIENT_SECRETwidgetsYesserver
API_KEYintegrationsYesserver

Testing & CI (tooling only)

VariableRead byScope
CICI scriptstooling
JEST_WORKER_IDtest runnerstooling
SHOW_ALL_TEST_LOGSteststooling
KEEP_COVERAGEteststooling
DRY_RUNscriptstooling
APPIUM_CI, APPIUM_DEV_SERVER_URL, APPIUM_QUICK_LOOP, APPIUM_REQUIRE_NON_DEV_CLIENT, APPIUM_SPEC_FILE_RETRIES, APPIUM_SPECSAppium e2etooling
ANDROID_APP_PATH, ANDROID_DEVICE_NAMEmobile e2etooling
IOS_APP_PATH, IOS_DEVICE_NAME, IOS_DEVICE_UDID, IOS_PLATFORM_VERSIONmobile e2etooling
EXPO_OSExpo toolingtooling
DEMO_URL, DOCS_URLlink checkerstooling
DEBUG_BILLINGdebugtooling
TZteststooling
Xdebug flagtooling

Example .env files