A self-hosted SAALT instance is configured through environment variables. This page lists every variable that SAALT core and the document parser read, with the default value and what the variable does.
How to set variables with Helm
With the Helm chart, set variables in your values file:
Code
Values are strings. Quote numbers and booleans ("true", "6379"). A variable in core.env overrides the value the chart sets for the same name.
Variables marked Set by the chart are filled in automatically by the Helm chart. You only need to set them yourself if you run SAALT without the chart, or want to override them.
Core: required
| Variable | Default | Description |
|---|---|---|
APP_URL | — | Public URL users reach SAALT on, for example https://saalt.example.com. Used for sign-in callbacks, links in emails and file URLs. SAALT doesn't start without it. Set by the chart from appUrl. |
APP_SECRET | — | Exactly 64 hexadecimal characters. Signs sessions and tokens and encrypts stored credentials. Generate it with openssl rand -hex 32. Keep it stable: changing it signs everyone out and makes stored credentials unreadable. |
DATABASE_URL | — | PostgreSQL connection string, for example postgresql://user:password@host:5432/saalt. The database needs the pgvector extension. Set by the chart when the bundled PostgreSQL is enabled. |
Core: networking
| Variable | Default | Description |
|---|---|---|
INTERNAL_APP_URL | APP_URL | Address the document parser uses to call back into core from inside the cluster — including the URLs of locally stored files it parses — so traffic doesn't leave through the public URL. Set by the chart to the core Service. |
PORT | 3000 | Port the core HTTP server listens on. |
NODE_ENV | — | Set to production for any real deployment. Set by the chart. |
API_BASE_URL | SAALT service | Address of the SAALT license and configuration service. Leave unset unless SAALT asks you to change it. |
SAALT_LICENSE_KEY | — | License key of the instance (Core 1.6.0 and later). When set, it takes precedence over a key entered in Admin → Global Settings, and the field there can no longer be edited. Useful for automated installs. |
Core: Redis
Core and the document parser must use the same Redis and the same key prefix.
| Variable | Default | Description |
|---|---|---|
REDIS_HOST | localhost | Redis host. Set by the chart when the bundled Redis is enabled. |
REDIS_PORT | 6379 | Redis port. Set by the chart. |
REDIS_PASSWORD | — | Redis password. Set by the chart when the bundled Redis is enabled. |
REDIS_USER | — | Redis username (Redis ACL). |
REDIS_KEY_PREFIX | oak | Prefix for all cache keys and job queues. Set a different prefix when several SAALT instances share one Redis. Must match the document parser. |
REDIS_CONNECTION_STRING | — | Full Redis URL. When set, core ignores the host, port, user and password variables. The document parser doesn't support it, so set the separate variables there. |
Core: models
| Variable | Default | Description |
|---|---|---|
CLIENT_MODEL_CONFIG_ENABLED | off | true lets super admins choose the active models in Admin → Models. Off means the instance uses the model list from the SAALT configuration service. Set by the chart to true. |
LITELLM_BASE_URL | — | Root URL of a LiteLLM proxy, without /v1. SAALT imports the model list from it and sends chat and embedding requests through it. |
LITELLM_API_KEY | — | Key for the LiteLLM proxy. |
OPENAI_API_KEY | — | OpenAI API key. Needed for OpenAI models and to list them in Admin → Models. |
ANTHROPIC_API_KEY | — | Anthropic API key. Needed for Anthropic models. |
GOOGLE_GENERATIVE_AI_API_KEY | — | Google AI Studio (Gemini) API key. Needed for Gemini models, speech and transcription. |
GOOGLE_CLOUD_PROJECT | — | Google Cloud project for Vertex AI models. Required to use and list Vertex models. Authentication uses Google Application Default Credentials (for example Workload Identity, or GOOGLE_APPLICATION_CREDENTIALS pointing at a service-account key file). |
CUSTOM_LLM_<NAME> | — | API key for a model you added by hand in Admin → Models → Add model. The name must start with CUSTOM_LLM_ and use only A–Z, 0–9 and _, for example CUSTOM_LLM_MY_VLLM. Enter the same name in the model form. |
You only need keys for the providers you use. With LiteLLM, LITELLM_BASE_URL and LITELLM_API_KEY are usually the only model variables.
Core: Knowledge and web search
| Variable | Default | Description |
|---|---|---|
RERANKER_URL | SAALT endpoint | Endpoint of the reranker that re-orders Knowledge search results. If unset, search queries are sent to a reranker operated by SAALT. Set your own endpoint to keep queries inside your infrastructure. |
RERANKER_MODEL | qwen3-reranker-8b-fp16 | Model name sent to the reranker. |
RERANKER_AUTHORIZATION | — | Value of the Authorization header sent to the reranker. |
RAPTOR_ENABLED | off | true builds hierarchical summaries of Knowledge documents, which improves answers to broad questions about large documents. Costs extra model calls per document. |
TAVILY_API_KEY | — | Tavily API key. Enables the web search Tool for models without built-in web search. |
Core: sign-in
Email and password sign-in is on by default. Google and Microsoft sign-in turn on when both of their variables are set.
| Variable | Default | Description |
|---|---|---|
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | — | OAuth client for Sign in with Google. Use <APP_URL>/api/auth/callback/google as the redirect URI. |
MICROSOFT_CLIENT_ID / MICROSOFT_CLIENT_SECRET | — | OAuth app for Sign in with Microsoft. Use <APP_URL>/api/auth/callback/microsoft as the redirect URI. |
DISABLE_PASSWORD_AUTH | off | true removes email and password sign-in, registration and password reset, so users can only sign in with Google or Microsoft. |
Core: email
SAALT sends invitations and password-reset emails over SMTP.
| Variable | Default | Description |
|---|---|---|
SMTP_HOST | — | SMTP server. Without it, SAALT can't send email. |
SMTP_PORT | 587 | SMTP port. Port 465 uses implicit TLS, other ports use STARTTLS. |
SMTP_USER / SMTP_PASSWORD | — | SMTP credentials. |
SENDER_EMAIL | — | From address of outgoing email. |
SENDER_NAME | SAALT | From display name. |
Core: file storage
Uploaded files are stored on local disk unless a Google Cloud Storage bucket is configured.
| Variable | Default | Description |
|---|---|---|
LOCAL_STORAGE_PATH | ./storage | Folder for uploaded files when local storage is used. The Helm chart mounts its volume at /app/storage, which is this default. |
GOOGLE_CLOUD_STORAGE_BUCKET | — | When set, files are stored in this Google Cloud Storage bucket instead of on disk. |
GOOGLE_CLOUD_STORAGE_PROJECT_ID | — | Google Cloud project of the bucket. |
GOOGLE_CLOUD_STORAGE_PATH_PREFIX | — | Folder prefix inside the bucket, for example to share one bucket between instances. |
Core: usage limits
Optional per-user token quotas.
| Variable | Default | Description |
|---|---|---|
USAGE_LIMITS_ENABLED | off | true turns on a weekly quota and a rolling 5-hour quota per user. |
USAGE_WEEKLY_LIMIT | 50000 | Weekly quota per user, in token equivalents of the reference model. |
USAGE_WINDOW_LIMIT | 20000 | Quota per user for any 5-hour window. |
USAGE_FALLBACK_MODEL_KEY | — | Model users are switched to after they exceed a quota, so they can keep working on a cheaper model. Without it, nothing switches. |
Core: analytics
| Variable | Default | Description |
|---|---|---|
POSTHOG_KEY | — | PostHog project key. Product analytics are off when unset. |
POSTHOG_HOST | — | PostHog host, for example https://eu.i.posthog.com or your self-hosted PostHog. |
POSTHOG_CHAT_SURVEY_ID, POSTHOG_CHAT_SURVEY_QUESTION_ID, POSTHOG_CHAT_SURVEY_COMMENT_QUESTION_ID | — | PostHog survey and question ids for the occasional "How is SAALT doing so far?" rating in chat (Core 1.6.0 and later). The rating is off while any of them is empty. |
Core: Skills and MCP
| Variable | Default | Description |
|---|---|---|
PLATFORM_GUIDE_ZIP_URL | https://docs.saalt.ai/skills/platform-guide.zip | Source of the built-in platform-guide Skill every Agent knows (Core 1.6.0 and later). It is checked against the .sha256 file next to it; if the download fails, the previously imported version stays. |
MCP_<SLUG>_OAUTH_CLIENT_ID, MCP_<SLUG>_OAUTH_CLIENT_SECRET, MCP_<SLUG>_OAUTH_SCOPES, MCP_<SLUG>_OAUTH_AUDIENCE, MCP_<SLUG>_OAUTH_RESOURCE | — | OAuth app for a catalog MCP server's Sign in with … option managed by SAALT (Core 1.6.0 and later). Users still sign in with their own accounts. <SLUG> is the catalog id in upper case with other characters replaced by _, for example MCP_MICROSOFT_SHAREPOINT_…. |
MCP_<SLUG>_AUTHORIZATION | — | Credential for a catalog MCP server's Shared access option: one account for every user, sent as the Authorization header. |
MCP_<SLUG>_URL_<KEY> | — | Prefills a value in the server URL, for example a tenant id. |
A managed option is only offered when its variables are set, and the credentials are never stored in the database or sent to the browser. See MCP servers.
Document parser
The document parser converts uploaded files into text for Knowledge. It receives its model settings with each job from core, so it needs no model keys.
| Variable | Default | Description |
|---|---|---|
REDIS_HOST, REDIS_PORT, REDIS_USER, REDIS_PASSWORD | localhost, 6379, —, — | Same Redis as core. Set by the chart when the bundled Redis is enabled. |
REDIS_KEY_PREFIX | oak | Must match core. |
TESSERACT_LANG | eng+deu | Languages for OCR of scanned documents without a vision model, joined with +. The default image includes English and German. |
TESSERACT_RENDER_DPI | 150 | Resolution scanned pages are rendered at for OCR. Higher is more accurate and slower. |
TESSERACT_CONCURRENCY | 0 | Parallel OCR workers. 0 uses all available CPUs. |
TESSERACT_MIN_CHARS_PER_PAGE | 50 | Pages with less extracted text than this are treated as scanned and sent to OCR. |
MARKITDOWN_OCR_CONCURRENCY | 4 | Parallel requests when a vision model reads scanned pages. |
LLM_REQUEST_TIMEOUT_SECONDS | 180 | Timeout per vision-model request. |
LLM_REQUEST_MAX_RETRIES | 3 | Retries per failed vision-model request. |
DOCUMENT_PARSE_TIMEOUT_SECONDS | 7200 | Maximum time for one document. |
LIBREOFFICE_TIMEOUT_SECONDS | 900 | Maximum time to convert one Office document. |
SENTRY_DSN | — | Sentry DSN for error reporting. Off when unset. |