Maven reads a single JSON file at ~/.maven/config.json (mode 0600). The schema is defined in internal/kernel/config/config.go. This page is the canonical field reference; for the example skeleton see config.example.json in the repository.
LLM provider credentials. Validation requires apiKey non-empty; the gateway is meant to be run behind a vault like OneCLI when you want real keys out of config.
Field
Type
Default
Description
type
string
anthropic
anthropic or openai.
apiKey
string
—
Required. Non-empty even if you front it with a credential-injecting proxy (use "placeholder").
baseUrl
string
""
Override the provider's base URL (e.g. for a self-hosted gateway).
Platform STT/TTS provider selection plus per-provider knobs. See Guides: Voice. For CLI --voice, echoCancel (default pulse) loads PulseAudio module-echo-cancel under internal device names and tears it down on exit — on Android webrtc is unavailable but the speex fallback loads and runs; off skips the module and runs capture/playback verbatim (raw passthrough, e.g. headphones).
Field
Default
Description
sttProvider
deepgram
Currently only deepgram is implemented.
ttsProvider
openai
openai / deepgram / elevenlabs / cartesia.
echoCancel
pulse
pulse loads module-echo-cancel (tries webrtc then speex) and routes through Maven's AEC devices; on Android webrtc is unavailable but speex works. off disables echo cancellation entirely (raw passthrough, e.g. headphones); capture/playback run as configured with no forced --device.
capture.command
parec
Mic capture process for the CLI voice REPL. Must emit raw PCM s16le 16 kHz mono on stdout. With echoCancel: pulse, Maven appends the echo-cancel --device.
Arguments for the playback command. Low latency bounds the daemon buffer so barge-in cuts the speaker near-instantly.
cartesia.voiceId
""
Required when cartesia is selected. Or use CARTESIA_VOICE_ID env.
cartesia.modelId
"sonic-2"
TTS model.
cartesia.apiVersion
"2025-04-16"
API version header.
cartesia.proxy
""
Per-provider proxy URL.
elevenlabs.voiceId
""
Required when elevenlabs is selected. Or use ELEVENLABS_VOICE_ID.
elevenlabs.proxy
""
Per-provider proxy URL.
deepgram.proxy
""
Per-provider proxy URL.
openai.proxy
""
Per-provider proxy URL.
wake.phrase
""
CLI --voice only. When set, voice turns require this spoken wake phrase, which opens a conversation window. Empty = always listen. The --wake-phrase flag overrides this.
wake.timeoutMs
8000
Idle timeout before the wake conversation window re-arms to dormant, measured from when Maven finishes replying. Paused while a turn is in flight.
Process log verbosity: debug, info, warn, error. Hot reload applies changes when gateway.hotReload is enabled. Or set MAVEN_LOG_LEVEL at process start.
agent.workspace is required / agent.maxTokens must be positive / agent.maxToolIterations must be at least 1
gateway.host is required / gateway.port must be 1..65535, got N / gateway.reloadDebounceMs must be non-negative / gateway.cron.maxConcurrentRuns must be >= 0
channels.<name>.… field-specific messages
autoCompact.threshold must be in (0,1] when autoCompact.enabled
autoCompact.preserveCount must be non-negative
invalid logging.level (must be debug, info, warn, or error)
Errors join with errors.Join — a single failed Validate() returns every problem at once.
SaveConfig writes with mode 0600. Don't loosen those bits — the file may carry API keys, bot tokens, and encryption keys. Use a credential vault (OneCLI) or environment-only secrets when in doubt.