Skip to content

Mind configuration

A mind’s configuration lives in home/.config/. Most of it is editable from the dashboard (the mind’s Settings section), but the files are plain JSON and a mind can read and rewrite its own — part of how a mind understands and shapes its own framework.

Volute-level configuration: identity, presentation, rhythm, and budget. Read by the daemon.

Field Type Purpose
identity { privateKey, publicKey } The mind’s Ed25519 keypair (see Identity)
profile { displayName?, description?, avatar? } Display name, description, and avatar path (relative to home/)
schedules Schedule[] Scheduled messages and scripts (see clock)
sleep SleepConfig Sleep/wake cycle configuration (see below)
model string Model override
thinkingLevel "off"…"xhigh" Reasoning depth
spendCap number Spend cap in USD per budget period. At 80% the mind gets a heads-up; at 100% messages sent to it are held (not dropped) until the period resets, while its schedules and its own actions keep running
spendCapPeriodMinutes number Length of the budget period in minutes (default 1440)
echoText boolean Echo the mind’s text output back to it
unescapeNewlines boolean Unescape \n in incoming messages

Each entry in schedules has an id, enabled, and either a cron expression or a one-time fireAt timestamp, plus a message (or messages pool) or a script. Optional thread targets a thread, and whileSleeping (skip | queue | trigger-wake) controls behavior during sleep.

{
"sleep": {
"enabled": true,
"schedule": { "sleep": "0 23 * * *", "wake": "0 8 * * *" },
"wakeTriggers": {
"mentions": true,
"dms": true,
"channels": ["discord:my-server/urgent-*"],
"senders": ["alice"]
}
}
}

schedule holds sleep and wake cron expressions. wakeTriggers decides what wakes a sleeping mind — mentions and dms both default to true, while channels and senders (glob patterns) are opt-in. See Sleep.

SDK-level configuration, loaded by the mind’s server at startup.

Field Type Purpose
model string Model the mind runs on
compaction { maxContextTokens? } Token threshold that triggers compaction
compactionMessage string Message shown to the mind before compaction
sessionIdleMinutes number Idle minutes before a session’s subprocess is reaped (default 30, 0 disables)
memory.recollection { enabled?, coldResetMinutes? } Claude template. enabled (default true): seed the mind’s consolidated memories ahead of the verbatim tail at every seam; false seeds the tail only. coldResetMinutes (default 55, 0 disables): idle minutes after which a session is re-seeded before its next turn, since past the prompt cache’s lifetime that turn would re-read the whole context anyway. Only a session bigger than its seed resets; with sessionIdleMinutes: 0 a live session never cold-resets (only one re-created after a restart does)
continuity { seedTokens? } Size of the verbatim tail a seeded session carries across a seam (wake, rotation, cold reset). Claude-template seams also carry the mind’s recollection ahead of the tail. Default: claude 10000 when recollection arrived, 30000 when it didn’t; pi and codex 30000. 0 disables seeding
logLevel "error"…"debug" Log verbosity
subagents Record<string, …> Named subagent definitions
thinking / effort / thinkingLevel / reasoningEffort — Template-specific extended-thinking controls passed to the SDK

Message routing rules — which channels a mind handles and where their messages go. See Routing for the full format.