Talk to your computer — and watch it do the work: an open-source, privacy-first voice agent with full command of your PC.
Not a classical voice assistant: a fast Router-Brain listens, decides, and delegates — heavy work goes to interchangeable coding-agent workers (Claude Code, Codex CLI, Gemini CLI, or an in-process worker on whatever API key you have) that run isolated, get reviewed by a critic, and report back in your language. Provider-agnostic (Gemini, Claude, OpenAI, OpenRouter — one setting), self-modifying, and it runs everywhere — headless server to full voice desktop.
Just say it
| You say | What happens |
|---|---|
| "Research vector databases." | An isolated agent digs in; the finished report lands as a download in Outputs. |
| "Call the clinic and book the next open appointment." | A real outbound phone call goes out through the optional Twilio line. |
| "Remember: Alex prefers Signal over email." | Written to the Knowledge Wiki — still known in every future session. |
| "Switch the voice over to Cartesia." | The speech provider changes live and reads the change back to you, old → new. |
| "Open the browser and pull up the weather." | Jarvis takes mouse and keyboard and does it on your screen. |
Every one of these runs on shipped code — none is a roadmap item. Two carry a setup cost
that is not "out of the box": the phone call needs the optional [telephony] extra plus
your own Twilio account, a number, and a publicly reachable HTTPS URL for the webhooks;
computer use needs a desktop install with a screen, not the headless one.
When-then triggers are a real feature too, but they are not voice-armed: you create
them in the Tasks view or with jarvis tasks create, not by saying "when X, do Y".
They fire on a clock, an interval, or one of Jarvis's own internal events (a mission
finishing, a message being sent) — not on arbitrary things happening elsewhere on your PC —
and what they can do is speak, run one tool, dispatch a harness, or run an agent turn.
See it in action
Watch the full, one-command computer-use demo on YouTube.
Why it's different
| Never blocks | The moment the Router picks an action you hear a grounded one-liner about that action — not a guess, and not silence. |
| Meta-orchestrator | A lean Router dispatches to specialized tools and workers, not one giant prompt. |
| Self-healing | Missions run in isolated worktrees; a critic reviews before you hear it. |
| Provider-agnostic | Gemini, Claude, OpenAI, OpenRouter — one setting, smart cross-family fallback. Voice and speech providers switch by voice; the brain provider is yours alone, changeable only in the app or the CLI. |
| Your plan or key | Run agents on a subscription login or a pay-per-token key. |
| Self-modifying | Rewrites its own settings through a reversible, audited pipeline. |
| Lasting memory | A Knowledge Wiki + awareness build a model of you across sessions. |
| Runs anywhere | Headless Linux server to full voice desktop; local parts degrade. |
How it works
Higher layers reach lower layers only through protocols; everything else talks over a typed, immutable EventBus — that strict seam is what lets harnesses, providers, and plugins be swapped freely.
The 8-layer map
L7 UI/UX Desktop app (FastAPI + React + pywebview), tray, Orb overlay
L6 Orchestrator State machine, Router, BrainManager, Mission-Manager + workers, Controller
L5 Harness adapter python-script, computer-use (coding agents are L6 mission workers)
L4 Brain Gemini · Claude · OpenAI · Grok · OpenRouter + sub-second Ack-Brain
L3 Intent / Risk Classifier, four-tier risk policy, approval, rate-limit tracking
L2 Speech Wake → VAD → STT → TTS (cloud or local, your choice)
L1 Audio I/O Device routing, chime feedback
L0 OS / Hardware Mic, speakers, global hotkeys, optional GPU
A deeper engineering map — architecture, anti-patterns, and bug classes — lives
in docs/architecture-overview.md
and docs/BUGS.md.
Install
One command on Windows, macOS, or Linux. You need Python 3.11+ and Git — the installer checks both and stops with a download link if one is missing. It asks nothing in the terminal, launches the app, and the app walks you through a one-time setup (language, wake word, API keys). Bring your own keys; nothing is bundled.
Windows — PowerShell
irm https://raw.githubusercontent.com/PersonalJarvis/PersonalJarvis/main/install/install.ps1 | iex
macOS · Linux
curl -fsSL https://raw.githubusercontent.com/PersonalJarvis/PersonalJarvis/main/install/install.sh | bash
Open source — read the installer before you run it. It only creates a venv, installs dependencies, prefetches the voice models, and launches the app. Keys land in your OS credential manager, never in the repo. Re-running the same one-liner updates in place.
Uninstall — one command as well. Removes the install folder, the autostart entry, and
the keychain entries; add --dry-run to preview, --yes to skip the confirmation:
# Windows (PowerShell)
& "$env:USERPROFILE\.personal-jarvis\install\uninstall.ps1"
# macOS · Linux
bash ~/.personal-jarvis/install/uninstall.sh
Both run the uninstaller that is already on your disk. If it is missing or
refuses to start — installs from 1.1.0 / 1.1.1 shipped one that could not run on
macOS at all — skip it and use the app's own uninstall directly. Same job, no
bootstrap involved; add --dry-run first to see what it would remove:
# macOS · Linux
~/.personal-jarvis/.venv/bin/python -m jarvis --uninstall
# Windows (PowerShell)
& "$env:USERPROFILE\.personal-jarvis\.venv\Scripts\python.exe" -m jarvis --uninstall
Optional extras, install flags, pipx & manual clone
Everything below is optional — each item only unlocks a specific feature:
| Optional | Unlocks |
|---|---|
| A provider API key or subscription login — Gemini, Claude, OpenAI, or OpenRouter | Actually talking to a brain. The in-app setup stores it in your OS credential manager. |
| Node.js 18+ | The coding-agent worker CLIs (Claude Code, Codex) heavy missions delegate to. Add it any time. |
| libportaudio (Linux only) | Local microphone and speakers (apt install libportaudio2). |
| A GPU | Faster fully-offline speech; everything also runs on CPU. |
| Install flag | Effect |
|---|---|
--headless |
Minimal server install: API + WebSocket only, torch-free base, no Node.js — the tiny-VPS path |
--no-launch |
Install only; don't start the app |
pipx — isolated, no clone, any OS, straight from PyPI:
pipx install personal-jarvis && jarvis serve
pip — into an environment you already have:
pip install personal-jarvis # cloud-first base: API + WebSocket + browser UI
pip install "personal-jarvis[full]" # everything: desktop app, telephony, channels, local voice
Manual — clone it, read every line, then run:
git clone https://github.com/PersonalJarvis/PersonalJarvis
cd PersonalJarvis
python -m venv .venv && source .venv/bin/activate # Windows: .\.venv\Scripts\Activate.ps1
pip install -e .[full]
jarvis serve
Run it
jarvis # full desktop: window + voice + Orb overlay
jarvis serve # headless server: API + WebSocket + browser UI, no local audio needed
Headless / server notes
On a server, open http://localhost:47821 — the full experience lives in the browser,
including voice through the browser microphone. The one-time setup runs there too; you can
also set a provider key (e.g. GEMINI_API_KEY) in the environment or a .env file.
Browser microphone access needs a secure context: localhost works as-is; for a remote
VPS, terminate TLS with an HTTPS reverse proxy (Caddy, Nginx) — plain http://server-ip
stays usable for text, but browsers block voice.
What's inside
Missions — the self-healing work loop. Anything non-trivial ("research X and
write me a report") spawns a worker in an isolated git worktree — a private
sandbox copy of the workspace, with crash containment. A critic reviews the
result (up to three rounds) before you ever hear it; deliverables land in
Outputs as downloadable files.
Knowledge Wiki — memory that survives. An Obsidian-compatible Markdown vault Jarvis reads and writes. Tell it something once and every future session knows. It's plain files on your disk — read it, edit it, sync it, own it.
Computer use. Jarvis takes the mouse and keyboard when you ask: open apps,
click, type, navigate — with an on-screen action border so you see when it's
driving. The border is drawn by a small Qt sidecar from the [desktop] extra;
where that is absent (base or headless install, aarch64 Linux) it degrades to a
logged no-op and the control itself still works.
Channels & telephony. Desktop window, browser, Telegram, and Discord all
reach the same brain and share the same memory. Real outbound phone calls are
possible but not out of the box: they need the optional [telephony] extra, your
own Twilio account and number, and a publicly reachable HTTPS URL Twilio can call
back for the voice webhook and the media socket.
Safety tiers. Every action is classified safe / monitor / ask / block before it runs — destructive things ask first, whitelisted routines stop nagging you, and the blacklist always outranks the whitelist.
Self-modification. It can change its own settings by voice — through a guarded pipeline (validate → backup → apply → verify → roll back on failure) with a full audit trail. Deliberately out of its own reach: secrets and keys, the safety tiers, the review gates, and the active brain provider, which only you can change from the app or the CLI. Generated skills always land as drafts for your review; nothing self-activates.
Realtime voice. Optional speech-to-speech mode (OpenAI Realtime, Gemini Live) for sub-second conversational latency — with automatic fallback to the classic wake → STT → brain → TTS pipeline when it's unavailable.
Drive it from the terminal
The jarvis CLI (aliases jarvisctl, jctl) controls a running instance —
the same actions as the app, behind the same safety checks, just scriptable.
Anything you can click, you (or your scripts, or another coding agent) can type:
jarvis system status # {"reachable": true} when Jarvis is up
jarvis --json brain status # which provider is live, as machine-readable JSON
jarvis api <tag> <op> # EVERY REST endpoint, auto-generated from OpenAPI
It's a thin client over the local REST API (127.0.0.1:47821), so it inherits
every guardrail — risk tiers, atomic config writes, the audit log — rather than
bypassing them. Full guide: docs/jarvis-cli.md.
Configuration
Zero config files needed — every setting has a built-in default and the one-time
in-app setup covers the rest. For fine control there's one optional, documented
file (jarvis.toml.example):
[profile]
language = "auto" # de | en | auto — bilingual auto-detect
[trigger.wake_word]
phrase = "" # YOUR word — nothing is preset for you
engine = "auto" # resolves the best engine for your phrase
[stt]
provider = "groq-api" # or openai-api, openrouter-stt, gemini-api, faster-whisper (local)
[tts]
provider = "gemini-flash-tts"
fallback = "grok-voice" # cross-provider fallback is the norm everywhere
Overrides cascade jarvis.toml → ENV (JARVIS__SECTION__KEY=…). Secrets
never go in this file — API keys live in your OS credential manager (or
.env), entered in-app.
Privacy
- Keys stay yours — stored in the OS credential manager, never in the repo, never in a file you could accidentally commit.
- The always-on part is local — wake-word listening runs entirely on your machine; audio only goes to a cloud STT provider after you've addressed Jarvis, and only if you chose a cloud provider.
- Local per stage, your choice — speech recognition can run fully offline (
[local-voice]extra); brain and voice output use whichever provider you configure. - Memory is plain files — the Knowledge Wiki is Markdown on your disk, not a hosted database.
Extend it
Every pluggable part is a Python entry point: write a class against the
protocols in jarvis/core/protocols.py, register
one line in pyproject.toml, reinstall — no fork, no core edits.
| Plugin group | What you can add |
|---|---|
jarvis.brain |
A new LLM provider |
jarvis.stt / jarvis.tts |
Speech recognition / synthesis backends |
jarvis.wakeword |
Wake-word engines |
jarvis.realtime |
Speech-to-speech providers |
jarvis.harness |
Harness adapters the router and when-then tasks dispatch to |
jarvis.tool |
Actions the router can call directly |
jarvis.channel |
New surfaces — chat platforms, transports |
Three rules keep it stable: implement the protocol, stream everything
(AsyncIterator — non-streaming yields one element), and pass the contract
suite (pytest tests/contract/). The deep engineering map — architecture,
anti-patterns, and recurring bug classes — lives in
docs/architecture-overview.md
and docs/BUGS.md.
Project structure
PersonalJarvis/
├── jarvis/ # The application — every core package (brain, speech, missions, memory, UI server…)
├── ui/ # Orb overlay for the desktop; loaded by jarvis at runtime
├── board-backend/ # Standalone federation service (verifies signed Board aggregates)
├── conductor/ # YAML-first agentic-workflow canvas, mounted inside the app
├── wiki/ # Seed knowledge vault (Obsidian-compatible), created on first run
├── install/ # One-line installers + signed-release verification (cosign / TUF)
├── tests/ # Unit, integration, contract, and end-to-end suites
├── docs/ # Architecture docs, ADRs, the philosophy, design specs
├── assets/ # Brand art, banner, screenshots
├── .github/ # CI workflows + issue / pull-request templates
├── scoop-bucket/ # Windows install manifest (Scoop)
├── homebrew-tap/ # macOS install formula (Homebrew)
└── README · LICENSE · CODE_OF_CONDUCT · CONTRIBUTING · SECURITY · CHANGELOG
Inside jarvis/, the layout mirrors the 8-layer model — jarvis/brain/ (providers +
router), jarvis/speech/ (wake → VAD → STT → TTS), jarvis/missions/ (the self-healing
Worker-Critic), jarvis/memory/wiki/ (long-term memory), jarvis/ui/web/ (the desktop app).
Documentation
| Document | What's in it |
|---|---|
docs/architecture-overview.md |
The full architecture — layers, module catalog, data flow |
CLAUDE.md |
Binding contributor guide — conventions, doctrine, anti-patterns |
docs/PHILOSOPHY.md |
Cross-platform, provider-agnostic design doctrine |
docs/adr/ |
Architecture Decision Records |
docs/BUGS.md |
The recurring-bug register |
docs/BRAND.md |
Brand guidelines — colors, typography, the wordmark |
Community
Personal Jarvis is built in the open — the roadmap, the bug hunts, and the wins all land on Discord first. Come say hi and help shape where it goes.
Contributing
Pull requests are welcome — CONTRIBUTING.md has the full guide.
The short version: artifacts are English, read CLAUDE.md before larger
changes, new providers must pass pytest tests/contract/, and security issues go to
SECURITY.md privately.
License
MIT — free to use, modify, and distribute, including commercially; see
LICENSE. Third-party names and logos belong to their owners —
see TRADEMARK.md.
Built by the Personal Jarvis community · © 2026 · MIT
Discord · Instagram
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file personal_jarvis-1.2.1.tar.gz.
File metadata
- Download URL: personal_jarvis-1.2.1.tar.gz
- Upload date:
- Size: 18.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9839dc0995d632ecdca703910d921d4b805f170f270d064a2d79854617c5d0d1
|
|
| MD5 |
88b7296c7e6db841d5f334e8f0e57fdc
|
|
| BLAKE2b-256 |
38320d4b08a130ad620495b086330ca981c4a6827c721fa8a671de94671b987c
|
Provenance
The following attestation bundles were made for personal_jarvis-1.2.1.tar.gz:
Publisher:
release.yml on PersonalJarvis/PersonalJarvis
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
personal_jarvis-1.2.1.tar.gz -
Subject digest:
9839dc0995d632ecdca703910d921d4b805f170f270d064a2d79854617c5d0d1 - Sigstore transparency entry: 2311414517
- Sigstore integration time:
-
Permalink:
PersonalJarvis/PersonalJarvis@f0790377c204dfc07743c804887ae5bd9ef74cbf -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/PersonalJarvis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f0790377c204dfc07743c804887ae5bd9ef74cbf -
Trigger Event:
push
-
Statement type:
File details
Details for the file personal_jarvis-1.2.1-py3-none-any.whl.
File metadata
- Download URL: personal_jarvis-1.2.1-py3-none-any.whl
- Upload date:
- Size: 19.6 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e7379a2e3c5eb7bf1ca472c1f6d2e79a60c21515c14f06c171bd455fcc5c9ac
|
|
| MD5 |
e8930699779ea285bd5dcde99465e8e3
|
|
| BLAKE2b-256 |
1d7b8b43cafa5be783cebad5c58c85d73c3543dd7d1a31b804f42f36937654e3
|
Provenance
The following attestation bundles were made for personal_jarvis-1.2.1-py3-none-any.whl:
Publisher:
release.yml on PersonalJarvis/PersonalJarvis
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
personal_jarvis-1.2.1-py3-none-any.whl -
Subject digest:
4e7379a2e3c5eb7bf1ca472c1f6d2e79a60c21515c14f06c171bd455fcc5c9ac - Sigstore transparency entry: 2311414522
- Sigstore integration time:
-
Permalink:
PersonalJarvis/PersonalJarvis@f0790377c204dfc07743c804887ae5bd9ef74cbf -
Branch / Tag:
refs/tags/v1.2.1 - Owner: https://github.com/PersonalJarvis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@f0790377c204dfc07743c804887ae5bd9ef74cbf -
Trigger Event:
push
-
Statement type: