infinimesh

Apache-2.0 · self-hosted · written in Go

The device layer for your IoT and AI stack.

infinimesh handles device identity, access and state. Your data goes to the tools you already use: Kafka, Postgres, InfluxDB, a webhook. No dashboard you have to adopt. The open source core is complete and free. No feature is held back for a paid tier.

Run it in 5 commandsDevice examplesSource on GitHub

How it works

Devices connect over MQTT 3.1.1 or 5, or send their own JSON over HTTP with POST /v1/ingest and a device token. The bridge checks the device certificate and topic. The shadow keeps reported and desired state. Addons read the stream and write it where you want it.

Data flow: device, MQTT bridge or HTTP API, shadow, addons, your stack DevicesESP32, Pico W, gateways MQTT bridge3.1.1 / 5, QoS 0-2, TLS 8883 HTTP APIREST, gRPC, Connect Registry + shadowidentity, permission graphreported / desired state Addonsseparate processes Your stack Kafka / KafScalePostgres / TimescaleInfluxDBWebhookMQTT brokerS3, Snowflake, more desired state back to the device

Access is the data model

Accounts, namespaces and devices form a graph. Share a namespace with a customer at READ, and with their service partner at MANAGE. Each one sees their devices and nothing past them. This is in the open source core, not a paid tier.

Permission graph: maker account owns namespaces; customer and partner get shares Maker account (owner) Namespace: Customer A Namespace: Customer B Device 1Device 2Device 3 Customer AREAD Service partnerMANAGE on A, READ on B Customer BREAD

Relevant if you sell connected products in the EU and need to give customers access to their device data under the Data Act. infinimesh gives you the access model. It does not make you compliant by itself.

Who it is for

Device makers

You run your own backend and need each customer, and their partners, to see only their devices.

Teams with a data stack

You already have Kafka, Postgres or a warehouse and want devices to feed it, not a second dashboard.

Self-hosters

You want the backend on your servers, under Apache-2.0, without a price list per device.

Stable v1 API

REST under /v1, gRPC and Connect from one proto schema. Breaking changes are checked against the v1.0.0 tag. Versioning policy, API reference.

When not to use it

You want an all-in-one UI

No dashboards. Rules and alarms on device state are in core, but charts are up to you. Use Grafana on top of an addon, or ThingsBoard.

You need OTA inside the core process

Firmware delivery is a separate addon you build: hawkBit, Mender, or a signed webhook. None of them is a published image.

You need an HA broker cluster now

Bridge sessions can live in Redis, so a restart keeps them. A tested multi-replica broker cluster is not there yet.

New in 3.4

See it

The console from the 3.4 release, running on one laptop with Docker Compose.

Devices in a namespace with their tags and latest reported state.
One device with the OTA target version set in its desired state.
Rules: a CEL condition, a clear condition and a cooldown per rule.
Alarms raised by those rules, ready to ack or clear.
The namespace OTA switch. It turns on only after an OTA addon is registered.

Addons

Each addon is a small separate service that reads device state and writes it out. Writing your own is mostly reading one stream: one stream per account or namespace, with device added and removed events, and an event id on every message so retries can drop duplicates. A read-only streaming token lets a long-running addon follow it without a per-device token. Stream docs, addons repo.

All addons ship as source in the addons repo. You build them yourself. There are no published images and no Helm entries. The latest addons release is v3.4.2.

Data sinks and connectors

Kafka / KafScale

One JSON record per shadow update on a Kafka topic, keyed by device id. Works with Apache Kafka and KafScale.

Postgres / TimescaleDB

One row per shadow update in a Postgres table, optionally a TimescaleDB hypertable.

InfluxDB 2 and 3

One point per shadow update, written with the official v2 client. Works with InfluxDB 2, Cloud and 3.

Webhook

One HTTP POST with a JSON body per shadow update, with retries and backoff.

MQTT bridge

Publishes shadow updates as JSON to an MQTT broker you already run, such as Mosquitto, EMQX, HiveMQ or AWS IoT Core.

RedisTimeSeries

Writes every number in reported state to RedisTimeSeries. The compose file also starts Grafana.

Redis stream

Writes reported state to the Redis stream objects, which the Elasticsearch, Snowflake and SAP HANA sinks read.

Elasticsearch

Writes device state from the Redis stream into the Elasticsearch index infinimesh. Runs next to redisstream.

Snowflake

Writes device state from the Redis stream into a Snowflake table. Runs next to redisstream.

SAP HANA

Writes device state from the Redis stream into a SAP HANA table. Runs next to redisstream.

Cloud Connect

Writes reported state to CSV files per device and minute, then uploads them to S3, Google Cloud Storage or Azure Blob.

OTA

hawkBit OTA

Connects a namespace to a hawkBit update server and assigns the distribution set for a requested version.

Mender OTA

Connects a namespace to a Mender open source server and creates one deployment of the requested artifact.

Signed OTA webhook

Posts OTA and membership events to your endpoint, and accepts a target or a report back. Needs core 3.4.2 or newer.

AI ready

AI agents and LLMs need device data with the same access rules as people. infinimesh has that model already. Device state will be available to AI agents over MCP and to any LLM through addons, scoped by the same permission graph. An agent sees only the devices its token can see.

You can run models locally with vLLM or Ollama, so device data stays on your servers. Hosted APIs work too, if you choose them.

MCP server coming soon

Read device state and set desired state from an AI agent, within the token's permissions. Not built yet.

LLM addon coming soon

Send device state to any OpenAI-compatible API: vLLM, Ollama, Mistral, OpenAI, Anthropic, Gemini. Not built yet.

Neither exists today. Until they ship, use the webhook or MQTT bridge addon to feed your own agent.

How it compares

FeatureinfinimeshThingsBoard CEMagistrala CEEMQX
LicenseApache-2.0, complete core, nothing held backApache-2.0, paid PEApache-2.0, paid EEBSL for recent versions
Per-customer device accessGraph in coreCustomer hierarchy in PEYesNo device registry
Device shadowYesAttributesNoNo
Dashboards and rulesRules and alarms, no dashboardsYesMoved to EERules engine
OTA firmware updatesOTA contract in core, delivery through addons you build yourself (hawkBit, Mender, signed webhook)Built inNot in core, the separate edge Agent does binary updatesNot a device backend
StackGo servicesJavaGo, many servicesErlang

Sources: ThingsBoard CE vs PE, Magistrala CE/EE, EMQX license. Checked 2026-10-12. Magistrala Agent and Magistrala docs for OTA, checked 2026-10-16.

Quickstart

One machine with Docker Compose.

git clone https://github.com/infinimesh/core.git
cd core
cp .env.example .env
docker compose up -d

.env.example pins INFINIMESH_VERSION=v3.4.3. On Kubernetes, the Helm chart is helm install infinimesh oci://ghcr.io/infinimesh/charts/infinimesh --version 3.4.3.

Open http://console.127.0.0.1.nip.io

Log in as infinimesh / infinimesh. Change the password right away.

CLI:

brew tap infinimesh/inf-cli https://github.com/infinimesh/inf-cli
brew install inf
inf login api.127.0.0.1.nip.io:443 infinimesh infinimesh --insecure-skip-verify

The local certificate is self-signed, so the CLI skips the check. Use a 3.4 CLI with a 3.4 core. The CLI guide covers quotas, rules, OTA and audit.

Then connect a device: ESP32 over MQTT, ESP32 over HTTP, Pico W, or curl. Small boards that time out on TLS: read the small-device TLS guide.