Skip to content

Environment variables override Frona's YAML configuration. Most settings use the FRONA_ prefix; provider and search credentials also use the unprefixed names listed below.

Precedence and naming ​

For component settings, Frona loads built-in defaults, applies YAML, then applies environment overrides. A value set in the server environment therefore takes precedence over the same field saved through the administration UI. Restart Frona after changing its environment; in Docker Compose, recreate the container to apply changed environment values.

After FRONA_, the first underscore separates the component from its field. Single underscores within the field name are preserved. Use double underscores for deeper nesting:

Environment variableConfiguration field
FRONA_SERVER_PORTserver.port
FRONA_BROWSER_WS_URLbrowser.ws_url
FRONA_CHANNEL_RETRY__MAX_RETRIESchannel.retry.max_retries

Use numeric values for numeric fields and true or false for booleans. The general startup variables below are handled separately from component settings. Standard provider variables perform provider discovery; ${ENV_VAR} references in YAML select a named variable's value.

Environment variables must be available to the Frona process. A host .env file is not automatically loaded by the server or forwarded into a container. See Docker Compose environment forwarding.

General ​

VariableDefaultDescription
FRONA_SERVER_DATA_DIRdataBase data directory. Defaults for FRONA_CONFIG, database.path, storage.data_dir, storage.skills_dir, storage.cache_dir, and storage.ontology_dir are derived from this path. Per-user state lives at {data_dir}/users/{user_handle}/...
FRONA_CONFIG{data_dir}/config.yamlPath to the YAML config file
FRONA_LOG_LEVELinfoLog level for frona and tower_http: trace, debug, info, warn, or error. Used when FRONA_LOG_CONFIG is unset
FRONA_LOG_CONFIG--Complete tracing filter string, such as frona=debug,tower_http=info. Overrides FRONA_LOG_LEVEL

Server ​

VariableDefaultDescription
FRONA_SERVER_PORT3001Port the backend API listens on
FRONA_SERVER_STATIC_DIR/app/staticDirectory containing the frontend static build
FRONA_SERVER_BASE_URL--Public base URL of the server (used for callbacks)
FRONA_SERVER_MAX_BODY_SIZE_BYTES104857600 (100 MB)Maximum request body size
FRONA_SERVER_CORS_ORIGINS--Comma-separated list of allowed CORS origins
FRONA_SERVER_MAX_CONCURRENT_TASKS10Maximum concurrent tasks across all agents
FRONA_SERVER_BACKEND_URL--Override backend API URL
FRONA_SERVER_FRONTEND_URL--Override frontend URL
FRONA_SERVER_EXTERNAL_URL--Externally-reachable URL of the server (e.g., ngrok tunnel, public domain). Used as the default callback target for inbound webhooks (Twilio, Telegram, etc.) when no per-feature override is set
FRONA_SERVER_ISSUER_URL--JWT token issuer URL
FRONA_SERVER_SSE_PENDING_EVENTS_SECS60How long to buffer SSE events after client disconnects
FRONA_SERVER_SHUTDOWN_TIMEOUT_SECS60Graceful shutdown timeout
FRONA_SERVER_TIMEZONEauto-detectServer-default IANA timezone (e.g. America/Los_Angeles). Used for cron, reminders, and the <temporal_context> block when a user has no profile timezone set. Empty auto-detects from TZ, then /etc/localtime, falling back to UTC.

Sandbox ​

VariableDefaultDescription
FRONA_SANDBOX_DISABLEDfalseDisable filesystem sandboxing. Not recommended for production.
FRONA_SANDBOX_MAX_CPU_PCT95.0Per-principal CPU usage limit (% of total system CPU).
FRONA_SANDBOX_MAX_MEMORY_PCT80.0Per-principal memory usage limit (% of total system memory).
FRONA_SANDBOX_TIMEOUT_SECS0Default sandbox execution timeout (0 = no timeout).
FRONA_SANDBOX_MAX_TOTAL_CPU_PCT98.0Global CPU cap across all sandboxed processes.
FRONA_SANDBOX_MAX_TOTAL_MEMORY_PCT90.0Global memory cap across all sandboxed processes.
FRONA_SANDBOX_DEFAULT_NETWORK_ACCESStrueGrant sandbox principals outbound network access by default. Override with forbid policies.

Authentication ​

VariableDefaultDescription
FRONA_AUTH_ENCRYPTION_SECRETdev-secret-change-in-productionSecret used to derive the AES-256 key protecting signing keypairs, vault configurations, local credentials, and managed provider keys and account tokens. Must be changed in production.
FRONA_AUTH_ACCESS_TOKEN_EXPIRY_SECS900 (15 min)Access token lifetime
FRONA_AUTH_REFRESH_TOKEN_EXPIRY_SECS604800 (7 days)Refresh token lifetime
FRONA_AUTH_PRESIGN_EXPIRY_SECS86400 (24 hours)Pre-signed URL lifetime
FRONA_AUTH_EPHEMERAL_TOKEN_EXPIRY_SECS300 (5 min)Ephemeral principal token lifetime injected into sandboxed processes.
FRONA_AUTH_ALLOW_REGISTRATIONtrueAllow anyone to sign up from the Register page. Set to false on shared installs so only admins can create accounts. See Managing Users.

Change the encryption secret in production

FRONA_AUTH_ENCRYPTION_SECRET is used to derive an AES-256 encryption key (via SHA-256) that protects JWT signing keypairs, vault provider configurations, local credential values, and managed credential payloads, including provider keys and account tokens. It is not used directly for JWT signing; instead it encrypts the private keys that do the signing.

A built-in default is provided for local development, but you must set your own value in production. If the default is left in place and database files are ever exposed (backup leak, file traversal, shared host), an attacker could decrypt the signing keypairs and forge authentication tokens for any user.

Managed credentials are included in automatic encryption-key rotation. Back up the encryption secret together with the database and configuration; see Backups.

Generate a strong random secret:

nu
openssl rand -base64 32

SSO (OpenID Connect) ​

VariableDefaultDescription
FRONA_SSO_ENABLEDfalseEnable OIDC authentication
FRONA_SSO_AUTHORITY--OpenID Connect authority URL
FRONA_SSO_CLIENT_ID--OIDC client ID
FRONA_SSO_CLIENT_SECRET--OIDC client secret
FRONA_SSO_SCOPESopenid emailOpenID scopes to request
FRONA_SSO_DISABLE_LOCAL_AUTHfalseForce SSO-only authentication, disables local login
FRONA_SSO_SIGNUPS_MATCH_EMAILtrueMatch SSO signups to existing accounts by email
FRONA_SSO_ALLOW_UNKNOWN_EMAIL_VERIFICATIONtrueAccept unverified emails from the IdP
FRONA_SSO_CLIENT_CACHE_EXPIRATION0Accepted but unused in v2026.10.0; changing it has no effect on client metadata caching

Database ​

VariableDefaultDescription
FRONA_DATABASE_PATH{FRONA_SERVER_DATA_DIR}/dbPath to the SurrealDB data directory

Browser ​

VariableDefaultDescription
FRONA_BROWSER_WS_URL--WebSocket URL of the Browserless instance
FRONA_BROWSER_PROFILES_PATH/profilesPath for storing browser profiles
FRONA_BROWSER_CONNECTION_TIMEOUT_MS30000Timeout for connecting to the browser
FRONA_BROWSER_API_TOKENfrona fallbackAuthentication token for the Browserless HTTP management API
VariableDefaultDescription
FRONA_SEARCH_PROVIDER--Search provider: searxng, tavily, or brave
FRONA_SEARCH_SEARXNG_BASE_URL--Base URL of the SearXNG instance
TAVILY_API_KEY--API key required for Tavily search
BRAVE_API_KEY--API key required for Brave Search

When FRONA_SEARCH_PROVIDER is unset, Frona selects the first configured option in this order: TAVILY_API_KEY, BRAVE_API_KEY, then FRONA_SEARCH_SEARXNG_BASE_URL. An explicit provider selection requires its matching key or URL; Frona does not fall back to another provider if that value is missing. Forward search credentials into the container just like model-provider credentials.

Vault ​

VariableDefaultDescription
FRONA_VAULT_ONEPASSWORD_SERVICE_ACCOUNT_TOKEN--1Password service account token
FRONA_VAULT_ONEPASSWORD_VAULT_ID--1Password default vault ID
FRONA_VAULT_BITWARDEN_CLIENT_ID--Bitwarden personal API key client ID
FRONA_VAULT_BITWARDEN_CLIENT_SECRET--Bitwarden personal API key client secret
FRONA_VAULT_BITWARDEN_MASTER_PASSWORD--Bitwarden master password
FRONA_VAULT_BITWARDEN_SERVER_URL--Bitwarden server URL (for self-hosted instances)
FRONA_VAULT_HASHICORP_ADDRESS--HashiCorp Vault server address
FRONA_VAULT_HASHICORP_TOKEN--HashiCorp Vault auth token
FRONA_VAULT_HASHICORP_MOUNT--HashiCorp Vault KV2 mount path (default: secret)
FRONA_VAULT_KEEPASS_PATH--Path to KeePass .kdbx file
FRONA_VAULT_KEEPASS_PASSWORD--KeePass master password

Storage ​

Per-user state (workspaces, uploaded files, MCP server data, channel sessions, vault, tokens) is rooted at {FRONA_STORAGE_DATA_DIR}/users/{user_handle}/.... Browser profiles are kept separately on the browserless container's volume (FRONA_BROWSER_PROFILES_PATH). See Workspaces.

VariableDefaultDescription
FRONA_STORAGE_DATA_DIR{FRONA_SERVER_DATA_DIR}Root data directory for all per-user state
FRONA_STORAGE_SHARED_CONFIG_DIRresourcesPath for shared prompts and agent configs (read-only, ships with the binary)
FRONA_STORAGE_SKILLS_DIR{FRONA_SERVER_DATA_DIR}/skillsPath for installed shared skills
FRONA_STORAGE_CACHE_DIR{FRONA_SERVER_DATA_DIR}/system/cachePath for system caches
FRONA_STORAGE_ONTOLOGY_DIR{FRONA_SERVER_DATA_DIR}/ontologyDirectory for user-supplied ontology files, loaded alongside bundled ontologies

FRONA_SERVER_DATA_DIR defaults to data. It supplies initial defaults for these paths and the database and config-file paths. Explicit YAML fields or environment overrides can replace each path independently. Setting only FRONA_STORAGE_DATA_DIR moves the per-user storage root; it does not change the database, config-file, skills, cache, or ontology paths. See Backups when splitting data across directories.

Scheduler ​

VariableDefaultDescription
FRONA_SCHEDULER_POLL_SECS60How often the scheduler checks for due tasks

Memory ​

VariableDefaultDescription
FRONA_MEMORY_BACKENDbasic for upgradesMemory backend: basic or pkm
FRONA_MEMORY_MODEL_GROUPmemoryModel group for background memory work; basic compaction falls back to the chat agent model, PKM to primary
FRONA_MEMORY_BASIC_COMPACTION_TOKEN_THRESHOLD3000Basic-memory compaction token threshold
FRONA_MEMORY_BASIC_COMPACTION_SECS7200Basic user/agent memory compaction interval
FRONA_MEMORY_BASIC_SPACE_COMPACTION_SECS3600Basic space-memory compaction interval
FRONA_MEMORY_PKM_SEARCH_TOP_K8Maximum results returned by PKM search
FRONA_MEMORY_PKM_SHORT_MEMORY_HALF_LIFE_SECS1209600Short-memory decay half-life
FRONA_MEMORY_PKM_SHORT_MEMORY_DEMOTE_THRESHOLD0.1Short-memory decay-score cutoff; memories below this score are excluded from the prompt
FRONA_MEMORY_PKM_SHORT_MEMORY_TOP_N16Maximum injected short-memory lines
FRONA_MEMORY_PKM_SHORT_MEMORY_TOKEN_CAP3000Short-memory prompt token budget
FRONA_MEMORY_PKM_PLAYBOOK_INDEX_TOKEN_CAP1500Playbook-index prompt token budget
FRONA_MEMORY_PKM_CONSOLIDATE_SECS60Consolidation sweep cadence
FRONA_MEMORY_PKM_CONSOLIDATE_IDLE_SECS300Required chat idle time
FRONA_MEMORY_PKM_CONSOLIDATION_CONCURRENCY4Parallel extraction or authoring calls
FRONA_MEMORY_PKM_CONSOLIDATION_MAX_TOOL_TURNS8Classify/resolve exploration-tool turn limit
FRONA_MEMORY_PKM_CONSOLIDATION_MAX_SUBMISSIONS8Classify/resolve/reconcile submission limit
FRONA_MEMORY_PKM_PLAYBOOK_MAX_TOOL_TURNS20Playbook exploration-tool turn limit
FRONA_MEMORY_PKM_PLAYBOOK_MAX_SUBMISSIONS20Playbook submission limit
FRONA_MEMORY_PKM_EXTRACT_MAX_TOKENS10000Transcript-token limit per extraction request
FRONA_MEMORY_PKM_EXTRACT_MAX_MESSAGES300Message limit per extraction request
FRONA_MEMORY_PKM_EXTRACT_AGENT_EVIDENCE_LOOKBACK_MESSAGES10Agent-message evidence lookback
FRONA_MEMORY_PKM_EXTRACT_AGENT_EVIDENCE_RESULT_TOKEN_CAP4000Token cap per evidence search or read
FRONA_MEMORY_PKM_CONSOLIDATION_MAX_ATTEMPTS3Current-stage failures allowed per pass
FRONA_MEMORY_PKM_ADJUDICATION_MAX_ATTEMPTS_PER_BATCH40Adjudication submissions allowed per batch
FRONA_MEMORY_PKM_CONSOLIDATION_CHECKPOINT_FAILURE_CAP2Fatal checkpoint resets allowed
FRONA_MEMORY_PKM_CONSOLIDATION_RETRY_BASE_SECS120Base retry delay
FRONA_MEMORY_PKM_CONSOLIDATION_KEEP_RECORDS20Finished consolidation records retained per user

