Environment Variables
Complete reference for all Quackback configuration options.
Complete reference for all Quackback configuration options. Copy .env.example to .env and fill in your values.
Required Variables
Warning:
These variables must be set for Quackback to run.
Variable | Description | Example |
|---|---|---|
| PostgreSQL connection string |
|
| Public URL for your instance (used for auth, emails, and OAuth callbacks) |
|
| Port the application server listens on |
|
| Secret key for authentication and encryption (32+ chars). Used for session signing and deriving encryption keys. |
|
| Redis/Dragonfly connection for background job queue (BullMQ). Dragonfly is included in docker-compose. |
|
Database connection tuning
Note:
These are optional. The defaults work for most deployments. Tune them only if you've measured a connection-pool bottleneck.
Variable | Default | Description |
|---|---|---|
|
| Max Postgres connections this process opens. The default is role-aware: worker replicas get a larger pool since they run more concurrent jobs. |
|
| Seconds an idle pooled connection stays open before closing (1-3600). |
Reverse proxy
Variable | Default | Description |
|---|---|---|
|
| Number of trusted reverse-proxy hops allowed to supply client-IP headers ( |
Server Roles
Tip:
Single-container self-hosters can skip this. The default already does what you want. Read Scale with multiple replicas before splitting roles.
Variable | Default | Description |
|---|---|---|
|
| Controls whether this process runs background workers. |
Email Configuration
Configure email delivery for OTP codes, notifications, and invitations.
Tip:
If email is not configured, OTP codes and other emails are printed to the console. This is useful for local development.
Priority order: SMTP (if configured) > Resend (if configured) > Console logging.
SMTP
Variable | Description | Example |
|---|---|---|
| SMTP server hostname |
|
| SMTP port |
|
| SMTP username |
|
| SMTP password |
|
| Use TLS (for port 465) |
|
| Sender email address |
|
Resend
Variable | Description | Example |
|---|---|---|
| Resend API key |
|
| Sender email address |
|
Inbound Email
Lets a visitor's email reply thread back into their conversation. Two independent ways to receive inbound mail: configure the one that fits your deployment, or both.
Provider webhook
Variable | Description |
|---|---|
| Receiving domain (e.g. a Resend inbound domain). Agent replies use |
| The provider's webhook signing secret (Svix |
Both must be set together. Point the provider's inbound webhook at <BASE_URL>/api/chat/email/inbound.
IMAP polling
Self-hosted alternative that needs no public webhook endpoint. See Receive email over IMAP for the full guide.
Variable | Default | Description |
|---|---|---|
| unset | Set to |
| required | IMAP server hostname |
|
| IMAP server port |
| required | Mailbox username |
| required | Mailbox password |
|
| Set to |
|
| Mailbox to poll |
Note:
EMAIL_INBOUND_PROVIDER,IMAP_HOST,IMAP_USER, andIMAP_PASSWORDare required together. The poller never connects unless all four are set.
OAuth Providers
Enable social login for portal users and team members.
GitHub
Variable | Description |
|---|---|
| GitHub OAuth App client ID |
| GitHub OAuth App client secret |
Create at: GitHub Developer Settings
Callback URL: https://your-domain.com/api/auth/callback/github
Variable | Description |
|---|---|
| Google OAuth client ID |
| Google OAuth client secret |
Create at: Google Cloud Console
Callback URL: https://your-domain.com/api/auth/callback/google
Note:
Integration credentials (Slack, Microsoft Teams, Linear, etc.) are configured through the admin UI and stored securely in the database, not as environment variables.
Realtime Chat Transport
Variable | Default | Description |
|---|---|---|
|
|
|
AI
Enable AI features: post summaries, duplicate detection, feedback extraction, and help center semantic search. AI is off unless you set the key, the endpoint, and a model for each role -- Quackback works with any OpenAI-compatible endpoint but never assumes one.
Variable | Description | Example |
|---|---|---|
| API key for your AI endpoint |
|
| OpenAI-compatible endpoint. Required -- there is no default |
|
| Default model for chat features (summaries, suggestions, merge verification) |
|
| Model for embeddings (duplicate detection, semantic search) |
|
| Per-feature override of |
|
| Per-feature override for sentiment analysis |
|
| Per-feature override for suggestion extraction |
|
| Per-feature override for the suggestion quality gate |
|
| Per-feature override for feedback interpretation |
|
| Per-feature override for merge verification |
|
| Per-feature override for help center Ask AI |
|
| Per-feature override for help center article auto-translation |
|
| Per-feature override for the Quinn AI assistant |
|
| Per-feature override for inbox message translation |
|
| Per-feature override for ticket/message classification |
|
Per-feature overrides fall back to AI_CHAT_MODEL when unset. Set an override to off to disable just that feature. Use model ids your endpoint accepts -- gateways typically want provider-prefixed ids like google/gemini-3.1-flash-lite-preview.
Note:
Before v0.12.0,OPENAI_API_KEYalone enabled AI with an implicit OpenAI endpoint and built-in model names. If you upgraded and AI features turned off, addOPENAI_BASE_URL,AI_CHAT_MODEL, andAI_EMBEDDING_MODEL.
File Storage
S3-compatible storage for image uploads in changelogs and rich text content. Supports AWS S3, Cloudflare R2, Backblaze B2, MinIO, and other S3-compatible services.
Note:
If not configured, image upload is disabled in the rich text editor. For local development, MinIO is included indocker-composeand configured by default. Runbun run setupto start it.
Variable | Description | Example |
|---|---|---|
| S3 endpoint URL (leave empty for AWS S3) |
|
| S3 bucket name |
|
| S3 region |
|
| S3 access key |
|
| S3 secret key |
|
| Use path-style URLs (required for MinIO, R2) |
|
| Public URL for uploaded files (optional) |
|
Telemetry
Anonymous usage statistics help improve Quackback. Telemetry is enabled by default and can be disabled via environment variable.
Variable | Description | Example |
|---|---|---|
| Set to |
|
Logging
The server emits structured JSON logs to stdout, one object per line, ready for any log shipper (Grafana Alloy, Promtail, Fluent Bit, Vector).
Variable | Default | Description | Example |
|---|---|---|---|
|
| Verbosity: |
|
Docker Startup
Note:
Both variables below are read by the container's entrypoint script, not the Zod-validated app config. They apply to any Docker deployment (Compose ordocker run).
Variable | Default | Description |
|---|---|---|
|
| Set to |
|
| Set to |
Docker Compose Variables
Note:
These variables configure the compose stack (docker-compose.prod.yml) itself, not the application. The app never reads them directly. Compose uses them to name containers and to fill in values likePOSTGRES_PASSWORDthat the stack then wires intoDATABASE_URLfor you. See Deploy with Docker.
Variable | Default | Description |
|---|---|---|
|
| Image tag to run. Pin to a specific release in production. |
|
| Host port the app is published on. The container always listens on 3000 internally. |
|
| Name Compose uses for the project's containers, network, and volumes. |
|
| Bundled PostgreSQL username. |
| required | Bundled PostgreSQL password. |
|
| Bundled PostgreSQL database name. |
|
| Bundled MinIO root user. Doubles as the app's |
| required | Bundled MinIO root password. Doubles as the app's |
|
| Pinned MinIO image tag. |
|
| Pinned MinIO client ( |
Complete Example
# ===================
# Required
# ===================
DATABASE_URL="postgresql://postgres:password@localhost:5432/quackback"
SECRET_KEY="your-32-character-minimum-secret-key-here"
BASE_URL="https://feedback.yourcompany.com"
REDIS_URL="redis://localhost:6379"
# ===================
# Email (choose one)
# ===================
# SMTP
EMAIL_SMTP_HOST="smtp.sendgrid.net"
EMAIL_SMTP_PORT="587"
EMAIL_SMTP_USER="apikey"
EMAIL_SMTP_PASS="SG.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
EMAIL_FROM="Quackback <[email protected]>"
# Or Resend
# EMAIL_RESEND_API_KEY="re_xxxxxxxxxxxx"
# EMAIL_FROM="Quackback <[email protected]>"
# ===================
# OAuth (optional)
# ===================
GITHUB_CLIENT_ID="your-github-client-id"
GITHUB_CLIENT_SECRET="your-github-client-secret"
GOOGLE_CLIENT_ID="your-google-client-id"
GOOGLE_CLIENT_SECRET="your-google-client-secret"
# ===================
# Telemetry (optional)
# ===================
# DISABLE_TELEMETRY="true"
Validation
Note:
Quackback validates required variables on startup. Missing variables will cause the application to fail with a clear error message indicating which variables are missing.
Was this helpful?
Your feedback shapes what we write next.