Skip to main content

Configuration

The complete environment-variable reference for IntelliApps — core server, secrets and signed tokens, the three data planes, S3 assets, remote-image fetch, upload/version limits, theming, deployment branding, the ask-the-data LLM, and the Identity Bridge — plus how the service connects to the IntelliAsk stack.

IntelliApps is configured entirely through environment variables (optionally loaded from a local .env file). Every value is validated at startup; in non-development environments the service refuses to boot with placeholder secrets so an insecure deployment can't be created by accident.

Names below are the exact environment-variable names the container reads (case-insensitive). This page covers the core service; the per-feature tuning knobs for published pages live on Published-page features.

Production refuses placeholder secrets

When APP_ENV is not development, the service will not start if HTML_APP_MCP_API_KEY, PREVIEW_SIGNING_SECRET, or DOWNLOAD_SIGNING_SECRET are left at their change-me defaults. Set strong, unique values before deploying.

Core server

NamePurposeDefaultRequired
APP_ENVEnvironment: development, staging, or production. Non-dev enables secret validationdevelopmentNo
SERVICE_HOSTBind address for the server0.0.0.0No
SERVICE_PORTPort the server listens on8000No
MCP_STATELESS_HTTPServe the MCP endpoint in stateless Streamable HTTP modetrueNo
MCP_REQUEST_STATE_SECRETOptional secret for MCP request-state signing(empty)No
HTML_APP_MCP_API_KEYShared service key the IntelliAsk container presents as X-App-Service-Keychange-meYes (prod)
PUBLIC_BASE_URLPublic origin of this service, used to build absolute preview/publish/download URLshttp://localhost:8000Yes (prod)
INTELLIASK_ORIGINThe IntelliAsk app origin — used for the page CSP frame-ancestors, the landing link, and the default sign-in handoff URLhttp://localhost:3080Yes (prod)
PUBLISH_MODEunlisted (shareable-link only) or authenticated (requires an upstream auth proxy)unlistedNo

authenticated publish needs a proxy

PUBLISH_MODE=authenticated requires INTELLIASK_ORIGIN to be set, because the service cannot verify identity itself — it relies on an upstream authenticating proxy. In a non-dev environment it refuses to start otherwise.

Secrets & signed tokens

Previews and downloads are authorised by HMAC-signed, time-limited tokens rather than sessions, so the service stays stateless.

NamePurposeDefaultRequired
PREVIEW_SIGNING_SECRETSecret signing preview tokenschange-me-tooYes (prod)
DOWNLOAD_SIGNING_SECRETSecret signing self-contained-export download tokenschange-me-tooYes (prod)
PREVIEW_TOKEN_TTL_SECONDSLifetime of a preview token3600 (1 h)No
DOWNLOAD_TOKEN_TTL_SECONDSLifetime of a download token900 (15 m)No
PUBLISH_UNLOCK_TTL_SECONDSLifetime of a password-unlock cookie for a protected page28800 (8 h)No

Data planes

Persistence is split into three planes (see Architecture → data planes). Each backend is pluggable; the memory options exist for tests/local runs.

Control plane (MongoDB)

NamePurposeDefaultRequired
PLATFORM_BACKENDmongo (pymongo) or memory (mongomock)mongoNo
MONGO_URLMongoDB connection stringmongodb://localhost:27017Yes (prod)
MONGO_DB_NAMEDatabase name for control-plane collectionsintelliappsNo

App-data plane (PostgreSQL)

NamePurposeDefaultRequired
APPDATA_BACKENDpostgres (psycopg) or memory (in-process)postgresNo
APPDATA_URLPostgreSQL DSN for per-app datasets and live collectionspostgresql://intelliapps:intelliapps@localhost:5432/intelliapps_dataYes (prod)

The app-data plane owns both the generated datasets and each app's live read/write collections (one schema per app, app_<app_id>). The definition and ownership metadata for those collections still lives in the control plane (MongoDB).

Asset plane (S3)

Binary assets an app references (uploaded images, fonts) are stored content-addressed by SHA-256 in S3-compatible object storage, so the service stays stateless and identical bytes are never duplicated across versions.

