Configuration
Everything is driven by JARVIS_-prefixed environment variables in a local .env. Run jarvis-setup to generate it; .env.example documents every knob inline.
Never commit
.env — it's git-ignored. Keep your configured fork private if it carries personal data.Core knobs
| Variable | Purpose |
|---|---|
JARVIS_STT_PROVIDER | deepgram (cloud) / whisper / moonshine (local) |
JARVIS_TTS_PROVIDER | elevenlabs (cloud) / piper / kokoro (local) |
JARVIS_LLM_BACKEND | the reasoning LLM: freellmapi / openai / ollama |
JARVIS_WAKE_WORDS | e.g. hey jarvis (pre-trained set; custom phrases need Porcupine) |
JARVIS_VAULT_PATH | your Obsidian/Markdown notes folder (L3 memory) |
JARVIS_BRAIN_HOST | 127.0.0.1 single-machine, 0.0.0.0 for multi-device |
JARVIS_API_AUTH_TOKEN | bearer token required off-loopback (wizard generates it) |
JARVIS_BRAIN_WS_URL | edge → brain, e.g. ws://<tailnet-ip>:8765/voice |
Safety & memory knobs
| Variable | Purpose |
|---|---|
JARVIS_VAULT_WRITABLE | true only on the host that owns the vault; enables write_vault. Off on the laptop (its mirror is clobbered by the one-way sync). |
JARVIS_SESSION_IDLE_RESET_MINUTES | after this idle gap the brain journals the prior conversation and clears working memory (durable memory kept). 0 disables. |
JARVIS_PROACTIVE_ENABLED | allow unprompted speech (within budget + quiet hours) |
JARVIS_FLEET_AUTHORIZED | allow consulting the optional external fleet (off by default) |
JARVIS_SPEAKER_ID_ENABLED | respond only to your enrolled voice (off until enrolled) |
JARVIS_PROTOCOL_*_PASSWORD | passwords for the eight privileged routines (wizard generates them) |
What lives where
- Character —
personality/jarvis.md(edit to make Watari yours). - Knowledge — Markdown under
memory/+ your vault. - Skills — on-demand playbooks in
skills/*.md.
Nothing is hard-coded: the same codebase runs CPU-local-only or cloud-quality by flipping provider flags, and an unconfigured integration simply says “that isn't configured yet”.