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[].namestring—Unique identifier for this model (e.g. "claude-sonnet")
models[].providerstring—LLM provider: "anthropic", "openai", "google", "ollama"
models[].modelstring—Provider-specific model identifier
models[].api_key_envstring—Environment variable holding the API key
models[].base_urlstring—Override the provider's default API endpoint

Roles (roles) ​

Maps functional roles to model names from the model pool.

KeyTypeDefaultDescription
roles.chatstring—Model name for the main conversation
roles.shieldstring—Model name for Tier 2 Shield evaluation
roles.embeddingstring—Model name for vector embeddings
roles.sub_agentstring—Model name for sub-agent tasks
roles.imagestring—Model name for image generation
roles.videostring—Model 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_addrstring—Address 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.avatarstring—Emoji 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_idstring—WhatsApp Business phone number ID
channels.whatsapp.access_token_envstring—Environment variable for the access token
channels.whatsapp.verify_tokenstring—Webhook verification token
channels.whatsapp.webhook_portint—Webhook listen port
channels.whatsapp.allowed_numbers[]string—Allowlist of phone numbers

Telegram (channels.telegram) ​

KeyTypeDefaultDescription
channels.telegram.enabledboolfalseEnable the Telegram adapter
channels.telegram.token_envstring—Environment variable for the bot token
channels.telegram.allowed_users[]int64—Allowlist of Telegram user IDs
channels.telegram.allowed_groups[]int64—Allowlist of Telegram group IDs
channels.telegram.private_only*bool—When true, ignore all group messages
channels.telegram.polling_intervalint—Polling interval in seconds

Discord (channels.discord) ​

KeyTypeDefaultDescription
channels.discord.enabledboolfalseEnable the Discord adapter
channels.discord.token_envstring—Environment variable for the bot token
channels.discord.allowed_guilds[]string—Allowlist of Discord server (guild) IDs
channels.discord.allowed_channels[]string—Allowlist of Discord channel IDs
channels.discord.allowed_users[]string—Allowlist 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_envstring—Environment variable for the bot OAuth token
channels.slack.app_token_envstring—Environment variable for the app-level token

Signal (channels.signal) ​

KeyTypeDefaultDescription
channels.signal.enabledboolfalseEnable the Signal adapter
channels.signal.cli_pathstring—Path to the signal-cli binary
channels.signal.accountstring—Signal account phone number
channels.signal.allowed_numbers[]string—Allowlist of phone numbers

Teams (channels.teams) ​

KeyTypeDefaultDescription
channels.teams.enabledboolfalseEnable the Microsoft Teams adapter
channels.teams.app_id_envstring—Environment variable for the Teams app ID
channels.teams.password_envstring—Environment variable for the Teams app password

iMessage (channels.imessage) ​

macOS only.

KeyTypeDefaultDescription
channels.imessage.enabledboolfalseEnable the iMessage adapter
channels.imessage.apple_idstring—Apple 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_hashstring—Bcrypt hash of the web UI password. Required when host is non-localhost
web.allowed_origins[]string—Origins 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_modelstring—Override the default sub-agent model. Empty = auto-detect cheapest
agents.max_roundsint—Max 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
security.memory_block_levels[]string[]Sensitivity levels that block memory writes when session taint reaches them. Overridden by memory_block_levels in the IFC policy file if present. Empty = use the IFC policy's setting (or built-in default [critical, restricted]). See IFC reference

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[]MCPServerConfig—List of MCP servers to connect
mcp.servers[].namestring—Server display name
mcp.servers[].commandstring—Command to start the server
mcp.servers[].args[]string—Command arguments
mcp.servers[].envmap[string]string—Environment variables for the server process

Email (email) ​

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

KeyTypeDefaultDescription
email.providerstring—Email provider ("smtp" for now)

SMTP (email.smtp) ​

KeyTypeDefaultDescription
email.smtp.hoststring—SMTP server hostname
email.smtp.portint—SMTP server port
email.smtp.usernamestring—SMTP login username
email.smtp.passwordstring—SMTP login password
email.smtp.fromstring—Sender email address
email.smtp.tlsbool—Enable TLS encryption

IMAP (email.imap) ​

KeyTypeDefaultDescription
email.imap.hoststring—IMAP server hostname (e.g. "imap.gmail.com")
email.imap.portint—IMAP server port (typically 993 for TLS)
email.imap.tlsbool—Enable TLS encryption
email.imap.usernamestring—IMAP login username (for password auth)
email.imap.passwordstring—IMAP login password or app password (for password auth)
email.imap.auth_modestring—Authentication mode: "password" or "oauth2"
email.imap.accountstring—Email address for OAuth2 token lookup

Calendar (calendar) ​

KeyTypeDefaultDescription
calendar.providerstring—Calendar provider: "google", "caldav", "microsoft"
calendar.google_credentials_filestring—Path to Google OAuth credentials file
calendar.calendar_idstring—Google calendar ID
calendar.caldav_urlstring—CalDAV server URL
calendar.caldav_usernamestring—CalDAV username
calendar.caldav_passwordstring—CalDAV password
calendar.microsoft_accountstring—Microsoft 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_idstring—Google OAuth2 application client ID
oauth.google.client_secretstring—Google OAuth2 application client secret

Microsoft (oauth.microsoft) ​

KeyTypeDefaultDescription
oauth.microsoft.client_idstring—Microsoft OAuth2 application client ID
oauth.microsoft.client_secretstring—Microsoft OAuth2 application client secret
oauth.microsoft.tenant_idstring"common"Azure AD tenant ID

Tools (tools) ​

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

Skills (skills) ​

KeyTypeDefaultDescription
skills.disabled[]string—Skill 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