Skip to main content
August–October 2026
Breaking Changes in this release (2.15–2.22):TYPE MCP_SERVER is gone — The MCP server is now broker configuration, not a LoT connector, and a project that still defines TYPE MCP_SERVER fails to load. Enable Mcp.Enabled (or COREFLUX_MCP_ENABLED=1), mint a token with -createMcpToken, and point the client at Streamable HTTP /mcp. Legacy SSE URLs stop working. The MCP client connector (TYPE MCP / CALL MCP) is unchanged. Action: remove old TYPE MCP_SERVER definitions and follow MCP Server.TYPE AGENT connectors are removed — -addConnector refuses them and stored ones are skipped at load, with their topics. Rewrite each as a TYPE LLM connector plus DEFINE AGENT … USES LLM CONNECTOR; nothing is granted until ADD TOOL, and writes need WITH LEVEL "write". There is no automatic migration. Action: rewrite agents before you upgrade. See Coming from TYPE AGENT.No built-in trial — A broker with no license runs as Community. Get a 30-day Growth-type license at portal.coreflux.org, where you also manage your fleet.

2.22.0 - Things, Agents, licensing, and a built-in MCP server

This release lets you model devices once and reuse them (Things), build AI agents that only do what you allow, and connect tools like Cursor or Claude Desktop straight to the broker. It also adds signed licensing with fleet enrollment, certificate management, and clustering that runs your LoT on every node.

Highlights

  • Model a device once, then reuse it (Things, preview) — Describe a pump, a line, or a sensor type once. Each copy gets its own topics, and you add as many as you need without copying LoT. See Things.
  • Let AI act only where you allow it (Agents, preview) — An agent starts with no tools. You grant each read or write, and a question-only mode never changes the broker. See Agents.
  • Work on the broker from Cursor or Claude — A built-in MCP server lets those tools run broker commands, with tokens you create and revoke. See MCP Server.
  • Keep every cluster node on the same LoT (Beta) — Deploy to any node and the whole cluster runs it. A device connector can stay on the node that can reach the equipment. See LoT in a cluster.
  • License a broker and add it to your fleet — An unlicensed broker runs as Community. Activate online, use a signed file where there is no internet, and enroll the broker in your organization. See Licensing and Enrollment.
  • Replace certificates without a restart — Update the certificate the broker presents, choose which clients to trust, and see which certificates are about to expire. See Broker Certificates.
  • Sign in with your identity provider — Clients can use an OIDC access token as the MQTT password. Local passwords still work. See OIDC and Bearer Authentication.
  • Pause logic without deleting it — Turn an action, connector, or agent off, keep the definition, and turn it back on when you are ready. See Disable and Enable.
  • See when a device is actually down — Industrial connectors show Reconnecting when a PLC stops answering, and the last good tag values stay in place through a short disconnect. See Connection status.
  • Bring in audio, gRPC, and hundreds of APIs — Capture microphone audio onto MQTT, call gRPC services, and start from 220+ REST API app templates (technical preview). See REST API Apps.

Things and Agents (preview)

  • Define a device once — A Thing is a typed device with {{placeholder}} topics. Add instances with -addThing (use --dryRun to validate first), and manage them with -removeThing and -listThings, or the MCP tools add_thing, list_things, and remove_thing. Each Thing publishes its source, tree, and health under $SYS/Coreflux/Things/<name>. See Things commands.
  • Agents with limited access — An agent uses a TYPE LLM connector for its provider, model, key, and price, and starts with no tools. It gets only what ADD TOOL grants. Agents can ask each other for help with WITH AGENTS, and actions call them with CALL AGENT. Each agent publishes its card and status under $SYS/Coreflux/Agents/<name>/.
  • Read-only questions — Ask an agent with "mode": "insight" and it only reads, including any agents it delegates to. TYPE LLM also accepts REASONING_EFFORT (none to extra_high).

New connectors

  • Audio Input — Capture a microphone, test tone, silence, or a file as 16-bit PCM audio on MQTT (TYPE AUDIO_INPUT). See Audio Input.
  • gRPC — Call gRPC services from MQTT with TYPE GRPC, including streaming. See gRPC Connector.
  • REST API apps — 220+ ready-made TYPE REST_API templates for cloud, ERP, MES, messaging, and IIoT services, in technical preview. See REST API Apps.

MQTT and LoT

  • Connectors naming — DEFINE CONNECTOR and the -addConnector, -removeConnector, -listConnectors, -removeAllConnectors, and -checkConnectorConnection commands are the new names. DEFINE ROUTE and the -…Route… commands keep working as aliases.
  • Turn things off without deleting them — Put DISABLE true under DEFINE on an action, connector, or agent to keep it stored but not running. Switch it back on with -disableAction, -disableConnector, -disableAgent and the matching -enable… commands, or with MCP tools. See Disable and Enable.
  • Publish with retain and QoS — PUBLISH TOPIC accepts RETAIN and QOS0 / QOS1 / QOS2 (default QoS 0). KEEP TOPIC still only stores a value for GET TOPIC. See ACTION Operations.
  • Shared subscriptions — Turn on SharedSubscriptions and $share/{group}/{filter} delivers each message to one member of the group. Off by default. See Shared subscriptions.
  • Predictable topic triggers — ON TOPIC actions, models, and connector events run on the exact message that fired them, in publish order per topic. Different topics still run in parallel. See Action Triggers.
  • Every publish in an action is sent — Each PUBLISH TOPIC or KEEP TOPIC in one run is delivered, in the order written, with that line’s own retain, QoS, and keep settings. A later GET TOPIC in the same run reads the value just written. In a cluster, only the last KEEP of each topic is replicated. See PUBLISH TOPIC.
  • Panel wait and markdown — A button accepts SET AWAIT "Id, Id" and SET AWAIT_TIMEOUT (seconds, default 120). A text component accepts SET MARKDOWN true. See Wait on a button and Markdown text.

Licensing and enrollment

  • Plans — Community, Growth, and Enterprise, with limits on artifacts and connectors. Status is on retained $SYS/Coreflux/License and, on the ops port, GET /license (port 9100, keep it private).
  • Three ways to license — Activate online with COREFLUX_ACTIVATION_CODE or -activateLicense CFLX-… (limits apply without a restart, the lease refreshes daily, -refreshLicense forces it). Or install a signed license file (config/license.jws, COREFLUX_LICENSE_FILE, COREFLUX_LICENSE_TOKEN, or -loadLicense), which the broker verifies locally with no network. For air-gapped hosts, send the --show-fingerprint value to Coreflux and install the hardware-bound license you get back.
  • Enroll in your organization — -enroll et_… (or --enroll, or config/enrollment-token) binds the broker to your Coreflux organization, separately from its plan. An activation code enrolls it too. A broker waiting for enrollment still starts: local users work, and logins that need the organization are refused until it succeeds. $SYS/Coreflux/License explains why it is pending. See Licensing and Enrollment.

MCP server

  • Connect AI tools to the broker — Cursor, Claude Desktop, and other MCP clients connect to the broker’s built-in server, configured in the Mcp block (port 6278, bound to 127.0.0.1, path /mcp). Manage tokens with -createMcpToken, -listMcpTokens, and -revokeMcpToken, or from the HUB MCP tab. In Docker or Kubernetes, bind to 0.0.0.0, publish 6278, and route /mcp behind TLS. See MCP Server.
  • Install agent skills — The public coreflux-skills repository is generated from the broker, and the broker exposes the same pack as the coreflux://skills MCP resource. Coding agents that install it write LoT the broker accepts. They need broker 2.22 or later. See Agent skills.

