Local-AI Telemetry Audit: Which Self-Hosted Tools Phone Home
You moved your AI stack on-premise for privacy — but “runs locally” and “opens no sockets to the internet” are different claims, and most guides never check the second one. This registry audits fourteen self-hosted AI tools at the code level: what each one contacts by default on install, launch and idle (update checks, analytics SDKs, registry pulls), the exact domains involved, whether it’s opt-in or opt-out, the exact environment variable or setting that kills it, and a copy-paste air-gap recipe per tool. Evidence is graded — source code first, official docs second — and anything that couldn’t be verified exactly says unverified instead of pretending.
Quick answer
"Local" is not the same as "offline". Of the fourteen self-hosted AI tools audited here, only four are truly zero-outbound by default (llamafile, whisper.cpp, KoboldCpp, llama.cpp with a local model file). Three ship usage telemetry switched ON — vLLM (stats.vllm.ai, every 10 minutes), AnythingLLM (PostHog) and Open WebUI (PostHog via its bundled ChromaDB, though the official Docker image pre-disables it) — all honestly documented and all killable with one env var. Ollama has no analytics at all, but its desktop tray app checks ollama.com for updates hourly (the headless server is silent). LM Studio is closed source: its docs promise your chats stay local, but that promise cannot be code-verified, and it does phone home for updates and opt-out usage stats. GPT4All's analytics are opt-in, yet its launcher unconditionally fetches its catalog over plain HTTP with certificate verification disabled.
The pleb rule: assume every GUI phones home until the source code says otherwise. Set DO_NOT_TRACK=1 globally (vLLM, Open WebUI and others honor it), use the per-tool env vars below, and for a real air-gap: pre-download models, then firewall the listed domains — a docs promise is not an observed-silent socket.
none zero outbound by default model-downloads-only user-initiated fetches only update-check pings home for versions telemetry / multiple analytics or several defaults ON A/B/C evidence grade (source-code / docs / community)
| Tool | Default outbound | Endpoints & kill switches | Telemetry | Air-gap recipe | License | Grade |
|---|---|---|---|---|---|---|
| llamafile~v0.10.x, July 2026 | none | — no unsolicited endpoints | non/a | Run ./model.llamafile — weights are embedded in the executable, the HTTP server binds localhost only, zero outbound out of the box. Nothing to download, nothing to block. | Apache-2.0 | A |
| The strictest air-gap answer on this list: a single Cosmopolitan-libc binary with the model inside. Evidence: official docs + source (Mozilla llamafile repo). | ||||||
| Whisper.cppmaster, July 2026 | none |
|
non/a | whisper-cli -m /path/ggml-*.bin -f audio.wav makes zero network calls. The only outbound path is the user-run download helper script. | MIT | A |
| Plain C/C++ with no update check and no analytics. Evidence: source code (no HTTP client in core). | ||||||
| KoboldCpp~v1.9x, July 2026 | none |
|
noopt-in (all remote features) | koboldcpp --model model.gguf binds localhost:5001 with zero outbound. Skip --remotetunnel, AI-Horde worker mode and URL model fetch and it never opens a socket outward. | AGPL-3.0 | A |
| Single-file binary; every outbound path is an explicit opt-in flag. Evidence: source code + maintainer README. | ||||||
| llama.cpp (llama-server)master, July 2026 | none |
|
non/a | llama-server -m /path/model.gguf is fully offline — no update check, no analytics code in the binary. If you used -hf, add --offline to pin the cache. | MIT | A |
| The one caveat: an -hf-sourced model may GET huggingface.co at startup unless --offline is set. Evidence: source code (network only in the HF download path). | ||||||
| text-generation-webui (oobabooga)main, July 2026 | model-downloads-only |
|
noopt-out (project already disabled it for you) | Gradio's api.gradio.app analytics is double-disabled in-tree (GRADIO_ANALYTICS_ENABLED=False + analytics_enabled=False). Export HF_HUB_OFFLINE=1 and TRANSFORMERS_OFFLINE=1 after caching models and it is fully offline. | AGPL-3.0 | A |
| The historically risky path — Gradio's default telemetry — is explicitly neutralized in source. Evidence: source code (server.py, issue #801). | ||||||
| LocalAIv4.7.x, July 2026 | model-downloads-only |
|
non/a | Preload models ($LOCALAI_PRELOAD_MODELS) and backends, then --autoload-galleries=false --galleries='[]' --disable-gallery-endpoint. The local /metrics endpoint is Prometheus-style with no egress (disable: $LOCALAI_DISABLE_METRICS_ENDPOINT=true). | MIT | A |
| The one telemetry scare was a misread of the bundled OpenTelemetry /metrics endpoint — local-only; the maintainer rebutted it and shipped a disable flag. Evidence: maintainer statement (issue #3942) + source + CLI docs. | ||||||
| OllamaJuly 2026 (updater unchanged for years) | update-check |
|
non/a | ollama serve has no updater and no analytics SDK — pre-pull your models and it runs fully offline. The only unsolicited ping is the GUI tray updater: use the server binary or block ollama.com. | MIT | A |
| "Zero telemetry" is true of analytics but imprecise for the desktop app — the tray updater phones ollama.com hourly. Server use: genuinely silent. Evidence: source code (app/lifecycle updater.go; no analytics SDK in repo). | ||||||
| ComfyUI (core)master, July 2026; Manager + Desktop are separate products | none |
|
no (core even sets DO_NOT_TRACK=1 and HF_HUB_DISABLE_TELEMETRY=1 itself)n/a (Desktop app's analytics are opt-in — a separate product using PostHog/Datadog per its privacy policy) | Core Python install is fully offline once models and frontend are present. If Manager is installed set network_mode=offline (and verify — reports exist it is not always fully honored). Avoid the Desktop build for true air-gap. Audit custom nodes separately — they run arbitrary Python. | GPL-3.0-only | A |
| Network activity blamed on ComfyUI is almost always the Manager extension or the Desktop app, not core. Evidence: source code (main.py) + Manager source + comfy.org privacy docs. | ||||||
| Jan~v0.8.x (Tauri), July 2026 | update-check |
|
yes — PostHog EU, but OPT-IN and off by defaultopt-in | Analytics needs no action (default off). Disable the auto-updater or firewall apps.jan.ai + github.com; import local GGUF files and inference is fully offline. | Apache-2.0 | A |
| Default install phones home only for update checks; exact PostHog ingest hostname unverified (CSP lists the EU asset host). Evidence: source code (tauri.conf.json updater + CSP hosts) + privacy docs. | ||||||
| GPT4Allv3.10.0 (Feb 2025 — app dormant since) | multiple |
|
yes — Mixpanel, but OPT-IN and off by defaultopt-in (analytics + Datalake); the catalog/update/news fetch has NO toggle | Decline both first-launch prompts, then firewall gpt4all.io, api.gpt4all.io, api.mixpanel.com, api.ipify.org. Inference is fully local after model download; the unconditional catalog/news fetches fail harmlessly offline. | MIT | A |
| Genuinely opt-in analytics, but NOT zero-outbound: the launch-time catalog/update/news fetch runs plain HTTP with cert verification off and cannot be disabled in-app. Desktop app appears dormant since Feb 2025. Evidence: source code (network.cpp, mysettings.cpp, download.cpp). | ||||||
| LM Studio0.3.x line, July 2026 (closed source) | multiple |
|
yes — anonymized usage/search stats per privacy policy (vendor undisclosed; closed source)opt-out | Disable anonymous usage data in Settings, pre-download models, then network-block the app. Docs state chats/RAG never leave the device — but closed source means none of it is code-verifiable. | Proprietary | B |
| Never describe LM Studio as zero-telemetry: it phones home for updates and ships opt-out usage stats, and exact domains are unpublished. Evidence: official docs only (lmstudio.ai/app-privacy) — no source to audit. | ||||||
| Open WebUIv0.6.x, July 2026 | telemetry |
|
yes — PostHog via the ChromaDB dependency + Scarf install analyticsopt-out (official Docker image pre-disables the ChromaDB telemetry) | Set ANONYMIZED_TELEMETRY=false, DO_NOT_TRACK=true, SCARF_NO_ANALYTICS=true (the first is already false in the official image). Chat inference itself stays local once models are on your runtime. | BSD-3-Clause + branding clause (since v0.5.4 — not pure OSI) | A |
| The telemetry originates in the bundled ChromaDB vector store; a ChromaDB pin fix landed in v0.6.18. Scarf destination domain unverified. Evidence: maintainer statement (discussion #15624) + .env.example + docs. | ||||||
| AnythingLLM~v1.15, July 2026 | telemetry |
|
yes — PostHog Cloud, ON by defaultopt-out | Set DISABLE_TELEMETRY="true" exactly (source checks === "true") or use the Privacy toggle; pick local providers only (Ollama/LocalAI + built-in embedder + LanceDB). Belt-and-suspenders: firewall app.posthog.com — issues #5496/#4534 suggest the flag alone may not kill every connection. | MIT | A |
| Docs say anonymous event metadata only, never chats/documents — but it ships enabled, which most self-hosters do not expect. Evidence: source code (server/models/telemetry.js, docker/.env.example). | ||||||
| vLLMv0.7–v0.11 line, July 2026 | telemetry |
|
yes — first-party (no third-party SDK; collected data is publicly released)opt-out | Export VLLM_NO_USAGE_STATS=1 (or DO_NOT_TRACK=1) before launch; add HF_HUB_OFFLINE=1 with pre-downloaded weights for full air-gap. A local copy of what would be sent sits in ~/.config/vllm/usage_stats.json — read it yourself. | Apache-2.0 | A |
| The most-cited surprise in local-AI serving: production inference engine, telemetry ON by default — though transparently documented and honoring DO_NOT_TRACK. Evidence: source code (vllm/usage/usage_lib.py) + official usage-stats docs. | ||||||
Open data (CC BY 4.0): CSV · JSON · API: /wp-json/dc/v1/ai-telemetry?tool=vllm
Why “local” is not “offline”
Even tools that never transmit a single prompt routinely make unsolicited outbound connections for other reasons: desktop update checks (Ollama’s tray app, Jan’s Tauri updater, LM Studio), usage telemetry — first-party (vLLM’s stats endpoint) or smuggled in by a dependency (Open WebUI inherits PostHog from its bundled ChromaDB vector store) — crash reporters, model-registry and node-catalog pulls, and install-analytics beacons like Scarf. Model downloads are user-initiated and expected; this audit cares about what fires without asking. The cleanest cross-tool kill switch is the DO_NOT_TRACK convention — vLLM and Open WebUI both honor it — but per-tool env vars remain the reliable path, and a firewall rule remains the only proof.
Reading the verdicts fairly
A “telemetry” badge here is not an accusation of spying. vLLM’s usage stats are transparently documented, anonymous, and publicly released; AnythingLLM’s events are metadata only, never your chats or documents — the issue is that they ship enabled, which is not what most self-hosters assume. Conversely, an “opt-in” label doesn’t mean zero outbound: GPT4All’s analytics are genuinely off by default, yet its launcher still fetches its model catalog unconditionally over plain HTTP with certificate verification disabled. And closed source cuts both ways: LM Studio’s privacy policy is reasonable, but nobody can verify it in code, which is why it caps at evidence grade B. If your threat model is real — client data under Law 25, clearance environments, air-gapped coding — the recipe column plus a default-deny egress rule is the answer, not any vendor’s promise.
This registry completes the sovereignty story of our local-AI stack references: pick your runtime with the inference server comparison, size it with the VRAM & throughput calculator, ground it with local embedding models and a self-hosted vector database, then verify it’s actually private with the table above. For hardware that never needed a cloud in the first place, start at the Local LLM Canada hub.
Related products, repair, and setup paths
- self-hosted AI for Bitcoiners hub
- plebs guide to self-hosted AI
- install Ollama in 10 minutes
- LM Studio vs Ollama vs llama.cpp
- connect local AI to Home Assistant and Obsidian
- self-hosted AI troubleshooting
- repurpose mining hardware into an AI hashcenter
- local AI model leaderboards
Last reviewed July 18, 2026.
