G Growreplies docs

Operate

Environment variables

Pitchbar reads its configuration from the standard Laravel .env, with overrides for some keys available via the platform admin's App Settings page so you can swap Stripe / mail / LLM credentials without redeploying.

Required

VariableWhy
APP_KEYEncryption master key. Generate with php artisan key:generate. Never rotate without a re-encrypt migration.
APP_URLPublic URL, used to build widget snippets, OAuth callbacks, signed URLs.
DB_*Postgres connection.
REDIS_HOSTCache, sessions, queue, hot-path retrieval cache, conversation history cache.
QUEUE_CONNECTIONSet to redis in production.
SESSION_DRIVERredis in production.
CACHE_DRIVERredis.
WIDGET_JWT_SECRETHS256 signing secret for visitor JWTs. ≥ 32 random bytes.

LLM provider

At least one of the following:

VariableProvider
CLOUDFLARE_ACCOUNT_ID + CLOUDFLARE_API_TOKENCloudflare Workers AI (preferred). Auto-binds Llama 3.3 70B + bge-base-en-v1.5.
OPENAI_API_KEYOpenAI direct.
OPENROUTER_API_KEYOpenRouter (router across many providers).

Set LLM_PROVIDER to force a binding (cloudflare, openai, openrouter). When unset, the resolver picks based on which keys are available, in the priority above.

Vector store

VariableProvider
VECTORIZE_INDEXCloudflare Vectorize index name. Uses CLOUDFLARE_ACCOUNT_ID + token.
QDRANT_URL + QDRANT_API_KEYQdrant.

Set VECTOR_PROVIDER to force. Auto-binds based on available keys (Vectorize preferred).

Crawler

VariableStrategy
(uses CLOUDFLARE_*)Cloudflare Browser Rendering. Preferred.
BROWSERLESS_TOKEN + BROWSERLESS_URLBrowserless fallback.
(none)Plain HTTP. Free; no JS rendering.

Stripe

VariablePurpose
STRIPE_KEYPublishable key.
STRIPE_SECRETSecret key. Used for plan sync and Cashier.
STRIPE_WEBHOOK_SECRETSigning secret for incoming webhooks (whsec_…).
CASHIER_CURRENCYDefaults to usd.

Reverb (realtime)

VariablePurpose
REVERB_APP_KEYPublic app key. Embedded in widget init payload.
REVERB_APP_SECRETSecret. Server-side only.
REVERB_APP_IDApp identifier.
REVERB_HOSTPublic hostname for the Reverb server.
REVERB_PORTDefault 8080.
REVERB_SCHEMEwss in production, ws locally.

Mail

VariablePurpose
MAIL_MAILERsmtp / postmark / resend / etc.
MAIL_FROM_ADDRESSSender address. Required.
MAIL_FROM_NAMEDisplay name.
MAIL_HOST / MAIL_PORT / MAIL_USERNAME / MAIL_PASSWORDSMTP credentials.

Branding

VariablePurpose
BRANDING_LABELDefault "Powered by Pitchbar" label. Override in app_settings for white-label.
BRANDING_URLWhere the label links to.
BRANDING_FOOTER_LOGO_PATHStorage path to the footer logo image.

Observability

VariablePurpose
SENTRY_DSNError reporting.
OTEL_EXPORTER_OTLP_ENDPOINTOpenTelemetry collector. Honeycomb / Grafana Cloud.
OTEL_SERVICE_NAMEService name in traces. Default pitchbar.

App Settings overrides

The app_settings singleton row stores plaintext-encrypted overrides for:

  • Stripe secret + webhook secret + publishable key.
  • Mail driver settings.
  • Cloudflare / OpenAI / OpenRouter keys.
  • Branding (label, URL, logo).

The AppSettingsOverrideServiceProvider reads this on boot and merges into config(). Setting things via the admin panel is preferred for production — you don't have to re-deploy when a key rotates.

APP_KEY rotation requires a manual migration. The encrypted columns in app_settings were sealed with the old key; rotating without re-encrypting renders them unreadable.