Skip to content

Configuration

JARVIS is configured through a single YAML file at ~/.jarvis/config.yaml. The onboarding wizard creates this file with sensible defaults. You can edit it directly at any time — changes take effect on the next daemon restart.

~/.jarvis/config.yaml

The smallest valid configuration that launches JARVIS with an Anthropic API key:

llm:
primary:
provider: anthropic
apiKey: "sk-ant-..."
model: claude-opus-4-6

All other values fall back to their defaults.

# ─── Daemon ───────────────────────────────────────────────
daemon:
port: 3142 # WebSocket + HTTP port for the dashboard
logLevel: info # trace | debug | info | warn | error
logDir: ~/.jarvis/logs # Directory for log files
dbPath: ~/.jarvis/jarvis.db # SQLite knowledge vault path
# ─── LLM Providers ────────────────────────────────────────
llm:
primary:
provider: anthropic # anthropic | openai | ollama
apiKey: "sk-ant-..."
model: claude-opus-4-6
maxTokens: 8192
temperature: 0.7
fallback:
provider: openai
apiKey: "sk-..."
model: gpt-4o
maxTokens: 4096
temperature: 0.7
# ─── Text-to-Speech ───────────────────────────────────────
tts:
enabled: true
provider: edge-tts # edge-tts (free) | openai | elevenlabs
voice: en-US-GuyNeural # Edge TTS voice name
speed: 1.0 # Playback speed multiplier
# ─── Speech-to-Text ───────────────────────────────────────
stt:
enabled: true
provider: openai # openai | groq | local
apiKey: "sk-..." # Required for openai and groq providers
model: whisper-1 # STT model name
language: en # BCP-47 language code
# ─── Communication Channels ───────────────────────────────
channels:
telegram:
enabled: false
botToken: ""
allowedUsers: [] # List of Telegram user IDs (integers)
discord:
enabled: false
botToken: ""
allowedUsers: [] # List of Discord user IDs (strings)
# ─── Personality ──────────────────────────────────────────
personality:
name: JARVIS
role: |
You are JARVIS — an always-on autonomous AI daemon. You are
direct, capable, and decisive. You act on behalf of your user
without unnecessary confirmation.
timezone: UTC # Used for scheduling and time references
# ─── Authority & Safety ───────────────────────────────────
authority:
level: 5 # 1 (read-only) to 10 (full autonomy)
governed:
send_email: 7 # Minimum authority level to send email
send_message: 5 # Minimum level to send external messages
make_payment: 9 # Minimum level to initiate payments
delete_files: 6 # Minimum level to delete files
execute_shell: 6 # Minimum level to run shell commands
# ─── Google Integration ───────────────────────────────────
google:
enabled: false
credentialsPath: ~/.jarvis/google-credentials.json
tokenPath: ~/.jarvis/google-token.json
scopes:
- gmail.readonly
- calendar.readonly

Controls the daemon process itself.

KeyTypeDefaultDescription
portinteger3142Port for the WebSocket server and dashboard
logLevelstringinfoLog verbosity
logDirstring~/.jarvis/logsDirectory for rotated log files
dbPathstring~/.jarvis/jarvis.dbSQLite database path

Configures the LLM providers. See LLM Providers for full details.

Controls text-to-speech output. See Voice Interface for full details.

Controls speech-to-text transcription. See Voice Interface for full details.

Configures external communication adapters. See Telegram and Discord for setup instructions.

KeyTypeDefaultDescription
namestringJARVISName used in responses and notifications
rolestringBuilt-in promptSystem prompt injected at the start of every conversation
timezonestringUTCTimezone for scheduling and time-aware responses

Controls the autonomy level of the daemon. See Authority and Safety for full details.

OAuth2 credentials for Gmail and Calendar integration. See Proactive Agent for setup instructions.

Any configuration value can be overridden via environment variables without modifying the YAML file. This is useful in CI environments, Docker containers, or when you want to avoid storing secrets in the config file.

VariableConfig equivalent
JARVIS_PORTdaemon.port
JARVIS_LOG_LEVELdaemon.logLevel
JARVIS_API_KEYllm.primary.apiKey
JARVIS_MODELllm.primary.model
JARVIS_FALLBACK_API_KEYllm.fallback.apiKey
JARVIS_TELEGRAM_TOKENchannels.telegram.botToken
JARVIS_DISCORD_TOKENchannels.discord.botToken
JARVIS_STT_API_KEYstt.apiKey
JARVIS_AUTHORITY_LEVELauthority.level

Environment variables take precedence over config.yaml values.

Terminal window
# Start JARVIS on a non-default port without editing the config
JARVIS_PORT=8080 jarvis start
# Use a different API key for a test run
JARVIS_API_KEY="sk-ant-test..." jarvis start --foreground

Stop the daemon before editing if you want changes to apply cleanly:

Terminal window
jarvis stop
# edit ~/.jarvis/config.yaml
jarvis start

Alternatively, use jarvis restart after editing — it reads the config fresh on startup.

The doctor command checks your config for common mistakes:

Terminal window
jarvis doctor

This verifies that:

  • The config file exists and is valid YAML
  • API keys are present and non-empty
  • The specified port is available
  • Referenced file paths exist
  • At least one LLM provider is configured

For a complete key-by-key reference of every configuration option, see Config Reference.