Skip to content

Configuration Reference

OpenParallax is configured through a config.yaml file in your workspace directory (typically ~/.openparallax/<agent-name>/config.yaml). This file is created by the openparallax init wizard and can be edited manually at any time.

Sources: internal/types/config.go, internal/config/defaults.go

Top-Level

KeyTypeDefaultDescription
workspacestring"."Root directory for the agent's workspace files

Models (models)

The model pool defines all available LLM providers. This is a list of model entries.

KeyTypeDefaultDescription
models[].namestringUnique identifier for this model (e.g. "claude-sonnet")
models[].providerstringLLM provider: "anthropic", "openai", "google", "ollama"
models[].modelstringProvider-specific model identifier
models[].api_key_envstringEnvironment variable holding the API key
models[].base_urlstringOverride the provider's default API endpoint

Roles (roles)

Maps functional roles to model names from the model pool.

KeyTypeDefaultDescription
roles.chatstringModel name for the main conversation
roles.shieldstringModel name for Tier 2 Shield evaluation
roles.embeddingstringModel name for vector embeddings
roles.sub_agentstringModel name for sub-agent tasks
roles.imagestringModel name for image generation
roles.videostringModel name for video generation

Shield (shield)

Configures the 4-tier Shield security pipeline. See Security for architecture details.

KeyTypeDefaultDescription
shield.policy_filestring"security/shield/default.yaml"Path to the YAML policy file (Tier 0). Read-only via API
shield.onnx_thresholdfloat640.85Confidence threshold for the ONNX classifier (0.0-1.0)
shield.heuristic_enabledbooltrueEnable the heuristic regex classifier (Tier 1)
shield.classifier_enabledboolfalseEnable the ML classifier. Requires classifier_mode: sidecar and a running sidecar binary. Default is heuristic-only (79 rules).
shield.classifier_modestring"sidecar"How the ONNX classifier runs when enabled. "sidecar" connects to an external classifier service via classifier_addr. This is the only supported mode.
shield.classifier_addrstringAddress of the ONNX classifier sidecar when classifier_mode: sidecar (e.g. "localhost:8090")
shield.classifier_skip_types[]stringsee belowAction types where ONNX classification is bypassed because the trained model over-fires on benign payloads. Heuristics and policy rules still run. Default: [write_file, delete_file, move_file, copy_file, send_email, send_message, http_request]. See Shield Tier 1 → Per-Action-Type ONNX Skip List.

Shield Evaluator

The Tier 2 evaluator is configured via roles.shield, which maps to a model entry in the models[] pool. There is no shield.evaluator config block. Use AgentConfig.ShieldModel() to resolve the evaluator model programmatically.

Shield Tier 3 (shield.tier3)

Human-in-the-loop approval for uncertain Shield verdicts.

KeyTypeDefaultDescription
shield.tier3.max_per_hourint10Maximum Tier 3 prompts per hour
shield.tier3.timeout_secondsint300Seconds to wait for user response before auto-deny

Identity (identity)

KeyTypeDefaultDescription
identity.namestring"Atlas"Agent display name
identity.avatarstringEmoji displayed alongside the agent name

Channels (channels)

Configures messaging platform adapters. Each channel is optional and enabled independently.

WhatsApp (channels.whatsapp)

KeyTypeDefaultDescription
channels.whatsapp.enabledboolfalseEnable the WhatsApp adapter
channels.whatsapp.phone_number_idstringWhatsApp Business phone number ID
channels.whatsapp.access_token_envstringEnvironment variable for the access token
channels.whatsapp.verify_tokenstringWebhook verification token
channels.whatsapp.webhook_portintWebhook listen port
channels.whatsapp.allowed_numbers[]stringAllowlist of phone numbers

Telegram (channels.telegram)

KeyTypeDefaultDescription
channels.telegram.enabledboolfalseEnable the Telegram adapter
channels.telegram.token_envstringEnvironment variable for the bot token
channels.telegram.allowed_users[]int64Allowlist of Telegram user IDs
channels.telegram.allowed_groups[]int64Allowlist of Telegram group IDs
channels.telegram.private_only*boolWhen true, ignore all group messages
channels.telegram.polling_intervalintPolling interval in seconds

Discord (channels.discord)