Security

  • Sign in with OIDC — With Oidc.Enabled, a client sends an OIDC access token as its MQTT password. The broker validates it, checks the organization, and authorizes by the token’s groups. Local passwords still work. A client is disconnected when its token expires (30-second grace). See OIDC and Bearer Authentication.
  • Manage certificates from a command — -brokerCertificates (admin only) shows and replaces the server certificate and Root CA, and manages the mTLS trust store: list, import, export, revoke, settings. A new server certificate applies without a restart and keeps a .bak- copy. Revocation is immediate and every change is audit-logged. See Broker Certificates.
  • Know when certificates expire — Retained $SYS/Coreflux/Certificates/Summary counts valid, expiring, expired, and unreadable certificates. CertificateExpiryThresholdDays (default 30) sets the warning window. See $SYS/Coreflux/Certificates/Summary.
  • Easier trust store — ClientCertificateSourcePath loads .pem, .crt, .cer, .der, and unprotected .p12/.pfx files, skips anything in revoked/, and refuses keys and CSRs (install a server key with replaceServer). $SYS/Coreflux/Config shows ServerCertificatePassword as ********.

Clustering and operations

  • LoT works across a cluster (Beta) — Definitions replicate through the leader, so you can send LoT to any node and every node runs the same version. Each message runs LoT once, on the node it entered. Timers, ON START, and device connectors run on one owner and move to another node within about 10 seconds if it fails. Pin a device connector to a node with CLUSTER_NODE in ROUTE_CONFIG. Action: upgrade every node before you change LoT, and create users on every node.
  • Faster Kubernetes scaling (Beta) — A pod that the headless Service no longer lists leaves the cluster about 2 minutes after its cluster port stops answering (MemberAbsentFromDiscoverySeconds, 120 seconds by default; it used to wait 5 minutes). New pods are found within seconds. See How a cluster works.
  • More metrics — New /metrics series for delivered messages, CPU, auth failures, ACL denials, rate limits, connector drops, and errors. See Metrics.
  • Fleet health reporting — An enrolled broker reports CPU, memory, clients, traffic, refusals, drops, and scrubbed error signatures to the Coreflux Portal. It never sends topics, payloads, hostnames, or IPs. Turn it off in the portal, or with COREFLUX_FLEET_METRICS=off or DO_NOT_TRACK=1. See Fleet performance metrics.

Bug fixes

Industrial connectors
  • Connection status tells the truth — Modbus, S7, OPC UA, EtherNet/IP, ADS, Allen-Bradley, FINS, and BACnet no longer wipe retained tag values on a disconnect or failed read, and a restarted connector polls again. A connector no longer shows Connected while its device is unreachable: after 3 failed read cycles it reports Reconnecting and rebuilds the connection. See Connection status.
  • No more hangs on silent devices — A PLC that accepts a connection but never answers no longer freezes S7 (READ_TIMEOUT now limits the connect) or EtherNet/IP (READ_WRITE_TIMEOUT now bounds every exchange). Action: raise READ_WRITE_TIMEOUT for slow EtherNet/IP devices.
  • Modbus TCP — Each connection runs one request at a time, so tags no longer go BAD with “Response was not of expected transaction ID”. See Modbus TCP Client.
  • FINS — A slow reply no longer shifts later reads onto the previous command’s value, and a lost PLC goes to Reconnecting after 2 unanswered commands. Replies must now match the request and come from the addressed node. Action: gateways that swap client and server nodes now time out; check LOCAL_NODE / REMOTE_NODE. See FINS.
  • Allen-Bradley — A slow but healthy PLC no longer reconnects every cycle, and a timed-out write publishes "outcome": "unknown". See Write results.
  • ADS — TIMEOUT now applies to every request (it was ignored and fixed at 5 s), and an unreachable PLC makes the connector reconnect. See ADS.
  • OPC UA — A read or write that races a reconnect marks the tags BAD and backs off instead of counting as success, and sessions no longer leak.
  • BACnet — Integer writes of any size send the right value (out-of-range 64-bit values fail instead of being cut off), and reads queued on a dropped connection no longer break the new one.
  • Tag values — Negative OFFSET, MIN_VALUE, and MAX_VALUE now parse. See Common TAG parameters.
Other connectors
  • Kafka — A "in" event commits its offset only after the message is published, so a crash no longer drops records. WITH EVERY on a Kafka event is now rejected when you add the connector. Action: publish on a schedule with ON EVERY in a LoT action. See Kafka Connector.
  • Kafka and gRPC start — A connector that fails to start is retried in the background (2 to 60 seconds) until it starts or you remove it.
  • Ollama — A TYPE LLM connector with PROVIDER ollama takes CONTEXT_WINDOW (a fixed num_ctx, sized per call and capped at the model’s maximum), MAX_CONTEXT_WINDOW (default 32768, minimum 16384), FIRST_OUTPUT_TIMEOUT (default 120 s), and IDLE_TIMEOUT (default 60 s). Agent tasks fail with a clear error (llm_timeout, llm_unreachable, model_not_found, context_overflow) instead of hanging. See Ollama context and timeouts.
  • Email and CrateDB — Email ADD EVENT blocks now send and publish their status. CrateDB ADD EVENT blocks run, STORE IN writes rows, and the connector reconnects after a CrateDB restart.
  • REST API — A reply published right away on REPLY_TOPIC reaches the HTTP client instead of a 504, and concurrent requests no longer cancel each other. A value in ENDPOINT can no longer send the request and its credentials to another host; the broker refuses it and publishes RequestRejected. See Placeholder Support.
  • MQTT bridge — A bridge without CLIENT_ID forwards inbound messages and no longer clashes with other bridges, and a removed bridge stops forwarding at once.
  • Sparkplug B — The Primary Host tracks seq per edge node and no longer floods Rebirth requests, and DATA metrics without a datatype decode using the birth certificate.
  • TRIGGER on LLM, AGENT, and MCP — MCP calls the named tool, and LLM and AGENT results go to the mapping’s DESTINATION_TOPIC or the default response topic instead of being discarded.
LoT and MQTT
  • GET MODEL — SET … WITH GET MODEL no longer fails on the action’s first run, PUBLISH TOPIC … WITH GET MODEL parses, and WHERE conditions joined with AND accept any mix of text and numbers. See GET MODEL.
  • STORE IN … WHEN — Conditional model storage works instead of failing on first evaluation, and an unknown field is rejected at deploy. See Store data with models.
  • MATCHES REGEX — Patterns with \d, \w, \s, or \. work as written. See MATCHES REGEX.
  • TRIGGER statements — The line after a TRIGGER is no longer dropped. Examples now use TRIGGER "<connector>" TO <data> FOR "<event>"; code copied from the old order (WITH "<event>" FOR <data>) still deploys but swaps the data and the event. See TRIGGER Statement.
  • MQTT 5 denials — A denied publish now gets 0x87 Not authorized and a rate-limited one 0x97 Quota exceeded, instead of Success. See What a denied client sees.
  • Callable actions from panels — Object, array, and null arguments no longer cause a compile error; objects and arrays arrive as JSON text.
  • Protobuf float and nested GET PROTO — ADD FLOAT (alias ADD SINGLE) decodes proto float, and dotted GET PROTO paths read nested messages. A field with the wrong type is skipped instead of stopping the whole message. See Protobuf Models.
Panels, projects, and platform
  • Panels — Boolean CSS bindings (BIND CSS … AS BOOLEAN) convert correctly in the HUB. SVG markup from SET INLINE and data: sources is rebuilt from an allow-list so scripts, event handlers, and external links can’t run in viewers’ browsers; what was removed is listed as a deploy warning.
  • Projects — A live project’s history records only the edited cell, not the whole notebook. After a restart, the broker also loads connectors added outside the project and the connectors of Things, and publishes Thing status from boot. See LoT THING.
  • Metrics — Published-message and byte counters no longer reset at UTC midnight, so rate() works across it. coreflux_messages_published_total now counts client publishes; deliveries moved to coreflux_messages_delivered_total.
  • Linux packages — APT and DNF units run the broker as the user coreflux with CAP_NET_BIND_SERVICE, so they can bind ports below 1024. See Ports below 1024.
