Skip to content

Configuration

The MQTT Broker reads its settings from the host’s configuration file — slotd.conf on a hosted slot, stationd.conf on a station — when the extension is loaded at start-up. A key that is absent takes its default. A key whose value does not parse as its type also takes its default, and the host logs a warning naming it. A Boolean key is 1, true, yes or on, or 0, false, no or off, compared without regard to case — any other value, including a typo, is warned about and takes the default.

This page names the key behind each behaviour. What the behaviours are — how a device authenticates, which topics it may touch, what happens as it crosses a limit — is in the Overview.


The broker listens on a Unix socket when one is named, and on TCP otherwise. mqttbroker.listenSocket takes precedence: when it is set to a non-empty path the TCP keys are not consulted at all.

KeyTypeDefaultEffect
mqttbroker.listenSocketString""Unix-socket path to listen on. Empty means listen on TCP instead.
mqttbroker.listenHostString0.0.0.0TCP bind address. Consulted only when listenSocket is empty.
mqttbroker.listenPortInteger1883TCP bind port. Consulted only when listenSocket is empty.

Each cap limits how many nodes of one operation a single Task may contain. A negative value means unlimited. The cap travels to the editor in the operation’s schema, so the editor refuses to add the node that would exceed it.

KeyTypeDefaultDocumented on
mqttbroker.maxTriggerPerTaskInteger-1MQTT Trigger
mqttbroker.maxActionPerTaskInteger-1MQTT Action

What the broker advertises and accepts. These are the settings behind Broker constraints.

KeyTypeDefaultEffect
mqttbroker.maxQosInteger2Highest QoS level the broker grants. A subscription or publish above it is downgraded to this level.
mqttbroker.retainAvailableBooleantrueWhen false, the broker accepts the retain flag but stores nothing; subscribers receive live messages only.
mqttbroker.willsAvailableBooleantrueWhen false, the broker refuses a CONNECT that carries a will message.
mqttbroker.requireSlotPrefixBooleanfalseWhen true, every topic must begin with <slot>/. This is a namespace convention: isolation between slots does not depend on it.

The settings behind Per-device limits and the lifecycle of a misbehaving device.

KeyTypeDefaultEffect
mqttbroker.maxDevicesInteger-1How many devices may be registered. Negative means unlimited. A registration beyond the cap is refused.
mqttbroker.publishLimitInteger0PUBLISH packets one device may send within a wall-clock minute. 0 disables the limit.
mqttbroker.connectLimitInteger0CONNECT attempts one device may make within a wall-clock minute, successful or not. 0 disables the limit.
mqttbroker.breachedLimitInteger0How many breached minutes within a rolling hour disable the device and force-disconnect it. 0 means a breach never escalates to a block.

A breached minute counts once, however many packets exceed the limit inside it: the first excess emits a throttle event, the rest are denied quietly. That is why breachedLimit counts minutes rather than packets — it measures how long a device has been misbehaving, not how hard.


Bounds applied before a connection is trusted, so an unauthenticated peer cannot hold resources or burn CPU.

KeyTypeDefaultEffect
mqttbroker.halfOpenDeadlineMsInteger10000A connection that has not produced a CONNECT verdict within this many milliseconds is closed.
mqttbroker.halfOpenMaxBytesInteger2048A connection that buffers this many bytes before a CONNECT verdict is closed.
mqttbroker.preVerifyConnectLimitInteger0CONNECT attempts accepted per source IP per minute, counted before the credential check. 0 disables it.
mqttbroker.maxPendingVerifiesInteger64How many CONNECTs may be waiting on the password verifier at once. One past this is answered Server unavailable (v5 0x89, v3.1.1 0x03) immediately and closed, with nothing checked: a queue deeper than a client’s patience yields only timeouts and the retries that deepen it. 0 removes the bound.
mqttbroker.secretHashOpsLimitInteger3argon2 operations for hashing a secret the box generates (see Credentials).
mqttbroker.secretHashMemLimitInteger8192argon2 memory, in bytes, for the same.

preVerifyConnectLimit is keyed on the source IP rather than the client id, because the client id is chosen by whoever is connecting: a flood that varies its client id would otherwise get a fresh budget each time.

A verify for a connection that closes while queued is dropped before it costs anything, so a client that gives up does not keep occupying the verifier after it has gone. The two limits together decide what a reconnect storm — every device of a box returning at once after a restart — costs: a generated secret verifies in about a millisecond, and maxPendingVerifies is how long a device is made to wait before it is told to come back later instead. A device provisioned with a certificate never enters this queue: its proof is the TLS handshake at the edge, and the broker admits it with one comparison.


KeyTypeDefaultEffect
mqttbroker.maxPacketSizeInteger262144Largest MQTT packet accepted, in bytes, including headers and properties. A packet whose declared size exceeds it is rejected without being buffered.
mqttbroker.maxQueuedBytesInteger1048576Most a connection may hold in outbound bytes its peer has not yet read. A device that stops reading is closed once its queue reaches this; a device reading at its own pace never does. 0 removes the bound.
mqttbroker.maxInflightInteger64Per-connection outbound QoS 1/2 window, and the inbound QoS 2 receive window.
mqttbroker.qosRetransmitMsInteger3000How long to wait for an acknowledgement before redelivering a QoS 1/2 message, in milliseconds.
mqttbroker.qosMaxRetriesInteger5How many unacknowledged retransmits are attempted before the connection is closed.
mqttbroker.retainedMaxEntriesInteger1024Retained messages stored per slot. The oldest is evicted when the store is full.
mqttbroker.maxSubscriptionsPerClientInteger0Distinct active topic filters one client may hold. 0 means unlimited.
mqttbroker.maxClientsPerRunnerInteger0Concurrently established or in-progress clients one runner may hold. 0 means unlimited.

KeyTypeDefaultEffect
mqttbroker.statsPeriodMsInteger60000How often each runner reports what its broker carried, in milliseconds. 0 stops the reports.

Shaping is per slot, with a two-rate token bucket: a floor bucket that refills at a guaranteed rate, and a ceiling bucket that bounds the absolute draw. A slot over its floor borrows from a per-runner surplus pool, up to its ceiling. A slot over budget has its reads paused until the debt is repaid.

All rates are bytes per second and all burst capacities are bytes.

KeyTypeDefaultEffect
mqttbroker.bwEnabledInteger0Non-zero enables shaping.
mqttbroker.bwPubRateInteger0Guaranteed floor rate per slot. A slot with a floor of 0 is never over budget — shaping is off for it.
mqttbroker.bwPubCeilInteger0Maximum sustained rate per slot. Must be at least bwPubRate.
mqttbroker.bwBurstInteger0Floor bucket capacity — the guaranteed burst.
mqttbroker.bwCeilBurstInteger0Ceiling bucket capacity — the largest borrowed burst. Must be at least bwBurst.
mqttbroker.bwPoolRateInteger0Refill rate of the per-runner surplus pool.
mqttbroker.bwPoolBurstInteger0Capacity of the per-runner surplus pool.
mqttbroker.bwTickMsInteger25How often paused slots are refilled and reconsidered, in milliseconds.

The numbers a hosted slot actually runs with are set per plan. This page gives the defaults the extension applies when a key is absent; the values in force for your plan are listed in the Acceptable Use Policy.