FR
live

Immich shuts off the Microsoft telemetry that ONNX Runtime silently enabled in its machine-learning container

On November 4, 2026, Immich fixed an ONNX Runtime 1.29 dependency whose Microsoft telemetry was enabled by default in the machine-learning container. Self-hosters should move to 3.3.6 or disable telemetry via an environment variable.

A tidy server rack in a dark room, a single ethernet cable slipping out under a closed door into darkness, its amber connector glowing.

November 4, 2026. Immich merges a fix that disables ONNX Runtime telemetry by default in its machine-learning container. August 12, 2026. A user had opened issue #30729 documenting that ONNX Runtime 1.29, published by Microsoft, shipped with telemetry enabled by default on POSIX builds. November 4, 2026. The fix ships in Immich 3.3.6. Why it matters: the number-one argument for self-hosting is privacy, and a single transitive dependency quietly broke it.

The flaw is not Immich’s, but its dependency’s

The immich-machine-learning container runs AI models for facial recognition, semantic search and object detection. To do that it leans on ONNX Runtime, Microsoft’s inference engine. Immich declared its dependency with a wide range — onnxruntime>=1.23.2,<2 — which let version 1.29 in with no extra condition.

That range actually covered four variants — cpu, armnn, rknn and cuda (via onnxruntime-gpu) — all within reach of the affected 1.29 wheels. That is several entry points through which telemetry could slip in, depending on the hardware you host on.

ONNX Runtime 1.29 introduced a quiet change: on native Linux, macOS, Android and iOS builds, telemetry is compiled in and enabled by default, unless built with --no_telemetry or unless ORT_DISABLE_TELEMETRY=1 is set before initialization. The collector is Microsoft’s 1DS endpoint, at https://mobile.events.data.microsoft.com/OneCollector/1.0. In plain terms: a self-hosted container, meant to send nothing outward, could start phoning Microsoft on the first lockfile refresh.

This is why the episode stings. Self-hosters choose Immich precisely to keep their photos — faces, locations, metadata — off someone else’s servers. A silent outbound telemetry flow from the ML container does not leak the photos, but it does break the mental model: the box you control quietly began sending hardware and usage fingerprints to a vendor you never opted into.

What the telemetry collects — and what it does not

Issue #30729 is worth reading for its rigor: its author unpacked the official 1.29 archives and confirmed the presence of markers like Microsoft::Applications::Events, modelGraphHash and ORT_DISABLE_TELEMETRY, all absent from the 1.28 binaries. The payload is documented in the POSIX collector’s source. Events can include:

  • a persistent, hashed device identifier, whose underlying UUID is stored under ~/.cache/Microsoft/DeveloperTools/.onnxruntime/;
  • the OS description, architecture, CPU model, core count and total memory;
  • model metadata: producer, version, domain, graph names, graph and weight hashes, execution providers and their versions;
  • scrubbed error information and aggregated performance measurements.

The collector also keeps an offline event cache, so events are retained locally before upload — meaning the trail exists on your disk even when the network is down. None of this is surfaced to the Immich operator: it runs entirely at the dependency level, below Immich’s own observability.

The author found no evidence that input tensors, photos or videos are transmitted. That is beside the point: it is a new outbound flow of pseudonymous, system, hardware and usage information from a self-hosted service — and it is independent of Immich’s IMMICH_TELEMETRY_INCLUDE setting. Leaving that empty disables nothing.

Three months between detection and fix

The timeline deserves attention. The issue was opened on August 12, 2026, with a full technical analysis — binary evidence included, hashes of the official 1.28 and 1.29 archives compared, telemetry markers found in the Linux binary and absent from the 1.28 control. Immich’s fix only landed on November 4, 2026, nearly three months later. Throughout that window the risk stayed latent: Immich’s lockfile still pointed at ONNX Runtime 1.26, so existing installs sent nothing — but any dependency refresh could flip an install to telemetry-enabled 1.29 with no warning to the user. That is the nature of a dependency regression: it sleeps until a build wakes it.

The fix, and what to do depending on your version

Immich moved fast. On November 4, 2026, the issue was closed by pull request #32956, and the fix landed in 3.3.6. On an up-to-date install, a version bump is enough: ONNX Runtime telemetry is now disabled by default in the image.

If you are a few versions behind, the workaround is a single environment variable added to the machine-learning service of your docker-compose.yml, before Python imports ONNX Runtime:

yaml
  immich-machine-learning:
    environment:
      - ORT_DISABLE_TELEMETRY=1

The variable prevents uploader initialization, event emission and device-ID persistence for the whole process lifetime — an end-to-end safeguard, independent of version.

Auditing your own containers, beyond Immich

The episode is a lesson for everything you run at home. Telemetry does not announce itself: it is something you go looking for. Two reflexes are enough to catch it, without a heavy audit:

  • list the opt-out variables of the inference dependencies you embed — ORT_DISABLE_TELEMETRY for ONNX Runtime, but every engine has its own equivalent;
  • watch your containers’ outbound DNS: a call to mobile.events.data.microsoft.com or any unknown collection domain is the most reliable signal that a dependency changed its behavior.

Immich, for its part, confirmed its responsiveness by shipping the fix in 3.3.6 and preparing 3.4.0, whose beta finally brings tags to mobile — a feature users had awaited since August 2024. A project can introduce a dependency regression and fix it fast; what matters is the traceability of the fix and how quickly the team owns the problem.

The problem extends beyond Immich. ONNX Runtime is one of the most widespread inference engines in self-hosting: it sits behind image recognition, speech synthesis and semantic search in dozens of applications you run at home. Every project that embeds it without setting the opt-out variable inherits the same flaw, silently, on its own dependency-refresh cadence. This is not an isolated bug in Immich, but a Microsoft default whose reach spans the whole ecosystem — and one every self-hoster should check for themselves.

Verdict

This is not an exploitable vulnerability, and no sensitive data — photo or video — was transmitted. It is a more awkward reminder: “self-hosted” does not mean “no third-party outbound traffic.” One transitive dependency, bumped without review, was enough to reopen a channel Immich had worked hard to keep closed.

If you run Immich, move to 3.3.6 without delay: the fix is official and restores the expected behavior. If you are pinned to an older version, set ORT_DISABLE_TELEMETRY=1 on the machine-learning container and audit your other inference dependencies — the same flaw can exist in any project that embeds ONNX Runtime without auditing it. The lesson applies to all of self-hosting: privacy is defended in the dependencies, not just in the choice of application.

References

The cyber brief, every Tuesday

The flaws that matter and the patches to apply, in a ten-minute read.

No spam. One-click unsubscribe.
read next

On the same topic

Samsung puts a $5 monthly fee on the SmartThings API and pushes Home Assistant users toward local control

Announced in June 2026, the move to $4.99 per month for the SmartThings API for individual developers takes effect this autumn, ending years of free access for third-party integrations like Home Assistant, while the LocalThings project emerges to restore local control. For anyone driving Samsung devices from Home Assistant, the right answer is not to pay the subscription but to migrate automations onto local paths that no future fee can close.

← Back to the feed

Type at least two characters.

↑ ↓ navigate ↵ open esc dismiss