Inference ​

VariableDefaultDescription
FRONA_INFERENCE_MAX_TOOL_TURNS200Maximum tool call iterations per response
FRONA_INFERENCE_DEFAULT_MAX_TOKENS8192Output-token reservation for context budgeting when the model has no explicit output limit. Set model-group max_tokens to impose a generation limit
FRONA_INFERENCE_COMPACTION_TRIGGER_PCT80Accepted configuration field, but currently unused by the chat compactor; see below
FRONA_INFERENCE_HISTORY_TRUNCATION_PCT90Percentage of the history budget usable after reserving output tokens and system-prompt space; older messages are removed to fit

In v2026.10.0, chat compaction uses a fixed threshold of 80% of the context window remaining after the output-token reservation. Changing FRONA_INFERENCE_COMPACTION_TRIGGER_PCT does not change that threshold. FRONA_INFERENCE_DEFAULT_MAX_TOKENS is not a universal generation cap: explicitly configured model groups without max_tokens can leave the request's output limit unset. See model settings.

Voice (Twilio) ​

VariableDefaultDescription
FRONA_VOICE_PROVIDER--Voice provider. Currently only twilio is supported
FRONA_VOICE_TWILIO_ACCOUNT_SID--Twilio account SID
FRONA_VOICE_TWILIO_AUTH_TOKEN--Twilio auth token
FRONA_VOICE_TWILIO_FROM_NUMBER--Twilio phone number for outbound calls (E.164 format)
FRONA_VOICE_TWILIO_VOICE_ID--Twilio voice ID for text-to-speech
FRONA_VOICE_TWILIO_SPEECH_MODEL--Twilio speech recognition model

Twilio webhook callbacks now use FRONA_SERVER_EXTERNAL_URL instead of the old FRONA_VOICE_CALLBACK_BASE_URL.

LLM Providers ​

The following names are recognized for automatic provider discovery. Frona adds the discovered connection when its handle is not already configured; an existing connection takes precedence. If both configured providers and models are empty, Frona also creates a default primary group using one of the discovered providers. If you configure any provider in YAML or settings, configure its model groups explicitly as well.

VariableProvider
ANTHROPIC_API_KEYAnthropic (Claude)
OPENAI_API_KEYOpenAI (GPT)
GROQ_API_KEYGroq
OPENROUTER_API_KEYOpenRouter
DEEPSEEK_API_KEYDeepSeek
GEMINI_API_KEYGoogle Gemini
COHERE_API_KEYCohere
MISTRAL_API_KEYMistral
PERPLEXITY_API_KEYPerplexity
TOGETHER_API_KEYTogether AI
XAI_API_KEYxAI (Grok)
HYPERBOLIC_API_KEYHyperbolic
MOONSHOT_API_KEYMoonshot
MIRA_API_KEYMira
GALADRIEL_API_KEYGaladriel
HUGGINGFACE_API_KEYHugging Face
OLLAMA_API_BASE_URLOllama (self-hosted, no API key needed)

For named connections, use a reference such as api_key: ${WORK_OPENAI_API_KEY} in the config file. Custom variable names do not create connections automatically. The provider editor can select a server environment variable and stores its name as a reference; the variable picker exposes names, not secret values.

Azure, Bedrock, ChatGPT account access, and GitHub Copilot require an explicit connection. For example, AZURE_OPENAI_API_KEY can be referenced by an Azure connection but is not an automatic-discovery variable. Bedrock can use the server's AWS credential chain. See Providers & Models for setup.

Docker Compose environment forwarding ​

Variables in the host's .env file are available for Compose interpolation, but they are not automatically passed into a container. Add every provider variable the container needs to the Frona service's environment list. The repository's development Compose file currently forwards ANTHROPIC_API_KEY; add the other discovery, search, or custom variable names you use.

For example, this Compose fragment forwards a required Tavily key from the host environment or .env file:

yaml
services:
  frona:
    environment:
      FRONA_SEARCH_PROVIDER: tavily
      TAVILY_API_KEY: ${TAVILY_API_KEY:?Set TAVILY_API_KEY}

Apps ​

VariableDefaultDescription
FRONA_APP_PORT_RANGE_START4000Start of the port range for app allocation
FRONA_APP_PORT_RANGE_END4100End of the port range for app allocation
FRONA_APP_HEALTH_CHECK_TIMEOUT_SECS30Maximum time to wait for an app to become healthy
FRONA_APP_MAX_RESTART_ATTEMPTS2Restart attempts before marking a crashed app as failed
FRONA_APP_HIBERNATE_AFTER_SECS259200 (3 days)Inactivity duration before auto-hibernating an app

Cache ​

VariableDefaultDescription
FRONA_CACHE_ENTITY_TTL_SECS300 (5 min)Time-to-live for cached entities
FRONA_CACHE_ENTITY_MAX_CAPACITY1000Maximum number of cached entities

Channel ​

Default retry policy for channel connections. Per-channel overrides on the channel detail page take precedence. The double underscore after RETRY is required because retry is a nested object. Single-underscore forms such as FRONA_CHANNEL_RETRY_MAX_RETRIES do not configure the retry policy.

VariableDefaultDescription
FRONA_CHANNEL_RETRY__MAX_RETRIES4294967295 (effectively unlimited)Total retry attempts before a channel is marked Failed.
FRONA_CHANNEL_RETRY__INITIAL_BACKOFF_MS1000 (1s)Delay before the first retry.
FRONA_CHANNEL_RETRY__BACKOFF_MULTIPLIER2.0Delay multiplier between attempts.
FRONA_CHANNEL_RETRY__MAX_BACKOFF_MS60000 (60s)Cap on the delay between attempts.

Share ​

Short share links and preview pages used by channel adapters. See Config File → Share.

VariableDefaultDescription
FRONA_SHARE_TTL_SECS2592000 (30 days)Lifetime of a share row. Expired links return a non-leaking 404.
FRONA_SHARE_CLEANUP_INTERVAL_SECS21600 (6 hours)How often the scheduler deletes expired share rows.

Signal ​

Safety caps for the signal matcher.

VariableDefaultDescription
FRONA_SIGNAL_MAX_PENDING_PER_USER50Maximum number of pending signal watches per user.
FRONA_SIGNAL_DEFAULT_MAX_EVALUATIONS50Default cap on candidates a one-shot watch can be evaluated against.
FRONA_SIGNAL_DEFAULT_MAX_CONTINUOUS_EVALUATIONS1000Default cap on fires a continuous-mode watch can absorb.

MCP ​

VariableDefaultDescription
FRONA_MCP_ENABLEDtrueEnable MCP server support.
FRONA_MCP_CACHE_PATH{data_dir}/system/mcp-cacheShared package cache directory (npm, uv). Per-server workspaces are not separately configurable; they live under {data_dir}/users/{user_handle}/mcps/{mcp_handle}/.
FRONA_MCP_MAX_SERVERS_PER_USER32Maximum MCP servers per user.
FRONA_MCP_STARTUP_TIMEOUT_SECS30Seconds to wait for the initialize handshake.
FRONA_MCP_HEALTH_CHECK_INTERVAL_SECS10Interval between liveness checks.
FRONA_MCP_MAX_RESTART_ATTEMPTS3Restart attempts before marking a server as failed.
FRONA_MCP_DEFAULT_TRANSPORTstdioDefault transport for new MCP servers: stdio or http.
FRONA_MCP_PORT_RANGE_START4100Start of port range for local HTTP MCP servers.
FRONA_MCP_PORT_RANGE_END4200End of port range (exclusive).
FRONA_MCP_BRIDGE_MODEtrueExpose MCP tools via the mcpctl CLI bridge. See Bridge mode.

Debug transcript tracing ​

These variables apply only to debug builds. Release builds, including production images, do not write transcript traces. Debug builds read these settings once, when tracing is first used.

VariableDefaultDescription
FRONA_LLM_TRACEdisabledDirectory for JSON traces of model requests and responses; a nonempty path enables tracing
FRONA_LLM_TRACE_MIRRORdisabledOptional second directory receiving the same traces; requires FRONA_LLM_TRACE

Trace files contain the actual system prompts, conversation text, page content, tool definitions, and tool output sent to the model. Use a private directory and treat the files as conversation data.

Model groups ​

Model groups do not have predefined environment-variable names. Configure them through Config File → Models or the administration interface.