Skip to content

What leaves the box ​

Cicero's voice pipeline runs on your hardware. In the default local configuration, your microphone audio and transcripts are processed entirely on your machine — speech-to-text, text-to-speech, turn detection, and emotion analysis are local Python sidecars bound to 127.0.0.1. Whether the conversation stays local depends on one thing: the brain you plug in. A cloud-backed agent CLI (Claude Code, Codex) sends the conversation to its own vendor on its own account, exactly as it would in a terminal; a local model keeps everything on the box. Either way, there is no Cicero cloud: no configuration of Cicero ever contacts a project-owned server, and there is no telemetry, analytics, crash reporting, or update checking anywhere in the codebase. You can verify that claim with a grep; this page exists so you don't have to.

Data leaves the machine only on surfaces you explicitly configure. Here is the complete map.

Always local ​

DataWhere it goes
Microphone audioLocal STT sidecar over loopback (servers/stt_faster_whisper_server.py, spawned with --host 127.0.0.1)
Synthesized speechLocal TTS sidecar over loopback (Kokoro by default)
Turn detection & emotion audioLocal sidecars over loopback (Smart-Turn, SER)
Conversation ↔ brainLocal subprocess over stdio (Claude Code, Codex, Gemini CLIs; ACP agents), or injection into a terminal tab on the same box (tab-inject)
Conversation history~/.cicero/ on disk, one line per completed turn, owner-only permissions

The daemon spawns the model sidecars itself and pins them to loopback; the HTTP client that talks to them defaults to localhost (src/backends/net.ts). Audio bytes never touch a network interface in this configuration, and transcripts leave it only as conversation input to the brain you chose — which is the next paragraph.

About brains, spelled out: in an ordinary voice turn, Cicero hands the brain your transcribed words plus context assembled from Cicero's own state — conversation history, delivered notification text, an operational snapshot (health records, queued notifications, board and schedule state), and, when the tone sidecar is enabled, a voice-emotion tag. All of that is Cicero-owned session state; nothing is scraped from elsewhere on the box. Computer use widens the brain's input to tool output only under the opt-in in the table below. What the brain does with its input is its own vendor relationship — Claude Code talks to Anthropic, Codex talks to OpenAI, on their own accounts. Cicero adds no data to that exchange; it also can't subtract from it. A fully local brain (llama.cpp, Ollama, an ACP agent running a local model) keeps even the conversation on the box.

Your LAN: the web-voice surface ​

The web-voice server binds 0.0.0.0 by default so a headless box is reachable from a phone browser on your network. That means mic audio and transcripts traverse your LAN when you use it — every turn and control surface requires the bearer token (only liveness/readiness probes and static client assets are unauthenticated), and by TLS that Cicero generates on first start: it refuses to serve the authenticated API over plaintext HTTP on a non-loopback bind unless you explicitly opt out with web_voice.tls.enabled: false. Set web_voice.host: 127.0.0.1 to keep it off the network entirely. Details in security.

First-run downloads ​

Two categories of assets are fetched from third-party hosts once, then cached and served locally forever:

  • Model weights from Hugging Face, on first load of whichever local backends you enable — Whisper (CTranslate2), Kokoro, Smart-Turn, the emotion2vec tone model, and likewise for other local model backends. These are unauthenticated downloads; no audio or conversation data is sent. Pre-seed the Hugging Face cache to run air-gapped.
  • Browser VAD assets (Silero VAD + onnxruntime-web) from the jsDelivr CDN into ~/.cicero/web-voice/vad/, pinned by version, size, and sha256, then served same-origin — the voice page never touches a CDN at runtime.

Off-box only if you configure it ​

Each row is off by default and activates only when you set the named key.

You configureWhat is sentWhere
stt.host / tts.host / turn.host / ser.hostRaw audio (STT/turn/SER), reply text (TTS)The host you name, plain HTTP
llm.host (llama.cpp / Ollama / MLX on another box)Full prompt and completion textThe host you name, plain HTTP
llm.backend cloud preset (openai, openrouter, groq, together, deepseek, and others)Full prompt text + your API keyThat vendor's API
brain.backend: openai-compatible + brain.base_urlThe full conversationThe endpoint you name
web_voice.tldr.summarizer_urlConversation-derived text for spoken summariesThe endpoint you name
tts.backend: elevenlabsReply text; voice provisioning uploads your reference WAV onceapi.elevenlabs.io
tts.backend: sonioxReply text + your API keytts-rt.soniox.com
stt.backend: sonioxLive microphone audio while you speak (or each finished utterance) + your API keystt-rt.soniox.com
stt.backend: deepgramEach finished utterance + your API keyapi.deepgram.com
stt.backend: openai / groq / mistralEach finished utterance + your API keyapi.openai.com / api.groq.com / api.mistral.ai
ACP brain with remote args (e.g. ssh box agent acp)The conversation, over your ssh sessionYour remote box
compute.allow_cloud: true (computer use)Goals, selected file contents, command outputThe cloud LLM you configured

The plain-HTTP rows are deliberate and worth reading twice: pointing a model backend at another machine sends raw audio or prompt text unencrypted. That split-machine mode is designed for a trusted LAN or a personal VPN (WireGuard, Tailscale) — not for anything that crosses a network you don't control.

Third-party transports ​

Telegram surfaces route through Telegram — that's what they're for. What each one sends:

  • Notifications (notify.telegram): message text and rendered voice notes to api.telegram.org via your bot token; replies come back over the same Bot API. Off until a token and chat id are configured.
  • Live calls (the optional telegram-call sidecar): both directions of call audio through Telegram's MTProto/WebRTC infrastructure, on a userbot session you provision. STT/TTS computation stays local; the sidecar talks to the daemon only over loopback. A separate service, off unless you deploy it.

What Cicero never does ​

  • No telemetry, analytics, usage statistics, or crash reporting.
  • No update checks, version pings, or launch beacons.
  • No accounts, and no Cicero-owned backend to have an account on.
  • No egress beyond what this page lists: every off-box path is either a one-time first-run asset download, the brain's own vendor traffic, or attributable to a config key you set.

If you find a network touchpoint this page doesn't account for, that's a bug — report it.