Skip to content

Environment reference

The canonical list lives in .env.example. This page groups variables by purpose.

Required

Variable Purpose
API_ID my.telegram.org API id
API_HASH my.telegram.org API hash
BOT_TOKEN @BotFather token
MONGO_URI MongoDB connection string
ADMIN_IDS Comma-separated Telegram user ids
ADMIN_CHANNEL_ID Forum supergroup id (-100…)

Telegram session

Variable Default Notes
SESSION_DIR "." Directory pyrofork writes *.session to. On ephemeral hosts (Railway, Render, Fly, Heroku) point this at a persistent volume (e.g. /data) or every deploy re-runs auth.ImportBotAuthorization and Telegram rate-limits the bot with FLOOD_WAIT_X.

Logging

LOG_LEVEL, LOG_JSON, DEBUG_MODE, ERROR_LOG_TOPIC_ID.

SLA / auto-close / cooldown

SLA_WARN_MINUTES, SLA_BREACH_MINUTES, AUTO_CLOSE_DAYS, AUTO_CLOSE_SWEEP_MINUTES, COOLDOWN_RATE, COOLDOWN_WINDOW, COOLDOWN_MUTE_SECONDS.

i18n

DEFAULT_LANG (default en).

Redis (optional)

REDIS_URL, REDIS_NAMESPACE.

AI (optional)

AI_ENABLED, AI_MODEL_DEFAULT, AI_MODEL_FAST, AI_MODEL_VISION, AI_MODEL_TRANSCRIBE, AI_MAX_TOKENS, AI_TEMPERATURE, AI_REQUEST_TIMEOUT_S, AI_PII_REDACTION. Provider keys: ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY.

Feature flags

FEATURE_AI_DRAFTS, FEATURE_AI_SUMMARY, FEATURE_AI_SENTIMENT, FEATURE_AI_ROUTING, FEATURE_AI_TRANSLATE, FEATURE_AI_TRANSCRIBE, FEATURE_AI_KB_DRAFTER, FEATURE_BUSINESS_HOURS, FEATURE_CSAT, FEATURE_ANALYTICS_DIGEST, FEATURE_KB_GATE, FEATURE_LINK_SCANNER, FEATURE_START_CAPTCHA, FEATURE_WEBHOOKS_OUT, FEATURE_DISCORD_BRIDGE, FEATURE_SLACK_BRIDGE, FEATURE_EMAIL_INGRESS, FEATURE_NEW_ONBOARDING, FEATURE_CUSTOMER_HISTORY_PIN, FEATURE_AGENT_INBOX.

Integrations

WEBHOOK_SECRET, CAPTCHA_SECRET, DISCORD_WEBHOOK_URL, SLACK_WEBHOOK_URL, DIGEST_TOPIC_ID.

REST API

Variable Default Notes
API_ENABLED false Set true to serve the FastAPI app alongside pyrofork
API_HOST 0.0.0.0 Bind address
API_PORT 8000 Local bind port; $PORT (Railway / Render / Fly / Heroku) takes precedence via settings.effective_api_port
API_CORS_ORIGINS "" Comma-separated allow-list; * allows everything
API_RATE_LIMIT_PER_MINUTE 120 Per-key token bucket; needs Redis for multi-replica

Scopes recognised by /apikey create: tickets:read, tickets:write, projects:read, projects:write, users:read, analytics:read, webhooks:write, rules:read, rules:write, admin:full.

See also API quickstart, API authentication, and the dedicated Railway guide.

Admin SPA

Variable Default Notes
WEB_ENABLED true Mount the built React SPA at / with an index.html fallback so React-Router paths survive a refresh
WEB_DIST_DIR web/dist Path (from repo root) to the build output; override only if your CI puts it somewhere else

Dual-mode UI (Telegram WebApp)

See Web App feature and the dedicated Deploy the Web App guide for the full story.

Variable Default Notes
UI_MODE chat chat / webapp / hybrid. Typo-tolerant — unknown values fall back to chat
WEBAPP_URL "" Public HTTPS URL of the Mini-App. Must match the WebApp domain configured via @BotFather
WEBAPP_SET_MENU_BUTTON false When true, the bot calls setChatMenuButton at boot so every chat shows a persistent "Open App" button
WEBAPP_MENU_BUTTON_TEXT Open App Label for the global menu button

Per-user overrides (users.ui_pref + graceful fallback for old clients or empty WEBAPP_URL) are described in the feature doc.

Observability

METRICS_ENABLED, METRICS_PATH, OTEL_SERVICE_NAME, OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_PROTOCOL, OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG.