Skip to main content

Config Schema

The main config file is ~/.arc/config.yaml. It is created with defaults by arc setup or automatically on first run.

Full default config​

daemon:
auto_start: true
socket_path: ~/.arc/arc.sock
log_level: info
pid_file: ~/.arc/daemon.pid

acpx:
command: acpx
default_agent: claude
session_ttl: 300

ollama:
endpoints:
local:
url: http://localhost:11434/v1

discord:
enabled: false
token_env: DISCORD_BOT_TOKEN
guild_id: ""
thread_mode: false
rate_limit:
messages_per_minute: 5

git:
auto_pull: true

timeouts:
acpx_request: 300
ollama_request: 120
ipc_connect: 5

output:
default_format: raw
color: true

logging:
log_routing: true

daemon​

Controls the background daemon process.

daemon.auto_start​

TypeDefault
booltrue

When true, running arc ask automatically starts the daemon as a background process if it is not running. The CLI retries the IPC connection once after spawning the daemon.

daemon:
auto_start: true

Set to false if you prefer explicit daemon management.


daemon.socket_path​

TypeDefault
string (path)~/.arc/arc.sock

Path to the Unix domain socket used for CLI-to-daemon communication. The ~ is expanded at runtime. The socket file is created when the daemon starts and deleted on shutdown.

daemon:
socket_path: ~/.arc/arc.sock

daemon.log_level​

TypeDefault
stringinfo

Python logging level for the daemon and CLI. Valid values: debug, info, warning, error, critical.

daemon:
log_level: info

Set to debug to see verbose dispatch and IPC traces.


daemon.pid_file​

TypeDefault
string (path)~/.arc/daemon.pid

Path to the file where the daemon writes its PID. Used by arc daemon stop and arc daemon status to find and signal the process.

daemon:
pid_file: ~/.arc/daemon.pid

The parent directory of pid_file is used as the arc config directory for locating agents/, cron/, and logs/.


acpx​

Controls the acpx Claude Code session manager.

acpx.command​

TypeDefault
stringacpx

The executable name or path for acpx. Change this if acpx is installed in a non-standard location or you want to use a specific version.

acpx:
command: /usr/local/bin/acpx

acpx.default_agent​

TypeDefault
stringclaude

The acpx agent name (the Claude Code agent configuration within acpx). This is the argument passed to acpx after the global flags: acpx ... <default_agent> exec ...

acpx:
default_agent: claude

acpx.session_ttl​

TypeDefault
int (seconds)300

How long acpx keeps named sessions alive after the last activity. Used by Discord thread mode: sessions older than this value may be recreated on the next message, losing conversation context.

acpx:
session_ttl: 300

This value is informational in arc; the TTL is enforced by acpx itself.


ollama​

Named Ollama endpoints for model routing.

ollama.endpoints​

TypeDefault
map[string, object]{local: {url: http://localhost:11434/v1}}

A map of endpoint names to URL objects. The local endpoint is the default for ollama/<model> model strings (without an explicit endpoint). Named endpoints are accessed with ollama/<endpoint>/<model>.

ollama:
endpoints:
local:
url: http://localhost:11434/v1
remote:
url: http://192.168.1.100:11434/v1
kyle:
url: http://kyle-nuc.tailnet:11434/v1

Each endpoint object has a single field:

url​

TypeRequired
string (URL)yes

The base URL of the Ollama-compatible API. arc appends /chat/completions to form the full request URL.


discord​

Discord bot configuration.

discord.enabled​

TypeDefault
boolfalse

Whether to start the Discord bot when the daemon starts. Set to true after configuring token_env and guild_id.


discord.token_env​

TypeDefault
stringDISCORD_BOT_TOKEN

The name of the environment variable that holds the Discord bot token. The token itself should be stored in ~/.arc/.env, not in config.yaml.

discord:
token_env: DISCORD_BOT_TOKEN

The daemon loads ~/.arc/.env at startup using a minimal dotenv parser.


discord.guild_id​

TypeDefault
string""

Your Discord server's (guild) ID. When set, the bot ignores messages from other servers. Leave empty to allow the bot to operate in any server it is invited to (not recommended for production).

discord:
guild_id: "1234567890123456789"

discord.thread_mode​

TypeDefault
boolfalse

When true, the bot creates a new thread for each message that arrives outside a thread. Threads use persistent named acpx sessions so conversation context is preserved across messages in the same thread.

When false, the bot replies inline in the channel and each message is a one-shot dispatch with no conversation memory.


discord.rate_limit.messages_per_minute​

TypeDefault
int5

Maximum number of messages the bot will respond to per channel per 60-second sliding window. Messages that arrive after the limit is reached are silently dropped.

discord:
rate_limit:
messages_per_minute: 5

git​

Automatic git operations in agent workspaces.

git.auto_pull​

TypeDefault
booltrue

When true, the daemon runs git pull in the agent workspace before each dispatch. This keeps the agent's context files (system prompts, programs, etc.) up to date.


timeouts​

Request timeout values in seconds.

timeouts.acpx_request​

TypeDefault
int (seconds)300

Maximum time to wait for acpx to return a response. If the timeout is exceeded, the subprocess is killed and a DispatchError is raised. Increase this for agents that run complex or long-running Claude Code tasks.

timeouts.ollama_request​

TypeDefault
int (seconds)120

Maximum time to wait for an Ollama API response. Increase for large models on slow hardware.

timeouts.ipc_connect​

TypeDefault
int (seconds)5

Maximum time to wait when connecting to the daemon socket. If the daemon does not respond within this time, the CLI treats it as not running and falls back.


output​

output.default_format​

TypeDefault
stringraw

Default output format. Currently raw is the only supported value.

output.color​

TypeDefault
booltrue

Reserved for future use.


logging​

logging.log_routing​

TypeDefault
booltrue

When true, the daemon appends a JSON record to ~/.arc/logs/routing.jsonl for each dispatched prompt. Records include timestamp, agent name, model, dispatch type, source, and a 100-character prompt preview.

Set to false to disable routing logs (e.g., for high-volume deployments where disk I/O is a concern).