connection block that configures it, and the full topic namespace so you know exactly what a device publishes and subscribes.
Transports
The transport is chosen byconnection.transport:
For
transport: mqtt, the security of the link comes from the scheme of connection.server_url:
MQTT-over-QUIC is available when the binary is built with the
mqtt-quic feature. Without that feature the QUIC path is not compiled in, so a quic:// URL on a default build is rejected at startup rather than silently falling back.The connection block
The essentials — see Configure for the complete schema, every field, and its_env override.
cert_diris where identity lives, for the life of the device. Enrollment writesdevice.crt,device.key, andmetadata.jsonhere, and certificate renewal writes the renewed certificate here too. Keep it stable — it deliberately sits at the connection level, not insidejitr, so it outlives the enrollment block after that block is removed.keep_aliveis the tuning knob for how fast a device that went dark (power loss, black-holed network) is detected as gone. The broker tears the session down at ~1.5× this value with no traffic. Default30s→ ~45s detection. Lower it for faster detection at the cost of more keepalive chatter.- Any string field has an
_envtwin (server_url_env,device_id_env,root_topic_env, the TLS paths,mqtt.username_env/password_env). Set the_envfield to an environment-variable name and Omega reads the value at load time — the way to keep per-device identity and secrets out of a shared config.
The topic namespace
Every topic a module uses is built under a single root topic:- If
connection.root_topic(orroot_topic_env) is set, that is the root verbatim. - If it’s left empty, the root defaults to
omega/{device_id}.
device_id: press-42 and no explicit root, its OTA plan topic is omega/press-42/ota/control/plan.
Topic reference
Root below is{root} = connection.root_topic (default omega/{device_id}). sub = device subscribes (platform → device); pub = device publishes (device → platform).
OTA (core — always present)
Inventory — SBOM / HBOM / PBOM (core, hosted by OTA)
Omega reports digests routinely and sends the full BOM on request or on change, so a large payload only crosses the wire when something actually changed.
Node capabilities (core)
Service runtime (service-runtime feature — publishes under devices/)
Certificate management (core — platform-namespaced)
Certificate topics are not underroot_topic. They live in the platform’s $golain control tree, keyed by the device’s platform UUID:
{uuid} is the platform device UUID (taken from the certificate serial number). Renewal runs on a background timer — see Enrollment → Renewal.
Modules the profile does not list do not subscribe or publish anything. The table above is the complete set for the current module lineup; deprecated modules that some builds still carry use their own legacy topics and are out of scope here.
Online means fully subscribed
When Omega connects, it subscribes every control topic for every module inmodules.required and waits for the broker to acknowledge each one (SUBACK). A subscription the broker denies is fatal — Omega tears down rather than run in a state where the platform believes it can control the device but a topic silently isn’t wired up.
The guarantee this buys you: if a device shows online, every control topic it needs is subscribed and acknowledged. There is no half-controllable state. When a device won’t come up and the logs point at a denied subscription, it’s an ACL/permissions problem on the broker for that device’s topics — not something the device can paper over. See Operations for the exact failure surface (exit code, startup-error.log).
See also
- Configure Omega — the full
connectionschema and every field. - Enrollment (JITR) — getting the certificate this connection presents.
- Build Omega — which transports/features a binary carries.