3 Aug 2026 · 4 min read

United Manufacturing Hub, explained for the person who has to maintain it

uns · mqtt · architecture · scada · automation · open-source

The pitch is one Docker container. Point it at your PLCs, get a Unified Namespace, done.

That is the second version. The first one needed a Kubernetes cluster, and the reason they tore it out is the most useful thing about the project — because it reads like a list of everything that goes wrong when a data-centre pattern meets a plant floor.

What it actually is

United Manufacturing Hub is an open-source platform for getting data off machines and onto a common bus.

WHO IS BEHIND IT

2021
founded

three founders, Germany

€5M
Series A

January 2026, led by KOMPAS VC

~150
sites running it

not a lab project

Apache-2
licence

their code; the broker is not — see below

Named customers are food and automotive — HiPP, Edeka, Böllhoff. Small company, real deployments.

The current product, UMH Core, is a single container with four processes in it.

ONE BOUNDARY, FOUR PROCESSES

docker run … umh-corenothing outside this lineredpandabuffers to diskborrowedbenthos-umh50+ driversUMH's ownagentone config fileUMH's owns6restarts thingsborrowedone process supervisor · one config file · one place to look
Two of the four are borrowed. An integration platform that writes its own message bus is asking a plant to bet uptime on its least-tested component.

Only two of those four are UMH's own code. The broker is Redpanda and the supervisor is S6, both borrowed. That is the right instinct at this layer: an integration platform that writes its own message bus is asking a plant to bet uptime on the least-tested component in the building.

The complaint it was founded on

Their own documentation is blunter than most vendor writing, and it is worth quoting because it explains the shape of everything else:

very often these solutions do not target the actual pains of an engineer: implementation and maintenance

That is the whole thesis. Not connectivity — connectivity was solved by OPC UA and MQTT years ago. The claim is that IIoT platforms are sold on what they can do in a demo and priced on what they cost to keep running, and that nobody optimises for the second number.

Whether they deliver on it is a separate question. But it is an unusual thing to found a company on, and it is the correct complaint.

The Kubernetes they threw away

UMH Classic was a Helm chart. You got Kafka, HiveMQ, Node-RED, TimescaleDB and Grafana, orchestrated on Kubernetes, and on paper it was the modern answer.

Then it met actual factories. Their own list of what broke:

CLASSIC → CORE

UMH CLASSIC · a Helm chartkafkahivemqnode-redtimescalegrafanasidecarsservice meshhelm valuesdeletedUMH COREone containerkubernetes now optionalUMH CORE · a docker run
Installing ittight OS images, firewalls, network hoops
Operating itpods, sidecars, service meshes — a forest of YAML
Knowing it worksa pod reads Running when the process started, not when data flows
Changing itabout 30 seconds for a config change to land
Keeping it togetherNode-RED, broker and bridges drifting apart
Fitting the hardwarekubelet competing for CPU and RAM on an edge box
UMH's own reasons, not mine. Every line is something an integrator would recognise from a commissioning week.

Read the third one twice, because it is the one that costs you a night. A Kubernetes pod reports Running when the process has started, not when the thing is working. So a data flow can be silently dead while every dashboard is green, and finding out means correlating pod logs, kubectl events and a load balancer. Anyone who has chased a stuck OPC UA subscription through three layers of abstraction knows exactly what that evening looks like.

The fix was to stop distributing the problem. One container, one process supervisor, one config file, one place to look. Kubernetes became — their phrase — an optional scheduler, not a hard dependency. You can still run it on k8s. You no longer have to explain k8s to the person covering your holiday.

I want to be fair about the trade: they gave up real things. Per-component scaling, rolling upgrades of one piece, the whole k8s operational toolbox. Their argument is that a plant deploys per production line anyway, so you scale by adding containers rather than pods, and a container manager restarts a crash in 30–60 seconds. For one line in one building, that is enough.

What you actually get

Every message lands at an address, and the address is the model.

ONE ADDRESS, SIX PARTS

northwind.enterprisesite-a.siteutilities.areapump01.asset_historian.contractbearing_temperaturetag1,014 tags · 86 assets · Modbus and MQTT · none of it declared
Nobody types any of this. You configure a source; the tree writes itself.

I ran this against a live estate: 86 assets and 1,014 tags, Modbus and MQTT in one hierarchy, not a line of it declared anywhere. One substring query crosses both protocols. The full write-up is here, including where it fell over.

The _contract segment is the part most UNS deployments never build. It states what kind of thing the message is, and it can enforce a model — a station either publishes the fields its contract requires or the message is rejected. That is the whole difference between a designed namespace and a topic tree somebody typed into a broker, which is what most of them are.

What it deliberately isn't

Core does not store anything. Classic bundled TimescaleDB and Grafana; Core pushes both out to a separate package, and their reasoning is sound — plants already run their own Grafana, and an auto-upgrade that breaks somebody's dashboards at 2 a.m. is a bad trade for convenience.

The upshot is that UMH Core is a data plane, not a system. You still need somewhere to put the data and something to draw it. UMH's own advice, which I would repeat:

CORE STORES NOTHING — SO WHAT DO YOU NEED

what do you need?COREstorage and dashboards already sortedCLASSICyou need the historian bundled nowNEITHERone line, one SCADA, nobody waiting
CORE

You want to move data and build a namespace. Core does that and nothing else.

CLASSIC

TimescaleDB and Grafana in one install, and you can live with Kubernetes.

NEITHER

A broker and a historian already cover you. A namespace layer buys tidiness you will pay to maintain.

The first two are UMH's own guidance. The third is mine, and it is the one a vendor will never put on a page.

One licensing detail, because it gets repeated carelessly. UMH's code is Apache-2. The broker at the centre of Core is Redpanda, which is BSL 1.1 — source-available, converting to Apache-2 four years after each merge, and barred from resale as a streaming service. Free to run on your own plant, and not the same thing as an open-source stack. If your procurement asks, that distinction matters.

Who should look at it

If you have one line, one SCADA and no plans, you do not need this. A broker and a historian cover you, and adding a namespace layer buys tidiness you will pay to maintain.

It earns its place when you have several sites naming the same asset three different ways, something downstream genuinely waiting for the data, and nobody who wants to hand-write another integration. That is the same test I would apply to any product at this layer — the difference is that this one costs nothing to try and runs on a spare industrial PC.

The reason I would look at it before the commercial options is not the price. It is that a team who publicly ripped out their own architecture because it was too hard to maintain in a factory has demonstrated the one thing you cannot get from a datasheet: they have been on a plant floor at three in the morning, and they took the lesson.

Keep reading

Newsletter

New essays, by email.

SCADA, cloud, AI, and the plant floor — a short email when something new is published. No noise, unsubscribe anytime.