KeyTypeDefaultDescription
channels.discord.enabledboolfalseEnable the Discord adapter
channels.discord.token_envstringEnvironment variable for the bot token
channels.discord.allowed_guilds[]stringAllowlist of Discord server (guild) IDs
channels.discord.allowed_channels[]stringAllowlist of Discord channel IDs
channels.discord.allowed_users[]stringAllowlist of Discord user IDs
channels.discord.respond_to_mentionsboolfalseRespond when the bot is @mentioned

Slack (channels.slack)

KeyTypeDefaultDescription
channels.slack.enabledboolfalseEnable the Slack adapter
channels.slack.bot_token_envstringEnvironment variable for the bot OAuth token
channels.slack.app_token_envstringEnvironment variable for the app-level token

Signal (channels.signal)

KeyTypeDefaultDescription
channels.signal.enabledboolfalseEnable the Signal adapter
channels.signal.cli_pathstringPath to the signal-cli binary
channels.signal.accountstringSignal account phone number
channels.signal.allowed_numbers[]stringAllowlist of phone numbers

Teams (channels.teams)

KeyTypeDefaultDescription
channels.teams.enabledboolfalseEnable the Microsoft Teams adapter
channels.teams.app_id_envstringEnvironment variable for the Teams app ID
channels.teams.password_envstringEnvironment variable for the Teams app password

iMessage (channels.imessage)

macOS only.

KeyTypeDefaultDescription
channels.imessage.enabledboolfalseEnable the iMessage adapter
channels.imessage.apple_idstringApple ID email used in Messages.app

Chronicle (chronicle)

Configures copy-on-write workspace snapshots for state versioning and rollback.

KeyTypeDefaultDescription
chronicle.max_snapshotsint100Maximum number of snapshots to retain
chronicle.max_age_daysint30Maximum age of snapshots in days

Web (web)

Configures the Web UI server.

KeyTypeDefaultDescription
web.enabledbooltrueEnable the Web UI
web.hoststring""Bind address. Empty resolves to 127.0.0.1 (localhost only). Set to "0.0.0.0" for remote access (requires password_hash)
web.portint3100HTTP listen port. Read-only via API
web.grpc_portint0 (dynamic)gRPC listen port for CLI-Engine communication
web.authbooltrueEnable cookie-based authentication
web.password_hashstringBcrypt hash of the web UI password. Required when host is non-localhost
web.allowed_origins[]stringOrigins permitted for CORS and WebSocket. Empty = localhost only

Agents (agents)

Configures sub-agent orchestration, LLM call limits, tool timeouts, and crash recovery.

KeyTypeDefaultDescription
agents.sub_agent_modelstringOverride the default sub-agent model. Empty = auto-detect cheapest
agents.max_roundsintMax LLM calls per sub-agent (default 20)
agents.max_tool_roundsint25Max tool-call round-trips per message
agents.context_windowint128000Assumed model context window in tokens
agents.compaction_thresholdint70Context budget percentage (0-100) that triggers both compaction and the history/current-turn split inside the compactor
agents.max_response_tokensint4096Max tokens per LLM response
agents.shell_timeout_secondsint30Default shell command timeout. Increase for long builds or large git operations
agents.browser_nav_timeout_secondsint30Browser page navigation timeout. Increase for slow pages on poor connections
agents.browser_idle_minutesint5Minutes of inactivity before the headless browser session is shut down to free memory
agents.sub_agent_timeout_secondsint900Max time a sub-agent can run before being killed (default 15 minutes). Override per-spawn via the timeout parameter on create_agent
agents.max_concurrent_sub_agentsint10Cap on simultaneously running sub-agent processes. Once reached, create_agent returns an error until one completes. Raise it if you intentionally orchestrate large fan-outs
agents.max_sub_agent_roundsint20Maximum number of LLM calls each sub-agent can make before stopping
agents.crash_restart_budgetint5Max agent (or engine) crashes within crash_window_seconds before the process manager stops restarting
agents.crash_window_secondsint60Time window for crash counting
agents.max_consecutive_nav_failuresint3Consecutive browser navigation failures before the executor disables navigation for the session. Prevents wasted LLM round-trips on hosts where the browser fundamentally cannot load pages (e.g. Flatpak sandbox)

General (general)

Global operational settings.

KeyTypeDefaultDescription
general.fail_closedbooltrueAll Shield evaluation errors result in BLOCK
general.rate_limitint30Maximum actions per minute
general.verdict_ttl_secondsint60How long a Shield verdict remains valid
general.daily_budgetint100Maximum Tier 2 LLM evaluator calls per day. Read-only via API
general.output_sanitizationboolfalseWrap tool results in data boundaries to mitigate prompt injection. Increases token usage slightly

Security (security)

Security subsystem policy paths. The subsystems are non-negotiable; only the policies are tunable.

KeyTypeDefaultDescription
security.ifc_policystring"security/ifc/default.yaml"Path to the IFC policy YAML file. Three presets ship: default, permissive, strict. See IFC reference
security.override_modestring""Overrides the mode declared in the IFC policy. Empty = use policy's own mode. "audit" = log but don't block. "enforce" = block. Not in SettableKeys — requires restart

Embedding

The embedding provider is configured via roles.embedding, which maps to a model entry in the models[] pool. There is no memory top-level config key. Use AgentConfig.EmbeddingModel() to resolve the embedding model programmatically.

MCP (mcp)

External Model Context Protocol server connections. Each server runs as a child process and provides additional tools.

KeyTypeDefaultDescription
mcp.servers[]MCPServerConfigList of MCP servers to connect
mcp.servers[].namestringServer display name
mcp.servers[].commandstringCommand to start the server
mcp.servers[].args[]stringCommand arguments
mcp.servers[].envmap[string]stringEnvironment variables for the server process

Email (email)

Configures email sending (SMTP) and reading (IMAP).

KeyTypeDefaultDescription
email.providerstringEmail provider ("smtp" for now)

SMTP (email.smtp)

KeyTypeDefaultDescription
email.smtp.hoststringSMTP server hostname
email.smtp.portintSMTP server port
email.smtp.usernamestringSMTP login username
email.smtp.passwordstringSMTP login password
email.smtp.fromstringSender email address
email.smtp.tlsboolEnable TLS encryption

IMAP (email.imap)

KeyTypeDefaultDescription
email.imap.hoststringIMAP server hostname (e.g. "imap.gmail.com")
email.imap.portintIMAP server port (typically 993 for TLS)
email.imap.tlsboolEnable TLS encryption
email.imap.usernamestringIMAP login username (for password auth)
email.imap.passwordstringIMAP login password or app password (for password auth)
email.imap.auth_modestringAuthentication mode: "password" or "oauth2"
email.imap.accountstringEmail address for OAuth2 token lookup

Calendar (calendar)

KeyTypeDefaultDescription
calendar.providerstringCalendar provider: "google", "caldav", "microsoft"
calendar.google_credentials_filestringPath to Google OAuth credentials file
calendar.calendar_idstringGoogle calendar ID
calendar.caldav_urlstringCalDAV server URL
calendar.caldav_usernamestringCalDAV username
calendar.caldav_passwordstringCalDAV password
calendar.microsoft_accountstringMicrosoft account email for OAuth2 token lookup

OAuth (oauth)

OAuth2 client credentials for email and calendar integrations. Tokens are obtained via openparallax auth <provider>.

Google (oauth.google)

KeyTypeDefaultDescription
oauth.google.client_idstringGoogle OAuth2 application client ID
oauth.google.client_secretstringGoogle OAuth2 application client secret

Microsoft (oauth.microsoft)

KeyTypeDefaultDescription
oauth.microsoft.client_idstringMicrosoft OAuth2 application client ID
oauth.microsoft.client_secretstringMicrosoft OAuth2 application client secret
oauth.microsoft.tenant_idstring"common"Azure AD tenant ID

Tools (tools)

KeyTypeDefaultDescription
tools.disabled_groups[]stringTool group names to disable. See Action Types — Tool Groups

Skills (skills)

KeyTypeDefaultDescription
skills.disabled[]stringSkill names to disable

Read-Only Fields

The following fields cannot be changed through the web UI settings API. Edit config.yaml directly and restart:

  • web.port
  • general.daily_budget (shield.tier2_budget in the API)
  • shield.policy_file

Minimal Example

yaml
workspace: /home/user/.openparallax/atlas

models:
  - name: claude-sonnet
    provider: anthropic
    model: claude-sonnet-4-6
    api_key_env: ANTHROPIC_API_KEY
  - name: claude-haiku
    provider: anthropic
    model: claude-haiku-4-5-20251001
    api_key_env: ANTHROPIC_API_KEY

roles:
  chat: claude-sonnet
  shield: claude-haiku

identity:
  name: Atlas

shield:
  policy_file: security/shield/default.yaml
  heuristic_enabled: true

web:
  enabled: true
  port: 3100

general:
  fail_closed: true
  rate_limit: 30
  daily_budget: 100