# Monorepo operator integration application: copy this file to `.env` for local # development and fill in the required values. The Voyant CLI loads local env # files for lifecycle commands. Deployed applications receive configuration # from their platform, and already-set process values remain authoritative. # Never commit `.env` or another file containing secrets. # Runtime URLs. `APP_URL` is the API base and `DASH_BASE_URL` is the dashboard # origin. Match the integration application's local development port (3300). APP_URL="http://localhost:3300/api" DASH_BASE_URL="http://localhost:3300" # Public origin where payment processors can reach this operator's callback. # Set an origin only (no `/api`, `/pay`, query, or fragment). Customer-facing # payment links continue to use PUBLIC_CHECKOUT_BASE_URL when configured. PAYMENT_CALLBACK_BASE_URL="http://localhost:3300" EMAIL_FROM="Voyant " # Database (Postgres). On Node the pooled node-postgres lane is the production # default — set DATABASE_URL_DIRECT to the direct endpoint; DATABASE_URL is the # neon-http/WS fallback. DATABASE_URL="postgresql://user:password@host/dbname?sslmode=require" # DATABASE_URL_DIRECT="postgresql://user:password@direct-host/dbname?sslmode=require" # Auth BETTER_AUTH_ADMIN_SECRET="" BETTER_AUTH_CUSTOMER_SECRET="" SESSION_CLAIMS_ADMIN_SECRET="" SESSION_CLAIMS_CUSTOMER_SECRET="" VOYANT_CHECKOUT_CAPABILITY_SECRET="" INTERNAL_API_KEY="" # The image defaults to the provider bindings compiled from voyant.config.ts. # Override provider selection only through this boot contract; the runtime # derives its internal auth-mode env from adminAuth/customerAuth and does not # read VOYANT_ADMIN_AUTH_MODE or VOYANT_CUSTOMER_AUTH_MODE as selectors. # # A runtime selection using Redis must also declare the concrete binding's two # independent safety properties. Shared keyspaces require REDIS_NAMESPACE; # untrusted networks require rediss:// or authenticated HTTPS REST. # VOYANT_DEPLOYMENT_BINDINGS_JSON='{"providers":{"adminAuth":"voyant-cloud","customerAuth":"better-auth","cache":"redis","sharedState":"postgres","rateLimit":"redis"},"redis":{"isolation":"shared","network":"untrusted"}}' # CUSTOMER_AUTH_GOOGLE_CLIENT_ID="" # CUSTOMER_AUTH_GOOGLE_CLIENT_SECRET="" # CUSTOMER_AUTH_FACEBOOK_CLIENT_ID="" # CUSTOMER_AUTH_FACEBOOK_CLIENT_SECRET="" # CUSTOMER_AUTH_APPLE_CLIENT_ID="" # CUSTOMER_AUTH_APPLE_CLIENT_SECRET="" # Cloud mode broker settings are injected by Voyant Cloud deployments. # VOYANT_CLOUD_ADMIN_AUTH_START_URL="https://dash.voyantcloud.com/admin-auth/start" # VOYANT_CLOUD_ADMIN_AUTH_EXCHANGE_URL="https://api.voyant.travel/cloud/v1/admin-auth/exchange" # VOYANT_CLOUD_ADMIN_AUTH_JWKS_URL="https://api.voyant.travel/.well-known/admin-auth/jwks.json" # VOYANT_CLOUD_ADMIN_AUTH_REVALIDATE_URL="https://api.voyant.travel/cloud/v1/admin-auth/revalidate" # VOYANT_CLOUD_ADMIN_AUTH_AUDIENCE="dep_..." # VOYANT_CLOUD_ADMIN_AUTH_CLIENT_TOKEN="..." # VOYANT_CLOUD_DEPLOYMENT_ID="dep_..." # VOYANT_CLOUD_APP_ID="app_..." # VOYANT_CLOUD_ENVIRONMENT="production" # CORS / URLs (match your dev port, 3300) API_BASE_URL="http://localhost:3300/api" CORS_ALLOWLIST="http://localhost:3300" # Voyant API (email / SMS / verification / Vault / Connect provider). # Optional for local/self-hosted no-cloud development. Leave unset/empty to # disable Cloud-backed realtime and notification delivery. Do not use a dummy # local placeholder; older generated VOYANT_API_KEY="local-dev" values are # treated as unset, and Cloud-backed capabilities now have their own opt-in keys. # VOYANT_API_KEY="vc_..." # Optional deployment-owned HTML-to-PDF service used by contracts, brochures, # and future document outputs. The endpoint accepts Voyant's PdfRenderRequest # JSON and returns application/pdf. Leave unset for the bundled basic fallback. # VOYANT_DOCUMENT_RENDERER_URL="https://renderer.example/v1/pdf" # VOYANT_DOCUMENT_RENDERER_TOKEN="" # VOYANT_DOCUMENT_RENDERER_NAME="self-hosted-playwright" # Hosted Voyant Data FX lookup for finance invoice/payment rates. # Leave unset/empty locally to disable hosted FX lookup. # VOYANT_DATA_API_KEY="vd_..." # VOYANT_CLOUD_API_URL="https://api.voyant.travel" # VOYANT_CLOUD_VAULT_SLUG="main" # Catalog search (postgres indexer). Signs the opaque pagination cursors handed # back to clients, so it must be stable across restarts and secret. The provider # throws at boot when it is missing, which takes the whole application down. POSTGRES_SEARCH_CURSOR_SIGNING_KEY="" # Optional index strategies. Defaults: text "native", typo "none", vector "none". # POSTGRES_SEARCH_TEXT_STRATEGY="native" # POSTGRES_SEARCH_TYPO_STRATEGY="none" # POSTGRES_SEARCH_VECTOR_STRATEGY="none" # KMS provider — "local" for dev, "env" for self-managed symmetric keys, # "gcp" for Cloud KMS, "aws" for AWS KMS, "voyant-cloud" for Vault KMS. KMS_PROVIDER="local" # KMS_PROVIDER=local: master key (base64-encoded 32 bytes). KMS_LOCAL_KEY="" # KMS_PROVIDER=env: master key (base64-encoded 32 bytes). KMS_ENV_KEY="" # KMS_PROVIDER=voyant-cloud only: uses VOYANT_API_KEY, # VOYANT_CLOUD_VAULT_SLUG, and optional VOYANT_CLOUD_API_URL above. # KMS_PROVIDER=aws only: # AWS_REGION="" # AWS_ACCESS_KEY_ID="" # AWS_SECRET_ACCESS_KEY="" # AWS_SESSION_TOKEN="" # AWS_KMS_ENDPOINT="" # AWS_KMS_PEOPLE_KEY_ID="" # AWS_KMS_INTEGRATIONS_KEY_ID="" # KMS_PROVIDER=gcp only: GCP service-account private key as PEM, # newlines escaped as \n. Not needed when KMS_PROVIDER=local. GCP_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n" # Netopia (pay-by-link card processor). `NETOPIA_MODE` picks the API base # (`sandbox` → https://sandbox.netopia-payments.com/pay, `live` → # https://secure.mobilpay.ro/pay). Defaults to `sandbox` so a half- # configured prod deploy fails into the safer environment instead of # charging real cards. `NETOPIA_URL` overrides the resolved base — only # set it for staging proxies or test mocks. # # Sandbox + live both require API key + POS signature issued by Netopia. # `NETOPIA_NOTIFY_URL` must be a publicly reachable HTTPS endpoint that # proxies to `${API_BASE_URL}/v1/admin/finance/providers/netopia/callback`. NETOPIA_MODE="sandbox" # NETOPIA_URL="" NETOPIA_API_KEY="" NETOPIA_POS_SIGNATURE="" # Webhook receiver — genuinely deploy-wide. Netopia POSTs payment results # here, so it must be a single publicly reachable HTTPS endpoint resolving # to ${API_BASE_URL}/v1/admin/finance/providers/netopia/callback. NETOPIA_NOTIFY_URL="" # Default post-payment browser landing. Operator-initiated send-link flows # usually point this at our public ${APP_URL}/pay landing; storefronts # override per session via useCollectPayment({ returnUrl, cancelUrl }). NETOPIA_REDIRECT_URL="" # Per-session language is supplied by the operator UI at collection time # (CollectPaymentDialog.defaultPayerLanguage). NETOPIA_LANGUAGE is only the # deploy-wide fallback for callers that don't pass one. # NETOPIA_LANGUAGE="en" # Voyant Connect catalog source adapter. Source sync discovers active # connections for the operator; quote/book/cancel dispatch uses the # source_connection_id stored on each synced catalog entry. # VOYANT_CONNECT_API_URL="https://api.voyant.travel" # VOYANT_CONNECT_OPERATOR_ID="op_..." # VOYANT_CONNECT_MARKET="default" # VOYANT_CONNECT_SYNC_LIMIT="500" # Manual bank-transfer block rendered on the public payment landing page. # Both BENEFICIARY and IBAN must be set, otherwise the tab is hidden. # Currency is NOT configurable here — it always tracks the booking's # invoice currency. NOTES is deploy-wide boilerplate (e.g. "Please # include your invoice number in the wire reference"); per-call notes # from useCollectPayment({ notes }) override it. BANK_TRANSFER_BENEFICIARY="" BANK_TRANSFER_IBAN="" BANK_TRANSFER_BANK_NAME="" BANK_TRANSFER_NOTES=""