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
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.