Skip to main content

Personal Jarvis — voice-driven meta-orchestrator

PyPI: personal-jarvis License: MIT Discord Personal Jarvis website Python 3.11+ Platforms: Linux, macOS, Windows

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

How Personal Jarvis works: routing voice and chat through safe actions or reviewed missions

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.

Discord

Discord · Instagram · GitHub

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

personal_jarvis-1.2.1.tar.gz (18.7 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

personal_jarvis-1.2.1-py3-none-any.whl (19.6 MB view details)

Uploaded Python 3

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

Hashes for personal_jarvis-1.2.1.tar.gz
Algorithm Hash digest
SHA256 9839dc0995d632ecdca703910d921d4b805f170f270d064a2d79854617c5d0d1
MD5 88b7296c7e6db841d5f334e8f0e57fdc
BLAKE2b-256 38320d4b08a130ad620495b086330ca981c4a6827c721fa8a671de94671b987c

See more details on using hashes here.

Provenance

The following attestation bundles were made for personal_jarvis-1.2.1.tar.gz:

Publisher: release.yml on PersonalJarvis/PersonalJarvis

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file personal_jarvis-1.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for personal_jarvis-1.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4e7379a2e3c5eb7bf1ca472c1f6d2e79a60c21515c14f06c171bd455fcc5c9ac
MD5 e8930699779ea285bd5dcde99465e8e3
BLAKE2b-256 1d7b8b43cafa5be783cebad5c58c85d73c3543dd7d1a31b804f42f36937654e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for personal_jarvis-1.2.1-py3-none-any.whl:

Publisher: release.yml on PersonalJarvis/PersonalJarvis

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.5.3

2 files

1.5.1

2 files

1.5.0

2 files

1.4.0

2 files

1.3.2

2 files

1.3.1

2 files

1.3.0

2 files

1.2.3

2 files

1.2.2

2 files

This release

1.2.1 This release

2 files

1.1.5

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page