NamePurposeDefaultRequired
ASSET_BACKENDs3 (boto3 / AWS S3 / MinIO) or memory (in-process)s3No
ASSET_S3_BUCKETBucket for assetsintelliapps-assetsNo
ASSET_S3_ENDPOINT_URLS3 endpoint — empty for AWS, set for MinIO/self-hosted(empty)No
ASSET_S3_REGIONS3 region(empty)No
ASSET_S3_ACCESS_KEY_IDAccess key(empty)Yes (with s3)
ASSET_S3_SECRET_ACCESS_KEYSecret key(empty)Yes (with s3)
ASSET_S3_USE_PATH_STYLEUse path-style addressing (required by MinIO and most self-hosted gateways)trueNo
MAX_ASSET_BYTESPer-file upload cap5000000 (5 MB)No
ALLOWED_ASSET_CONTENT_TYPESComma list of accepted asset content typesimage/png,image/jpeg,image/gif,image/webp,image/svg+xml,font/woff,font/woff2No

Remote image fetch (web-search → asset)

The builder agent can pull an image it found on the web straight into the app's asset plane (the build sandbox has no network of its own, so the service performs the fetch — guarded against SSRF).

NamePurposeDefaultRequired
ASSET_FETCH_ENABLEDAllow the service to fetch remote images into the asset planetrueNo
ASSET_FETCH_TIMEOUT_SECONDSPer-fetch timeout10.0No
ASSET_FETCH_MAX_REDIRECTSMax redirects followed3No
FETCHABLE_IMAGE_CONTENT_TYPESContent types accepted from a remote fetch (images only — never fonts or SVG)image/png,image/jpeg,image/gif,image/webpNo

SSRF guardrails

Remote fetches allow only public http/https hosts (no private/loopback ranges), cap size (MAX_ASSET_BYTES) and time, and reject SVG and internal hosts. Set ASSET_FETCH_ENABLED=false to disable the capability entirely.

Upload & version limits

NamePurposeDefaultRequired
MAX_HTML_BYTESMax size of a saved app's HTML2000000 (2 MB)No
MAX_DATASET_IMPORT_ROWS_PER_CALLHard cap on rows accepted in one import call1000No
MAX_DATASET_IMPORT_PAYLOAD_BYTESHard cap on one import call's payload size5000000 (5 MB)No
MAX_SNAPSHOT_DATA_BYTESMax dataset bytes snapshotted into a version25000000 (25 MB)No
DATASET_IMPORT_RECOMMENDED_ROWS_PER_CHUNKRows the builder is advised to send per append_dataset_rows call500No
STALE_IMPORT_TTL_SECONDSAbandoned, never-finished imports older than this are swept (0 disables)86400 (24 h)No
MAX_VERSIONS_RETAINEDImmutable versions kept per app; the current and published versions are always retained (0 = unlimited)0No

Theming

A served page's visual theme comes from /runtime/app-base.css. The choices are go-light, go-dark, light, dark, plus the none sentinel (platform theming off — the app's own CSS fully owns the page).

NamePurposeDefaultRequired
DEFAULT_THEMETheme applied to apps that haven't pinned their owngo-lightNo
DEFAULT_THEME_ROTATIONComma/space list seeded onto new apps as their theme-switcher rotation (e.g. go-light,go-dark); empty = new apps ship no switcher(empty)No

When configured, a logo is base64-inlined into every app's data bootstrap and auto-rendered in a page corner, surviving preview, publish, and the offline export (which has no server). Priority when several are set: data URI → URL → path.

NamePurposeDefaultRequired
BRAND_LOGO_PATHFilesystem path to the logo image (svg/png/jpg/webp/gif). Empty disables the whole feature(empty)No
BRAND_LOGO_DATA_URIThe logo supplied inline as a data:image/...;base64,... string (no file mount needed). Wins over the others(empty)No
BRAND_LOGO_URLPublic http(s) URL the server fetches once (SSRF-guarded) and inlines. PNG/JPEG/GIF/WebP only(empty)No
BRAND_LOGO_ALTAlt text; empty means the logo is treated as decorative (aria-hidden)(empty)No
BRAND_LOGO_PLACEMENTDefault corner: top-left, top-right, bottom-left, bottom-righttop-rightNo
BRAND_LOGO_DEFAULT_ONWhether apps show the logo by default (true) or only on explicit opt-in (false)trueNo

Ask-the-data LLM

The published-page ask-the-data chat routes viewer questions back through IntelliAsk's model gateway using a service key. The cleanest setup is to leave the overrides blank and let it reuse the same chat credentials the IntelliAsk container already has (the ANTHROPIC_* values) — deploying in the same stack then needs no new LLM secrets.

NamePurposeDefaultRequired
ASK_LLM_PROVIDERWire format: openai, anthropic, or empty to infer(empty)No
ASK_LLM_BASE_URLOpenAI-compatible gateway base (e.g. https://gateway/v1)(empty)No
ASK_LLM_API_KEYGateway API key(empty)No
ASK_LLM_MODELModel id; blank inherits the stack's default chat model(empty)No
ASK_LLM_MODELSJSON array of selectable model profiles (see below)(empty)No

Multiple selectable models

ASK_LLM_MODELS is a JSON array of profiles so each app can pick its own model. Any omitted provider/base_url/api_key inherits the effective defaults, so a single shared gateway sets its secret once and each extra model is just {"name","model"}:

[
  { "name": "haiku", "label": "Claude Haiku 4.5", "model": "claude-haiku-4-5" },
  { "name": "gpt4o", "label": "GPT-4o", "provider": "openai",
    "base_url": "https://gw/v1", "api_key": "${GW_KEY}", "model": "gpt-4o" }
]

The first entry is the default when an app doesn't choose. When empty, a single implicit profile is synthesized from the effective defaults.

Shared IntelliAsk chat provider (fallback)

Used whenever the ASK_LLM_* overrides are blank — mirror the env the IntelliAsk (LibreChat) container already sets:

NamePurposeDefaultRequired
ANTHROPIC_API_KEYChat provider key reused by ask-the-data(empty)No
ANTHROPIC_REVERSE_PROXYReverse-proxy base (e.g. https://<host>/anthropic/)(empty)No
ANTHROPIC_MODELSComma list; the first entry is the default model(empty)No

Ask-the-data limits

NamePurposeDefaultRequired
ASK_DATA_MAX_QUESTION_CHARSMax characters per viewer question1000No
ASK_DATA_MAX_CONTEXT_BYTESMax dataset JSON bytes sent as context (larger is truncated)200000No
ASK_DATA_MAX_PAGE_CHARSMax page text used as grounding when the app has no dataset24000No
ASK_DATA_RATE_PER_MINQuestions per client fingerprint per 60 s (0 disables)15No
ASK_DATA_MAX_ANSWER_TOKENSUpper bound on answer length800No
ASK_DATA_TIMEOUT_SECONDSHTTP timeout for the model call45.0No

Identity Bridge

Deployment/org policy defaults for the two identity planes (see Security → Identity Bridge).

NamePurposeDefaultRequired
IDENTITY_PLATFORM_DEFAULTWhether a new app uses the authenticated IntelliAsk identity for platform featurestrueNo
IDENTITY_APP_CLAIMS_ALLOWEDOrg allow-list — the claims an app owner may ever expose to generated app codeid, nickname, display_name, first_name, last_name, email, avatar_urlNo
IDENTITY_APP_DEFAULT_CLAIMSClaims pre-selected when an owner first enables App Code Identity (intersected with the allow-list)(full approved profile)No
IDENTITY_GUEST_NAME_MAX_CHARSMax characters for a platform-feature guest display name60No
IDENTITY_VIEW_TOKEN_TTL_SECONDSLifetime of the signed identity token in an embedded view_url600 (10 m)No
IDENTITY_COOKIE_TTL_SECONDSLifetime of the per-viewer identity cookie set from a valid view token28800 (8 h)No
IDENTITY_SIGNIN_URL_TEMPLATEOverride for the standalone sign-in handoff URL; blank auto-derives <INTELLIASK_ORIGIN>/intelliapps/view/{app_id}?redirect=1(empty)No

Connecting to IntelliAsk

IntelliApps is reached by the IntelliAsk container as a native MCP server named intelliapps, injected automatically at container build when the two variables below are set on the IntelliAsk side. They are the intelliask-side counterpart of this service's HTML_APP_MCP_API_KEY.

Name (set on the IntelliAsk container)PurposeRequired
INTELLIAPPS_API_URLBase URL of this IntelliApps service (the injected MCP server points at ${INTELLIAPPS_API_URL}/mcp)Yes
INTELLIAPPS_SERVICE_KEYShared service key sent as the X-App-Service-Key header — must equal this service's HTML_APP_MCP_API_KEYYes

Legacy names still accepted

The older HTML_APPS_API_URL / HTML_APPS_SERVICE_KEY names are still read as fallbacks. If an operator declares mcpServers.intelliapps directly in intelliask.yaml, that entry wins and the auto-injection defers to it.

When both are set, the IntelliAsk startup log shows [IntelliApps] Native MCP server "intelliapps" injected...; when they're missing it logs ... NOT injected — missing env: .... See Adding Environment Variables for how to wire a value through config/.env into the container.

Last updated on