Skip to content

Frona is configured through environment variables. All variables use the FRONA_ prefix and are organized by component.

General

VariableDefaultDescription
FRONA_SERVER_DATA_DIRdataBase data directory. Defaults for FRONA_CONFIG, database.path, storage.workspaces_path, and storage.files_path are derived from this path
FRONA_CONFIG{data_dir}/config.yamlPath to the YAML config file
FRONA_LOG_LEVEL--Log verbosity level
FRONA_LOG_CONFIG--Path to a custom log configuration file

Server

VariableDefaultDescription
FRONA_SERVER_PORT3001Port the backend API listens on
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_SECRET--Secret used to derive the AES-256 key that encrypts JWT signing keypairs at rest. 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_RUNTIME_TOKENS_DIRdata/runtime/tokensDirectory for per-invocation ephemeral token files (created with mode 0700 at startup).
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.

:::caution[Change the encryption secret in production] FRONA_AUTH_ENCRYPTION_SECRET is used to derive an AES-256 encryption key (via SHA-256) that protects the JWT signing keypairs stored in the database. 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.

Generate a strong random secret:

bash
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_EXPIRATION0Client metadata cache expiration in seconds

Database

VariableDefaultDescription
FRONA_DATABASE_PATHdata/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_TOKEN--Authentication token for the Browserless HTTP API
VariableDefaultDescription
FRONA_SEARCH_PROVIDER--Search provider: searxng, tavily, or brave
FRONA_SEARCH_SEARXNG_BASE_URL--Base URL of the SearXNG instance

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

VariableDefaultDescription
FRONA_STORAGE_WORKSPACES_PATHdata/workspacesPath for workspace file storage
FRONA_STORAGE_FILES_PATHdata/filesPath for file uploads
FRONA_STORAGE_SHARED_CONFIG_DIRresourcesPath for shared prompts and agent configs
FRONA_STORAGE_SKILLS_DIRdata/skillsPath for installed shared skills
FRONA_STORAGE_CACHE_DIRdata/system/cachePath for system caches
FRONA_STORAGE_CHANNELS_DATA_PATHdata/channelsDirectory for per-channel adapter data (Signal/WhatsApp sessions, etc.)

Scheduler

VariableDefaultDescription
FRONA_SCHEDULER_POLL_SECS60How often the scheduler checks for due tasks
FRONA_SCHEDULER_SPACE_COMPACTION_SECS3600 (1 hour)Interval for space context compaction
FRONA_SCHEDULER_MEMORY_COMPACTION_SECS7200 (2 hours)Interval for memory compaction

Inference

VariableDefaultDescription
FRONA_INFERENCE_MAX_TOOL_TURNS200Maximum tool call iterations per response
FRONA_INFERENCE_DEFAULT_MAX_TOKENS8192Default max tokens for LLM responses
FRONA_INFERENCE_COMPACTION_TRIGGER_PCT80Context usage percentage that triggers compaction
FRONA_INFERENCE_HISTORY_TRUNCATION_PCT90Context usage percentage that triggers truncation

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

Frona supports 17 LLM providers. Set the API key for any provider you want to use. Providers are auto-discovered from environment variables on startup. At least one is required.

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)

You can also configure providers via the config file or the setup wizard.

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.

VariableDefaultDescription
FRONA_CHANNEL_RETRY_MAX_RETRIESunlimitedTotal 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.

Signal

Safety caps for the signal matcher.

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

MCP

VariableDefaultDescription
FRONA_MCP_ENABLEDtrueEnable MCP server support.
FRONA_MCP_WORKSPACES_PATHdata/mcpBase path for per-MCP-server workspace directories.
FRONA_MCP_CACHE_PATH{workspaces_path}/cacheShared package cache directory (npm, uv).
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.

Model groups

Model groups cannot be set via environment variables. They must be configured in the config file. Each group defines a provider, model, fallbacks, and provider-specific parameters like thinking budgets and sampling settings.