- Category
- AI Agents
- Rank
- No. 1094Tools index
Previous survey · No. 1082 ·
- Type
- AGENT
- Use case
- Coding
- GitHub
- 935 stars
- Latest release
- v2.0.0
- Date
About
JARVIS is a macOS voice assistant for Claude Code that lets users talk through project ideas, have it build them, and get a spoken notification when a Claude Code session needs attention. It runs on an existing Claude subscription without requiring a separate API key.
What it does
A local voice front end for Anthropic's coding agent. You speak into Chrome; a Python server feeds your words to one long-running Claude Code process, and a British butler voice from Fish Audio answers. It talks a project through one question at a time, saves the agreed design into the project as a document, then launches an unattended build that writes a plan, reviews it and works through it while ticking off a checklist. It also reads every Claude Code conversation on the Mac, says aloud which one is stuck on a permission prompt, and can type a message or press one key into it. A dashboard records every run.
Why it's ranked here
The engineering is more careful than the butler persona suggests. The source documents specific attacks it has closed: a browser origin check plus a private token file in front of every state-changing request, a refusal to be framed by other pages, a loopback-only default, environment scrubbing so an inherited API key cannot quietly take over billing, and a rule that a turn which read web pages or third-party connector output may not act unsupervised. Against that sit hard limits: macOS and Chrome only, a paid voice service with no fallback, and a license that bars commercial use without a separate deal. A strong personal tool, not a team platform.
What's good
Memory is plain Markdown, one fact per file, so you can fix or delete one memory in any editor. The index the assistant always sees is capped at 80 entries of at most 240 characters, and each line is only saved if it parses back exactly as written, which stops a planted note from forging new instructions. Startup checks confirm the Claude Code version, the login, and on macOS the stored refresh token's expiry, without ever reading the token itself; each check is bounded to five seconds and cannot block startup. The assistant's tools are an explicit allowlist of 32 of its own plus web search and fetch.
Tradeoffs
Builds skip Claude Code's permission prompts by default, because a voice session cannot answer them. A setting turns that off, but then unattended runs can hang. Anything that reaches the server can start such a process, which is why the loopback default matters. The platform lock is real: terminal control runs through AppleScript, speech recognition is Chrome's built-in API with no server-side fallback, and without a Fish Audio key it goes silent and replies only as text. Setup needs a self-signed certificate pair, two terminals, Python 3.11 and Node 18. Weather defaults to an IP geolocation lookup at a third-party service. The license forbids commercial use without a separate license.
How to use it well
It suits a solo developer on a Mac with a Claude subscription who runs several Claude Code sessions at once and wants to hear when one is blocked. Keep the default local-only bind and do not expose it on a network, since every request acts with your full authority. If your Desktop is large or cloud-synced, point the project scan at your real project folders; the scan gives up after 20 seconds. Add your own Model Context Protocol servers through its connections file, but each tool costs roughly 250 tokens of context per turn, per the README. It does not cover Linux, Windows, shared team use or commercial products.
Technical notes+
brain.py runs one long-lived claude -p process fed stream-json over stdin, with an ALLOWED_TOOLS allowlist of 32 mcp__jarvis__* tools plus WebSearch and WebFetch; granted_tools() adds one whole-server grant per user-declared connection, and the comments record that the CLI was measured not to filter MCP tools by --tools, so the real gate is the --mcp-config contents and the origin gate on the internal tool route. untrusted_tool_source() labels WebSearch, WebFetch and any non-jarvis MCP server as tainting, and brain.py says server.py refuses unsupervised action after such a turn (that refusal function sits beyond the fetched excerpt). SCRUBBED_ENV_PREFIXES strips CLAUDE_CODE_ and ANTHROPIC_ variables from every child. jarvis_mcp.py is a hand-rolled stdio JSON-RPC server (protocol 2024-11-05) forwarding to loopback HTTP with a 20s TIMEOUT_SEC, and long work is staged until the turn ends. web_auth.py admits mutating requests and WebSockets by Origin (ports 5173 to 5180 plus the API port 8340) or a token in a 0600 file, checks Host against DNS rebinding, and sends X-Frame-Options DENY, frame-ancestors 'none', nosniff and no-referrer on every response. jarvis_memory.py caps the index at MEMORY_INDEX_MAX = 80 and FIELD_MAX_CHARS = 240 and round-trips each line through _INDEX_LINE_RE before writing. server.py derives the .env writer's rule from the reader's parser after a vertical-tab injection, defaults _SKIP_PERMISSIONS to true, bounds the project scan with SCAN_BUDGET_SECONDS = 20 and a 300s cache, and falls back to ipwho.is for weather location. actions.py escapes AppleScript strings through applescript_escape. preflight.py compares versions as int tuples against 2.1.224 and reads refreshTokenExpiresAt from the Keychain with a 5s per-check timeout. requirements.txt lists httpx, fastapi, uvicorn, pydantic, websockets, playwright and pytest, with no Anthropic SDK.
Observed
- License
- Custom personal, non-commercial license; commercial use requires a separate commercial license (LICENSE)
- Platform
- macOS only; terminal control, screenshots and notifications go through AppleScript
- Browser
- Google Chrome required for its Web Speech API; no server-side transcription
- Language and runtime
- Python 3.11+ backend on FastAPI and uvicorn; Node.js 18+ front end
- Required services
- Claude Code CLI 2.1.224 or newer, logged in; Fish Audio API key, with no fallback voice
- Anthropic API usage
- None; ANTHROPIC_* and CLAUDE_CODE_* variables are scrubbed from spawned processes (brain.py)
- Interfaces
- Browser voice page, web dashboard, local HTTP and WebSocket API, stdio MCP server exposing tools to its own brain (jarvis_mcp.py)
- Network default
- Binds 127.0.0.1, API port 8340; Origin check or token file on mutating routes (web_auth.py)
- Permission default
- Skip-permissions setting defaults to true for spawned Claude Code processes (.env.example, server.py)
- Tests
- A tests directory with many pytest modules is present in the repository tree; pytest is in requirements.txt
Read from README.md, requirements.txt, LICENSE, .env.example, server.py, brain.py, actions.py, jarvis_mcp.py, jarvis_memory.py, web_auth.py, preflight.py.
Tags
Tech Stack
Comments (0)
No comments yet
Editorially curated, with community endorsements as a secondary signal. Corrections welcome.