Configuration
  • Partial config is merged — A partial JSON object published to $SYS/Coreflux/Config/New is merged into the live configuration. Fields you omit, including bind addresses, stay as they are. See Applying Configuration.
August 2026
Breaking Changes in this release:HUB is not in the broker image — coreflux/coreflux-mqtt-broker is broker-only. The HUB is coreflux/coreflux-hub, always in its own container.HUB URL is http://localhost:3000 — broker ports 8080 (HTTP) and 8443 (HTTPS) are no longer HUB endpoints. Bookmarks and reverse proxies that pointed at those ports will not reach the HUB.Action: use Docker Compose (the default full profile starts broker + HUB on one network) or run the HUB image beside the broker. Open http://localhost:3000. When both services share the Compose network, click New Connection and set Host to broker (Protocol mqtt://, Port 1883, or Protocol ws://, Port 5000, Path mqtt) — not localhost. See Installation and Updating Your Coreflux.

2.14.3 - Default rules and Visu panel publishing

Bug fixes

  • Default rules load with an active project; Visu panels can be published — When a project is already active at startup or after -loadProject, the broker’s seeded permission rules now apply correctly so internal clients retain $SYS access and panels publish to $Visu/... topics again after project activation.

2.14.2 - Sparkplug B connector, MQTT & LoT performance improvements

Sparkplug B Support, MQTT client lifecycle action triggers, better OT master/client visibility in broker logs, a banded Rules precedence model, project lifecycle improvements, and faster publish, LoT, and connector dispatch.

Improvements

  • Rules priorities are now banded — The rule priority number line is split into bands: 0–99 is reserved for the broker’s immutable system rules, 100–999 999 is your band, and the permissive catch-alls AllowPublishTopic / AllowSubscribeTopic now sit at 1 000 000. Only the strongest matching band decides an operation, where a DENY beats an ALLOW (deny-wins) and nothing matching means denied (default-deny). Moving the catch-alls to the weakest band fixes a topic-visibility bypass: they previously shipped tied with everything else, so a specific access rule could not reliably override the allow-all fallback — which left Visu panel view topics effectively public. -addRule now rejects priorities outside 100–1 000 000. Action: custom rules written in the old 1–99 range are clamped to 100 on load and logged individually. Clamping keeps them in force, but several rules can land on 100 together, where ties resolve deny-wins — re-space them across the user band, putting the more specific rule at the lower number. See RBAC with LoT Rules.
  • AllowConnect seed and FOR Connect rules — Fresh brokers now ship a third permissive catch-all, AllowConnect, at priority 1 000 000 (the same weakest band as AllowPublishTopic / AllowSubscribeTopic). Write FOR Connect rules in the user band to decide who may connect after authentication; they outrank the seed. Brokers with no Connect rule at all still leave CONNECT ungated. -restoreRules puts all three seeds back to their shipped ALLOW definitions. See RBAC and -restoreRules.
  • Project manifests, entity ownership, and ad-hoc entities — Each stored project publishes a retained content manifest on $SYS/Coreflux/Projects/{name}/manifest (SHA-256 of exact file bytes, plus entities declared in .lotnb cells). -projectManifest returns the same JSON on demand. Running entities are attributed on $SYS/Coreflux/Entities/ownership and in the -listEntities / -loadProject origin field. Loading or unloading a project no longer deletes ad-hoc entities added with -addAction and similar commands while no project was active. Action: if you relied on Activate to wipe the whole runtime, remove those entities explicitly before loading a project. See Project Commands and Project Topics.
  • Loaded projects stay active after a restart — After -loadProject (or --project), the last loaded project is remembered and re-activated on the next start unless you pass --project. -unloadProject returns to standalone mode on the next restart. See Startup Options.
  • ON START runs on deploy; action publishes are no longer blocked by user ACL — Deploying an ON START action on a live broker executes the body immediately (cold start still runs once after the MQTT broker is ready). Action PUBLISH / KEEP still put messages on MQTT for any subscriber; they are no longer denied by user publish rules, so bootstrap topics from actions are not silently dropped. Clients still need subscribe permission to receive those messages. See Initialization Triggers.
  • OT string sizing — LENGTH is the preferred keyword — Across OT connectors that support configurable string sizing, WITH LENGTH is now the documented primary keyword; STRING_SIZE remains accepted as a parser alias. See the shared String sizing by Connector reference on the industrial connectors overview.
  • Modbus Server STRING defaults and cap — Unsized STRING tags no longer reserve a single register (which silently truncated barcodes and caused Illegal Data Address on FC16 writes). The server now defaults to 40 bytes (20 registers) and warns when size is omitted. Connector validation rejects LENGTH values above 246 bytes (123 registers), the FC16 write cap. See the Modbus TCP Server Connector guide.
  • Modbus Server and OPC UA Server activity logging — Modbus Server connectors log accepted and rejected master writes (plus rejected reads), with bank-aware function-code labels and LENGTH guidance when an undeclared holding-register range is the cause; connection open/close counts are logged from the existing watchdog (the master’s source IP is not available). OPC UA Server connectors log client session create/close events and accepted external writes on tags and STRUCT fields.
  • MQTT client lifecycle action triggers — New ON CONNECT DO, ON DISCONNECT DO, and ON SUBSCRIBE ["pattern"] DO triggers run LoT automation when clients connect, disconnect, or subscribe. Action bodies expose session context via CLIENTID, USER, ENDPOINT, CLEANSESSION, DISCONNECTREASON, SUBSCRIBETOPIC, and SUBSCRIBEQOS. The broker only evaluates lifecycle hooks when at least one action defines them. See Action Triggers.
  • Improved command response handling — Broker command responses are now consistently structured as JSON. Each command may include a requestId field, allowing you to easily correlate requests and responses.
  • Sparkplug B connectors (beta) — Decode Sparkplug B protobuf into readable JSON, publish Coreflux topics as an edge node, or run Coreflux as the Primary Host Application with namespace state, commands, and automatic rebirth requests. See the Sparkplug B Connector and Sparkplug Host Connector guides.

