Skip to content

Privacy

Neo is local-first: it runs on your machine, keeps its data on your machine, and has no analytics or telemetry service phoning home to us. Every byte that leaves your machine goes somewhere you configured — a model provider you picked, a channel you set up, an MCP server you added, or npm's public registry to check for updates. This page lists every one of them, verified against the code (not assumed), plus exactly what stays local and how to control it.

TL;DR

  • No phone-home. There is no Neo-operated analytics/telemetry backend. Grepping src/ for the usual suspects (PostHog, Sentry, Segment, Mixpanel, Datadog, etc.) turns up nothing — see Verification below.
  • Local by default. Telemetry is captured (telemetry.enabled: true, runtime/config-loader.ts:124) but the only sink enabled out of the box is file — a JSONL log under ~/.neo/telemetry/, never sent anywhere. A network (OTLP) sink exists for people who want to pipe their own telemetry into their own observability stack, but it is off unless you configure an endpoint yourself (runtime/telemetry-runtime.ts:56-66).
  • You control every outbound byte. The only automatic network calls Neo makes without an explicit action from you are (a) sending your conversation to whichever model provider you configured, when you send a message, and (b) a passive, payload-free version check against npm's public registry. Both are covered below, both are auditable, both can be turned off.

What leaves your machine

DestinationWhat is sentWhenOpt-out
Your configured LLM provider (Anthropic api.anthropic.com, OpenAI api.openai.com or ChatGPT backend, Google Gemini, OpenRouter, DeepSeek, Groq, or any OpenAI-compatible endpoint you point Neo at)The full conversation sent to the model: your messages, the system prompt (including any memory context injected from MEMORY.md), and tool results the agent generatedEvery turn you send to NeoSwitch providers (neo model / providers.json); nothing is sent to a provider you haven't configured as active
registry.npmjs.org/@nehoraihadad%2Fneo-agent/latestNothing but the GET request itself — no payload, no identifiersAt most once per 24h, to power the "update available" banner (runtime/update-check.ts:5,53)NEO_UPDATE_CHECK=off (runtime/env-settings.ts:660-662). neo update / neo update --check are explicit commands and always check regardless of this flag.
api.github.com + registry.npmjs.orgVersion/commit-SHA metadata for the code-harness capability catalog (e.g. "is the pinned Sentry MCP server's SHA still current") — no user data, no payload beyond the lookupWeekly, only if the always-on daemon is running (NEO_DAEMON=on, itself opt-in) — runtime/daemon/jobs/capability-refresh-job.ts:14-18NEO_CAPABILITY_REFRESH=off, or don't run the daemon
External web-search providers (Tavily, Brave, SearXNG, DuckDuckGo)Your search query textOnly when the agent calls the web-search tool and you've configured a key/endpoint for one of these — all are off by default (src/tools/web-search/types.ts:17, providers/external-duckduckgo.ts:4-5)Don't set the API key / endpoint; native provider search (below) is preferred when available
Native web search via your LLM provider (OpenAI/Anthropic/Gemini server-side search)Your search query text, routed through the provider you already send conversations toOnly when the agent calls web-search and a native backend is available for your active providerSame as the provider row above — controlled by which provider you use
MCP servers you add (neo mcp add)Whatever that server's tools receive — entirely up to the server and what you ask the agent to do with itOnly when you've added a server and the agent calls one of its toolsneo mcp remove <name>; nothing talks to an MCP server you haven't configured
Telegram servers (api.telegram.org)Every message routed through your Telegram bot, plus voice/photo/document downloadsOnly if you've set up the Telegram channel (neo-tg)Don't configure Telegram, or neo channels logout telegram
WhatsApp servers (via Baileys, an unofficial protocol)Every message routed through your linked WhatsApp numberOnly if you've paired the WhatsApp channel (neo-wa) — pairing requires explicit confirmation (docs/user/channels.md#whatsapp-neo-wa--experimental)Don't pair WhatsApp, or neo channels logout whatsapp
Your provider's OAuth server (claude.com, auth.openai.com)Standard OAuth handshake (no conversation data)Only during neo login for that providerDon't run the login flow; use an API key instead
A telemetry OTLP endpointStructured log/metric events (module, level, provider, model, timing — no conversation content)Only if you set telemetry.otlp.endpoint in settings yourselfLeave telemetry.otlp.endpoint unset (the default)

