- MQTT Broker
- HUB
- VS Code Extension
August–October 2026
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--dryRunto validate first), and manage them with-removeThingand-listThings, or the MCP toolsadd_thing,list_things, andremove_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 LLMconnector for its provider, model, key, and price, and starts with no tools. It gets only whatADD TOOLgrants. Agents can ask each other for help withWITH AGENTS, and actions call them withCALL 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 LLMalso acceptsREASONING_EFFORT(nonetoextra_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_APItemplates for cloud, ERP, MES, messaging, and IIoT services, in technical preview. See REST API Apps.
MQTT and LoT
- Connectors naming —
DEFINE CONNECTORand the-addConnector,-removeConnector,-listConnectors,-removeAllConnectors, and-checkConnectorConnectioncommands are the new names.DEFINE ROUTEand the-…Route…commands keep working as aliases. - Turn things off without deleting them — Put
DISABLE trueunderDEFINEon an action, connector, or agent to keep it stored but not running. Switch it back on with-disableAction,-disableConnector,-disableAgentand the matching-enable…commands, or with MCP tools. See Disable and Enable. - Publish with retain and QoS —
PUBLISH TOPICacceptsRETAINandQOS0/QOS1/QOS2(default QoS 0).KEEP TOPICstill only stores a value forGET TOPIC. See ACTION Operations. - Shared subscriptions — Turn on
SharedSubscriptionsand$share/{group}/{filter}delivers each message to one member of the group. Off by default. See Shared subscriptions. - Predictable topic triggers —
ON TOPICactions, 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 TOPICorKEEP TOPICin one run is delivered, in the order written, with that line’s own retain, QoS, and keep settings. A laterGET TOPICin the same run reads the value just written. In a cluster, only the lastKEEPof each topic is replicated. See PUBLISH TOPIC. - Panel wait and markdown — A button accepts
SET AWAIT "Id, Id"andSET AWAIT_TIMEOUT(seconds, default 120). A text component acceptsSET 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/Licenseand, on the ops port,GET /license(port9100, keep it private). - Three ways to license — Activate online with
COREFLUX_ACTIVATION_CODEor-activateLicense CFLX-…(limits apply without a restart, the lease refreshes daily,-refreshLicenseforces 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-fingerprintvalue to Coreflux and install the hardware-bound license you get back. - Enroll in your organization —
-enroll et_…(or--enroll, orconfig/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/Licenseexplains 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
Mcpblock (port6278, bound to127.0.0.1, path/mcp). Manage tokens with-createMcpToken,-listMcpTokens, and-revokeMcpToken, or from the HUB MCP tab. In Docker or Kubernetes, bind to0.0.0.0, publish6278, and route/mcpbehind 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://skillsMCP 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/Summarycounts valid, expiring, expired, and unreadable certificates.CertificateExpiryThresholdDays(default 30) sets the warning window. See$SYS/Coreflux/Certificates/Summary. - Easier trust store —
ClientCertificateSourcePathloads.pem,.crt,.cer,.der, and unprotected.p12/.pfxfiles, skips anything inrevoked/, and refuses keys and CSRs (install a server key withreplaceServer).$SYS/Coreflux/ConfigshowsServerCertificatePasswordas********.
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 withCLUSTER_NODEinROUTE_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
/metricsseries 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=offorDO_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_TIMEOUTnow limits the connect) or EtherNet/IP (READ_WRITE_TIMEOUTnow bounds every exchange). Action: raiseREAD_WRITE_TIMEOUTfor 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 —
TIMEOUTnow 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, andMAX_VALUEnow parse. See Common TAG parameters.
- Kafka — A
"in"event commits its offset only after the message is published, so a crash no longer drops records.WITH EVERYon a Kafka event is now rejected when you add the connector. Action: publish on a schedule withON EVERYin 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 LLMconnector withPROVIDER ollamatakesCONTEXT_WINDOW(a fixednum_ctx, sized per call and capped at the model’s maximum),MAX_CONTEXT_WINDOW(default 32768, minimum 16384),FIRST_OUTPUT_TIMEOUT(default 120 s), andIDLE_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 EVENTblocks now send and publish their status. CrateDBADD EVENTblocks run,STORE INwrites rows, and the connector reconnects after a CrateDB restart. - REST API — A reply published right away on
REPLY_TOPICreaches the HTTP client instead of a 504, and concurrent requests no longer cancel each other. A value inENDPOINTcan no longer send the request and its credentials to another host; the broker refuses it and publishesRequestRejected. See Placeholder Support. - MQTT bridge — A bridge without
CLIENT_IDforwards inbound messages and no longer clashes with other bridges, and a removed bridge stops forwarding at once. - Sparkplug B — The Primary Host tracks
seqper edge node and no longer floods Rebirth requests, and DATA metrics without a datatype decode using the birth certificate. TRIGGERon LLM, AGENT, and MCP — MCP calls the named tool, and LLM and AGENT results go to the mapping’sDESTINATION_TOPICor the default response topic instead of being discarded.
GET MODEL—SET … WITH GET MODELno longer fails on the action’s first run,PUBLISH TOPIC … WITH GET MODELparses, andWHEREconditions joined withANDaccept 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.TRIGGERstatements — The line after aTRIGGERis no longer dropped. Examples now useTRIGGER "<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 authorizedand a rate-limited one0x97 Quota exceeded, instead of Success. See What a denied client sees. - Callable actions from panels — Object, array, and
nullarguments no longer cause a compile error; objects and arrays arrive as JSON text. - Protobuf
floatand nestedGET PROTO—ADD FLOAT(aliasADD SINGLE) decodes protofloat, and dottedGET PROTOpaths read nested messages. A field with the wrong type is skipped instead of stopping the whole message. See Protobuf Models.
- Panels — Boolean CSS bindings (
BIND CSS … AS BOOLEAN) convert correctly in the HUB. SVG markup fromSET INLINEanddata: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_totalnow counts client publishes; deliveries moved tocoreflux_messages_delivered_total. - Linux packages — APT and DNF units run the broker as the user
corefluxwithCAP_NET_BIND_SERVICE, so they can bind ports below 1024. See Ports below 1024.
- Partial config is merged — A partial JSON object published to
$SYS/Coreflux/Config/Newis merged into the live configuration. Fields you omit, including bind addresses, stay as they are. See Applying Configuration.
August 2026
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$SYSaccess 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–99is reserved for the broker’s immutable system rules,100–999 999is your band, and the permissive catch-allsAllowPublishTopic/AllowSubscribeTopicnow sit at1 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.-addRulenow rejects priorities outside100–1 000 000. Action: custom rules written in the old1–99range are clamped to100on load and logged individually. Clamping keeps them in force, but several rules can land on100together, 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. AllowConnectseed andFOR Connectrules — Fresh brokers now ship a third permissive catch-all,AllowConnect, at priority1 000 000(the same weakest band asAllowPublishTopic/AllowSubscribeTopic). WriteFOR Connectrules 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.-restoreRulesputs 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.lotnbcells).-projectManifestreturns the same JSON on demand. Running entities are attributed on$SYS/Coreflux/Entities/ownershipand in the-listEntities/-loadProjectoriginfield. Loading or unloading a project no longer deletes ad-hoc entities added with-addActionand 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.-unloadProjectreturns to standalone mode on the next restart. See Startup Options. ON STARTruns on deploy; action publishes are no longer blocked by user ACL — Deploying anON STARTaction on a live broker executes the body immediately (cold start still runs once after the MQTT broker is ready). ActionPUBLISH/KEEPstill 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 —
LENGTHis the preferred keyword — Across OT connectors that support configurable string sizing,WITH LENGTHis now the documented primary keyword;STRING_SIZEremains 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
STRINGtags 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 rejectsLENGTHvalues 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
LENGTHguidance 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, andON SUBSCRIBE ["pattern"] DOtriggers run LoT automation when clients connect, disconnect, or subscribe. Action bodies expose session context viaCLIENTID,USER,ENDPOINT,CLEANSESSION,DISCONNECTREASON,SUBSCRIBETOPIC, andSUBSCRIBEQOS. 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
requestIdfield, 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 HASandUSER IN GROUPchecks 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. SetADD ROUTE_CONFIGon 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
IFand noELSEnow compile —IF USER IS "dashboard" THEN DENY(noELSE) 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 theTHENdecision. 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, soCALL PYTHONfailed 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
$SYSaccess. 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 trueon 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 BYTESonPUBLISH TOPICandKEEP TOPIC. See ACTION Operations. - EtherNet/IP route — Joined attribute reads (
ENABLE_JOIN_ATTRIBUTE), bit extraction (BIT_ADDRESS), ARRAY/STRUCT decoding from assembly buffers, bidirectionalWRITABLEtags, and legacy Hub Asset field mapping for migrations. See the EtherNet/IP Route guide. - Allen-Bradley route — Symbolic tag-name access (
Program:MainProgram.Tagformat),AB/ALLENBRADLEYroute aliases,PATHvsSLOTrouting, 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
- Protobuf LoT models (beta) — Decode and encode binary protobuf on MQTT from LoT:
WITH FORMAT PROTOBUF(orBOTH),PROTO_TAGto match vendor.protofield numbers,ADD MODELfor nested messages on publish,GET PROTO/GET PROTOBUFto read top-level fields, andPUBLISH MODELto emit real protobuf bytes (not JSON-in-bytes).WITH FORMAT BOTHkeeps JSON on the main topic and binary on a/protobufsidecar topic.
April–June 2026
2.0.3 - OT tags & route stability
- OT tag JSON publish — Message payload now includes the
unitfield - Modbus and EthernetIP routes — Stability improvements
2.0.2 - ON CHANGE trigger and bug fixes
ON CHANGEtrigger 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 TOPICstill 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



