Install & run Watari
The complete command reference: install the stack you want, walk the setup wizard, switch on every capability, then run Watari once — or 24/7 on every device.
This page is the “what do I actually type” companion to Quick start (the 5-minute path) and Setup & keys (where each key comes from). All commands run from the repo root.
1 · Install the stack
uv sync installs only the extras you name and prunes the rest, so list the full set you intend to use in one command. The jarvis-setup wizard is installed with any set.
git clone https://github.com/iamvazghen/OpenWatari openwatari
cd openwatari
# Everything (cloud voice + 24/7 brain + channels + speaker-ID + dev tools):
uv sync --extra edge --extra cloud-voice --extra brain --extra channels --extra identity --extra browse --extra dev
# 100% local / offline voice instead of cloud: drop cloud-voice, add local-voice
uv sync --extra edge --extra local-voice --extra brain --extra channels --extra identity| Extra | Turns on |
|---|---|
edge | the device loop: mic, wake word, VAD, audio I/O |
cloud-voice | Deepgram STT + ElevenLabs TTS (fast, cloud) |
local-voice | Whisper STT + Piper/Kokoro TTS (no keys, offline) |
brain | the LLM agent loop, tools, memory L1–L5, scheduler |
channels | Telegram, Gmail, Calendar, Notion, ntfy push |
browse | the agentic web browser (local + Browserbase) |
identity | speaker-ID — obey only your enrolled voice |
dev | the test suite + benchmarks |
2 · Run the setup wizard
uv run jarvis-setupA terminal UI walks every decision and writes a ready .env. It never prints a secret back, backs up an existing .env, and auto-generates your JARVIS_API_AUTH_TOKEN and all eight JARVIS_PROTOCOL_*_PASSWORD values — you don't fetch those anywhere.
| Step | It asks | Typical answer |
|---|---|---|
| Identity | display name + wake phrase | your name + hey jarvis |
| Voice | cloud or local | cloud = Deepgram + ElevenLabs keys; local = no keys |
| Brain | LLM backend | OpenAI-compatible URL + key, or local Ollama |
| Knowledge | notes folder for L3 memory | your Obsidian/Markdown path |
| Deployment | single or vps | single = loopback; vps = binds 0.0.0.0 + token for phones/glasses |
| Integrations | Telegram, Tavily, Google, Notion, ntfy | fill the ones you want; all optional |
| Behaviour | proactivity on/off | your call; fleet stays off by default |
jarvis-setup is idempotent — run it again to change an answer; it backs up the old .env first. Or edit .env by hand (every key is prefixed JARVIS_; see Setup & keys).3 · Switch on each capability
Everything degrades gracefully — do only the ones you want. Each is a one-time step.
# Speaker-ID — record your voiceprint, then only you are obeyed
uv run python bench/enroll_voice.py --script "to-read-script.md"
# then set JARVIS_SPEAKER_ID_ENABLED=true in .env
# Telegram — one-time login, writes a reusable session file
uv run python bench/telegram_login.py
# Gmail + Calendar — one-time OAuth, writes the refresh token
uv run python bench/google_login.py
# Semantic recall (L5) — downloads a ~90 MB CPU model on first use
uv pip install sentence-transformers
# Redis cache (L4, optional) — otherwise an in-process cache is used
# set JARVIS_REDIS_URL=redis://localhost:6379 in .envuv run python bench/check_config.py prints which keys are set; uv run python bench/test_live_integrations.py actually exercises the ones you configured.4 · Run Watari
The two core processes. On one machine you can run both; across devices the brain lives on your always-on host.
# The voice edge (mic + wake word + STT/TTS) on this device:
uv run python -m jarvis.edge.assistant
# The shared 24/7 brain (LLM, tools, memory, scheduler) — for phones/glasses over your tailnet:
uv run python -m jarvis.brain.server
# Optional, on the same laptop — let Watari control this PC (open apps, type, click):
uv run python -m jarvis.edge.pc_agentvps mode), start brain.server before edge.assistant so the edge links on boot. The edge auto-reconnects if the brain restarts.5 · Run it 24/7 (autostart)
One idempotent installer registers Watari to start at login and stay alive — Scheduled Tasks on Windows, a systemd --user unit on Linux, a LaunchAgent on macOS.
uv run python -m jarvis.edge.autostart install # edge + pc_agent, start at login
uv run python -m jarvis.edge.autostart install edge # just the voice edge
uv run python -m jarvis.edge.autostart status # is it registered / running?
uv run python -m jarvis.edge.autostart uninstall # remove itOn the always-on host, run the brain as a service so it survives reboots and logout. On Linux that's a systemd --user unit with lingering enabled:
loginctl enable-linger "$USER"
systemctl --user enable --now jarvis-brain.service
systemctl --user status jarvis-brain.service # active? restarts?
journalctl --user -u jarvis-brain.service -f # follow the log
curl -s http://127.0.0.1:8766/healthz # should print: ok6 · Verify
uv run python bench/run_all_tests.py # the single gate — all green (offline; SKIP != FAIL)
uv run python bench/efficiency_report.py # hot-path latency vs targets7 · Is it actually listening?
Say your wake phrase, then a command (“hey jarvis, what time is it?”). The listening ping is one soft tone at startup, then silent — it isn't a constant sound. If nothing reacts, tail the edge log: every detection prints wake: 'hey_jarvis' detected.
# Windows
Get-Content logs/edge.log -Tail 20 -Wait
# macOS / Linux
tail -f logs/edge.log| Symptom in the log | Cause & fix |
|---|---|
no audio received / no wake … detected | two edges are fighting for the mic, or the wrong default input device. Stop every Watari process, confirm one edge, restart it. |
timed out during opening handshake (Deepgram/ElevenLabs) | a network blip reaching the cloud voice services — it auto-retries. Persistent? Check connectivity or switch to the local voice stack. |
brain link: connected never appears | the brain isn't running or the host/token is wrong — start brain.server, check the tailnet IP. |
Next: personalize the voice and persona, wire integrations, and walk the production checklist before go-live.