A note on native web search and MCP servers you add: once you point Neo at a third party (an MCP server, an OpenAI-compatible endpoint, a self-hosted SearXNG instance), what that third party does with the data is outside Neo's control — the same as installing any tool that talks to a service you chose.

What stays local

Everything else lives under ~/.neo (or $NEO_HOME if you've overridden it, runtime/paths.ts:19-21) and never leaves your machine on its own:

PathWhat's there
~/.neo/sessions/Conversation history and resumable session state
~/.neo/memory/MEMORY.md index and individual memory files
~/.neo/config/settings.json, providers.json, mcp.json
~/.neo/telemetry/events.jsonlLocal telemetry log (file sink — never sent anywhere unless you add an OTLP sink)
~/.neo/auth/Provider OAuth tokens
~/.neo/mcp/oauth/MCP server OAuth tokens
~/.neo/channels/*.dbWhatsApp (Baileys) paired-device credentials
~/.neo/daemon/Host-local locks, logs, sockets for the always-on daemon
~/.neo/.envPlaintext fallback for secrets when the OS keychain isn't available

Keychain and secret handling

Provider API keys and channel credentials are stored in your OS's native credential store — Windows Credential Manager, macOS Keychain, or Linux Secret Service/libsecret — via @napi-rs/keyring (runtime/keyring.ts:1-42). If the OS keychain probe fails (e.g. headless Linux with no Secret Service), Neo falls back to a plaintext ~/.neo/.env file and logs that decision (runtime/secret-store.ts:40) rather than failing silently.

neo export --all bundles your sessions, memory, and config for backup or migration, but it never includes secrets: OS keychain entries, .env, OAuth tokens, and WhatsApp pairing credentials are excluded outright (src/actions/export.ts:32-41), and any literal secret that snuck into a hand-edited mcp.json/providers.json (instead of the usual ${ENV_VAR} placeholder) is redacted to "<redacted>" before the bundle is written (src/actions/export.ts:111-205) — the export reports how many values it redacted. See Uninstalling & exporting your data for the full export/uninstall walkthrough, including what neo uninstall removes (OS keychain entries, channel logins, daemon autostart) versus what it deliberately leaves for you to delete yourself (~/.neo is never deleted automatically).

Update check details

Neo checks https://registry.npmjs.org/@nehoraihadad%2Fneo-agent/latest for a newer version, at most once every 24 hours, caching the result in ~/.neo/.update-check.json. The request carries no payload beyond the plain GET — no machine ID, no usage stats, nothing identifying you or your install. On any failure (offline, timeout, non-2xx, malformed response) it silently does nothing; it is a courtesy banner, never a hard dependency (runtime/update-check.ts:10-13). Set NEO_UPDATE_CHECK=off to disable the passive banner entirely — neo update --check still works as an explicit, on-demand command regardless of this setting.

Channels — know what you're opting into

  • Telegram: messages you send through your Telegram bot pass through Telegram's servers as part of how the Bot API works — that's inherent to using Telegram, not something Neo adds on top.
  • WhatsApp: neo-wa connects via Baileys, an unofficial, reverse-engineered protocol — not Meta's official WhatsApp Business API. This carries real account-ban risk, which is why pairing requires explicit confirmation. Use a dedicated secondary number. See Channels — WhatsApp for the full warning and setup details.

Our commitment

Neo has no telemetry service and no analytics vendor collecting data on your usage. We will not add a phone-home mechanism without an explicit opt-in and a changelog entry — no silent additions, ever. If that ever changes, this page changes with it.

See also