offline

Loading terminals…

Narration detail

Runs only at checkpoints — the end of a turn, a run of tool calls, a failure that repeats — so it stays cheap. The narrator keeps its own detail level above.

Codex: read from its own model catalog (the account's current list). Claude Code: haiku / opus aliases. An explicit model below or in a per-CLI row still wins.

During a long stretch of reads, greps and shell runs there is no thinking or answer to react to. After this much silence the commentator speaks anyway — its first line for a question names the task and what has been done so far. 0 turns it off.

Per-CLI override

Narrator and supervisor per CLI. "default" uses the settings above; models are optional.

Hotkeys
API keys

Only needed for paid voices or an API commentator. Values stay in your OS keyring — the browser only learns which names are set.

0 items

Quick start

  1. Open the Launch tab and set the working folder.
  2. Press Launch next to your CLI — it opens in a new terminal, already routed through the local proxy.
  3. Work as usual. Voice Copilot narrates what the agent is doing; Trace shows the same stream as text.

Same thing from your own terminal: vc claude, vc codex, vc opencode — any id from the Launch list.

Terminal profile
Every route at once

The Terminal entry opens a plain shell with all base-URL variables pre-set. Anything you start inside it — including CLIs not in the list — is proxied and narrated.

Manual wiring

voice-copilot runs a local HTTP reverse-proxy on port 8766. Point your CLI's base-URL env var at it — traffic is forwarded transparently and events are extracted live.

# standalone proxy mode (no wrapped subprocess)
voice-copilot proxy

# or wrap the CLI directly — env vars are injected automatically
voice-copilot run claude -p "implement feature X"
voice-copilot run codex  "add dark mode"
Claude Code
ANTHROPIC_BASE_URL=http://127.0.0.1:8766/anthropic \
  claude -p "your prompt"

Also works with claude --output-format stream-json for structured events.

Codex CLI / any OpenAI-compatible tool
(Cline, Droid, Pi, Oh My Pi, Qwen, Continue, Cursor, LM Studio, …)
OPENAI_BASE_URL=http://127.0.0.1:8766/openai/v1 \
  codex "your prompt"
Aider
# Anthropic backend
ANTHROPIC_BASE_URL=http://127.0.0.1:8766/anthropic \
  aider --model claude-sonnet-4-5

# Ollama (local)
OPENAI_BASE_URL=http://127.0.0.1:8766/ollama/v1 \
  aider --model ollama/qwen2.5-coder:32b
OpenCode Zen
MiniMax M2.5 Free, Kimi, GLM, Qwen and other Zen models
# In Launch → OpenCode → Advanced choose route:
opencode-zen

# voice-copilot injects a temporary runtime override for OpenCode:
OPENCODE_CONFIG_CONTENT={"provider":{"opencode":{"options":{"baseURL":"http://127.0.0.1:8766/opencode-zen"}}}}

OpenCode reads its provider base URL from runtime config, not OPENAI_BASE_URL.

GitHub Copilot CLI as the commentator
No token setup — reuses the CLI's own login
# 1. Install Copilot CLI and log in once:
copilot login

# 2. Settings → Commentator → API, provider "copilot-cli"
#    Model: gpt-5-mini | gpt-4.1 | gpt-4.1-mini | gpt-4o | o3-mini
#
# Each narration = one `copilot -p "…" -s --allow-all` call (~1-2 s).

The github-copilot provider talks to the Copilot API directly instead — it needs GITHUB_COPILOT_TOKEN in API keys, or an existing gh auth login.

LLM provider routes

ProviderProxy pathUpstreamParser
Anthropic /anthropic/… api.anthropic.com SSE (Messages API)
OpenAI /openai/v1/… api.openai.com SSE (Chat Completions)
DeepSeek /deepseek/v1/… api.deepseek.com SSE
Ollama compat/ollama/v1/… 127.0.0.1:11434 SSE (OpenAI format)
Ollama native/ollama/api/… 127.0.0.1:11434 NDJSON (/api/chat)
OpenRouter /openrouter/v1/…openrouter.ai/api SSE
Groq /groq/v1/… api.groq.com/openai SSE
Mistral /mistral/v1/… api.mistral.ai SSE
OpenCode Zen/opencode-zen/… opencode.ai/zen/v1 auto (messages / responses / chat)
Gemini /gemini/… generativelanguage.googleapis.compassthrough

The proxy forwards your original Authorization / x-api-key / x-goog-api-key headers unchanged. No keys are stored. Gemini is proxied but not parsed yet — its sessions appear in the picker with an empty Trace.

Custom port

voice-copilot proxy --proxy-port 9000

# Then use port 9000 in all env vars above.

Ollama thinking models

Models that stream a thinking field (e.g. qwq, deepseek-r1) are handled automatically — thinking content appears in Trace as purple THINKING blocks and is included in the narration prompt. Use the native Ollama path (/ollama/api/chat) via litellm ollama_chat/… prefix, or the OpenAI-compat path with reasoning / reasoning_content delta fields.

About

Voice Copilot

Version 0.1.0 alpha

Voice Copilot is a listening-first companion for coding agents. A parallel commentator LLM analyzes what a coding agent is doing so you can mainly listen, optionally read the trace, and intervene at the right moment with less cognitive load. It is not prompt dictation or raw playback of model output. We are open to collaboration and to growing the project together.

Voice input (push-to-talk questions back into the agent) is temporarily switched off in this build while that flow is reworked — narration and the launcher are unaffected.

Contact

Author: Volodymyr Moskvin

Website: https://voice-copilot.conus.vision/

Conus Vision - https://conus.vision

Email: info@conus.vision

Collaboration

We want to work with CLI authors on direct integration and on refining the companion interface together so it reflects their real event model and control flow. We also want advanced testers who use Voice Copilot in real coding sessions and can show where narration quality, intervention timing, or the experience itself becomes noisy, unclear, or fragile — across different CLIs, models, and project sizes.