Performance

  • MQTT between clients — More messages complete per second, the slowest publishes finish sooner (about 10% lower p99 latency). Messages that update connector topics stay in the order they arrived.
  • LoT rules and actions — Permission checks, topic triggers, timers, and dashboard invokes no longer slow down as more distinct topics exist on the broker. LoT-heavy traffic that was about 10× slower at 30,000 topics — and about 70× slower at 100,000 — now stays as fast as it was on a nearly empty broker. USER HAS and USER IN GROUP checks stay fast as the user list grows.
  • Connector mappings — Adding mappings no longer makes every publish more expensive, including on topics that no mapping uses. Exact-topic mappings (the common case) keep up with tens of thousands of messages per second at sub-millisecond latency with no loss — the same flood previously took around 25 seconds and dropped some messages. Wildcard mappings (+ / #) now deliver fully as well. When a connector cannot keep up, memory stays bounded: the broker waits, then drops the newest arriving message rather than older ones already in flight. Set ADD ROUTE_CONFIG on a connector (OVERLOAD_POLICY, OVERLOAD_TIMEOUT, OVERLOAD_CAPACITY) when that connector needs a different wait-or-drop contract. See Store and Forward Configuration.

Bug fixes

  • Rules with IF and no ELSE now compile — IF USER IS "dashboard" THEN DENY (no ELSE) previously failed compilation on first evaluation and was treated as a deny for every matching publish or subscribe. The missing branch is now the opposite of the THEN decision. See Rules Syntax.
  • Python scripts no longer lose their code on restart — Scripts that contained blank lines were truncated down to the # Script Name: header after a reboot, so CALL PYTHON failed even though the script still appeared in listings. Complete scripts now persist across restarts. See Python Integration.
  • Built-in rules survive project add/load/unload — Adding or switching a project no longer wipes the broker’s default permission rules, so internal clients keep $SYS access. See RBAC.
July 2026

2.2.0 - Kafka, OPC UA Server & Modbus Server routes

  • Kafka route — Connect Coreflux directly to Kafka as a producer or consumer, with support for security protocols and configurable batching and compression. See the Kafka Route guide.
  • OPC UA Server route — Expose Coreflux data to OPC UA clients with a secure-by-default setup, including support for array and struct nodes. See the OPC UA Server Route guide.
  • Modbus Server route — Serve Modbus data over TCP, with experimental support for Serial (RTU) connections. See the Modbus TCP Server Route guide.
  • OT route persistence — Server routes (OPC UA Server, Modbus Server) persist their state and recover automatically after a restart, so data isn’t lost on reconnect. See OPC UA Server persistence and Modbus Server persistence.
  • OPC UA client certificate authentication — Authenticate OPC UA client connections using PKI certificates for more secure deployments.
  • Modbus one-based addressing — Set WITH ONE_BASED_ADDRESSES true on Modbus client and server routes so tag addresses match device manuals that label registers starting at 1. See Modbus addressing (client) and Address notation (server).
  • Publish payload as bytes — Forward or retain binary MQTT payloads bit-for-bit with PAYLOAD AS BYTES on PUBLISH TOPIC and KEEP TOPIC. See ACTION Operations.
  • EtherNet/IP route — Joined attribute reads (ENABLE_JOIN_ATTRIBUTE), bit extraction (BIT_ADDRESS), ARRAY/STRUCT decoding from assembly buffers, bidirectional WRITABLE tags, and legacy Hub Asset field mapping for migrations. See the EtherNet/IP Route guide.
  • Allen-Bradley route — Symbolic tag-name access (Program:MainProgram.Tag format), AB/ALLENBRADLEY route aliases, PATH vs SLOT routing, family-specific STRING/TIME encoding, and cross-link to EtherNet/IP for explicit CIP paths. See the Allen-Bradley Route guide.
  • Bug fixes — Fixed BACnet alarm retention, EtherNet/IP connection parameters and legacy-style compatibility, a Modbus TCP word-order issue, an OPC UA client connection issue, and a licensing load-order.
June 2026

2.1.0 - BACnet route (building automation) and Protobuf models

  • BACnet route — Connect Coreflux to building automation systems (HVAC, lighting, metering) and bridge them to MQTT
    • Read live values and write setpoints to BACnet controllers
    • Get instant updates on change, without constant polling
    • Receive alarms and event notifications directly in MQTT
See the BACnet Route guide to get started.
  • Protobuf LoT models (beta) — Decode and encode binary protobuf on MQTT from LoT: WITH FORMAT PROTOBUF (or BOTH), PROTO_TAG to match vendor .proto field numbers, ADD MODEL for nested messages on publish, GET PROTO / GET PROTOBUF to read top-level fields, and PUBLISH MODEL to emit real protobuf bytes (not JSON-in-bytes). WITH FORMAT BOTH keeps JSON on the main topic and binary on a /protobuf sidecar topic.
See Protobuf Models for more details.
April–June 2026

2.0.3 - OT tags & route stability

  • OT tag JSON publish — Message payload now includes the unit field
  • Modbus and EthernetIP routes — Stability improvements

2.0.2 - ON CHANGE trigger and bug fixes

  • ON CHANGE trigger for LoT actions — Run actions only when the message payload on a topic is different from the last message on that same topic. Use it for high-frequency telemetry, historians, and forwarding when you do not need to process duplicate values; ON TOPIC still runs on every matching publish.
  • Bug fixes — Stability and correctness improvements across the broker, LoT, and HUB

2.0.0 - AI Agent route in the broker

  • AI Agent route — Create custom agents usable within LoT for AI-driven steps and logic
  • Cloud and local LLMs — Support for both on AI features
March 2026

1.10.0 - Protobuf & REST API route

Support for environment variables and secrets on LoT
  • Protobuf support
  • REST API route with OAuth and JWT support
  • Default project on boot — Load a default project to a Coreflux broker when the broker starts
Last modified on October 25, 2026