Skip to main content

Voxa

Voxa lets you call into your laptop from a phone browser, talk to a Gemini Live "operator," and have it drive Claude Code by voice.

MVP scope (drive mode only): pick a working directory by voice, send spoken instructions, hear Claude's final result read back. Attach mode, voice folder-browsing, and barge-in interruption are V2 backlog items (see docs/superpowers/specs/2026-06-27-loop-design.md and docs/superpowers/plans/2026-06-27-loop-mvp.md).


Prerequisites

  • Python 3.11+ on the laptop.
  • Tailscale installed and logged in on both the laptop and the phone (free personal plan is fine). The phone must be on the same tailnet as the laptop, or MagicDNS must be enabled.
  • A Gemini API key from Google AI Studio with Gemini Live access.
  • Claude Code logged in on the laptop (claude CLI authenticated). The agent SDK reuses your existing Claude Code credentials; no separate ANTHROPIC_API_KEY is needed unless you prefer to supply one.

Quickstart

Install Voxa on the laptop you want to control with one command.

macOS / Linux:

curl -fsSL https://voxa.space/install.sh | sh

Windows (PowerShell):

irm https://voxa.space/install.ps1 | iex

Prefer a package runner? These work on any OS:

npx voxa-code            # Node users
uvx voxa-code            # Python users (or: pipx install voxa-code)

Then start it:

voxa

Voxa is zero-config by default: it uses the hosted relay, so there are no API keys to set up. voxa starts the server and prints a pairing QR code. Scan it with the Voxa phone app (or open the printed URL in your phone browser) to connect.


Develop from source

Contributors who want to hack on Voxa can run it from a checkout instead of the published package.

1. Create and activate the virtual environment

python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"

2. Configure secrets

cp .env.example .env

Open .env and fill in:

Key Value
GEMINI_API_KEY Your Google AI Studio key
VOXA_AUTH_TOKEN Any random secret string (protects the WebSocket endpoint on your tailnet)

GEMINI_LIVE_MODEL, VOXA_HOST, and VOXA_PORT have sensible defaults and can be left as-is.

3. Start the server

bash scripts/serve.sh

The script:

  1. Starts the Voxa FastAPI server on 127.0.0.1:8787 (or $VOXA_PORT).
  2. Calls tailscale serve to expose it over HTTPS on your tailnet (required because the phone browser needs a secure context for microphone access).
  3. Prints the full HTTPS URL including your auth token.

4. Connect from the phone

Open the printed URL on your phone browser. Tap Connect, then speak.


Architecture (brief)

Phone browser (static/)
    |  HTTPS WebSocket (auth token required)
    v
FastAPI server (server/app.py)
    |  audio bytes (16 kHz PCM)
    v
GeminiOperator (server/gemini_operator.py)  <-->  Gemini Live API
    |  tool calls (start_claude_session, send_to_claude, …)
    v
Orchestrator (server/orchestrator.py)
    |
    v
ClaudeController (server/claude_controller.py)  -->  Claude Code (agent SDK, bypassPermissions)

Config is loaded from .env via server/config.py.


Running the test suite

.venv/bin/python -m pytest -v

Expected: 22 tests pass, no warnings.


Manual end-to-end smoke test

The smoke test requires a real phone, real Tailscale connectivity, and real API keys. Run it against a scratch directory, not a real project.

Before you start:

  • .env is fully filled in (real GEMINI_API_KEY and VOXA_AUTH_TOKEN).
  • Tailscale is running on both the laptop and the phone.
  • Claude Code is logged in on the laptop.

Procedure:

  1. Open a terminal on the laptop and run:

    bash scripts/serve.sh
    

    Wait for the line Voxa is live. On your phone open: https://...

  2. Copy the printed HTTPS URL (it already includes ?token=...).

  3. On the phone, open the URL in Safari or Chrome. You should see the Voxa interface. Grant microphone permission when prompted.

  4. Tap Connect. The button should change state to indicate an active session.

  5. Speak: "Start a session in /tmp/loop-smoke and create a file called hello.txt that says hi."

  6. Verify:

    • Gemini acknowledges the instruction verbally (you hear a response through the phone speaker).
    • On the laptop terminal you see Claude Code start with bypassPermissions active (no permission prompts appear).
    • After Claude finishes, /tmp/loop-smoke/hello.txt exists on the laptop and contains hi.
    • Gemini speaks the final result back to you.
  7. To stop: press Ctrl-C in the laptop terminal. The trap in serve.sh will kill the server and tear down tailscale serve.

Warning: Use a throwaway scratch directory (like /tmp/loop-smoke) for your first smoke test. Claude Code runs with bypassPermissions, so it will write files without asking.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

voxa_code-0.1.101.tar.gz (97.2 kB view details)

Uploaded Source

Built Distribution

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

voxa_code-0.1.101-py3-none-any.whl (110.9 kB view details)

Uploaded Python 3

File details

Details for the file voxa_code-0.1.101.tar.gz.

File metadata

  • Download URL: voxa_code-0.1.101.tar.gz
  • Upload date:
  • Size: 97.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for voxa_code-0.1.101.tar.gz
Algorithm Hash digest
SHA256 10b7111651bcf229cdc3f13a6385da6589e9147c8f9d2ac64d9b061a1cf1ea81
MD5 7b7806a250aa5bb572aeecc87ccb9d81
BLAKE2b-256 59da7a6c5fa25f33e59af840e2596fb3476fe2cfa936c10518f8521189d223f7

See more details on using hashes here.

Provenance

The following attestation bundles were made for voxa_code-0.1.101.tar.gz:

Publisher: publish-pypi.yml on Ti-03/voxa

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

File details

Details for the file voxa_code-0.1.101-py3-none-any.whl.

File metadata

  • Download URL: voxa_code-0.1.101-py3-none-any.whl
  • Upload date:
  • Size: 110.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for voxa_code-0.1.101-py3-none-any.whl
Algorithm Hash digest
SHA256 44ee1517a473f0d84ff82cb15ecb5b4017f39cf69e622db5346523ad5c6d1694
MD5 a09e904de4527db3a8e889dbe0493d82
BLAKE2b-256 f0ee57caf20c8e4f21e9bcf77e631bc9e5175766d46b640978424fd3fc50adc0

See more details on using hashes here.

Provenance

The following attestation bundles were made for voxa_code-0.1.101-py3-none-any.whl:

Publisher: publish-pypi.yml on Ti-03/voxa

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

Supported by

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