Skip to main content
Omega is a single Rust binary (omega-agent) plus a small stable supervisor (omega-launcher). What a given binary can do is decided entirely at build time by the Cargo features you enable. This page explains that feature system, how to compose a build (“SKU”) for a device class, and the full feature reference.

Build from source

The release binary lands at target/release/omega-agent. Build the supervisor the same way:
For the smallest shipped binary, enable stripping in Cargo.toml’s release profile — it removes ~20% on its own, more than any single feature. Feature selection is about what a binary can do and its dependency/attack surface; stripping and opt-level="z" are the levers for raw size.

The feature model

Every capability beyond the always-present core is a Cargo feature. The rule is simple and strict:
  • A feature that is not compiled in does not exist in that binary. If a device profile lists a module or capability whose feature is off, Omega refuses to start with an exact error — it never runs half-configured.
  • The build is the source of truth. The profile declares what should run; the binary must be able to honor it.
So building Omega for a device class means choosing exactly the features that class needs — no more (smaller binary, smaller attack surface) and no less (or the profile won’t validate).

Always compiled (the core)

These are not features — every build has them:

Opt-in features

Enable these explicitly for a device class that needs them:
Hardware-key backends are per-OS: build keystore-cng on Windows, keystore-secure-enclave on macOS, keystore-pkcs11 on Linux. Without a hardware backend compiled in, a device honestly reports a software key class and require_hardware cannot be satisfied.

Deprecated features

A set of modules ported from the previous (Go) generation of Omega remain buildable but off by default and are slated for removal. Do not build new work on them: app-reporting, device-control, file-watcher, heartbeat, http-server, ipc, metadata, network-stats, object-storage, registration, rpc, ssh, user-session, rtc (and rtc-jwt / rtc-streaming), robotics. Each is still available with --features <name> if a device genuinely needs it during migration.

Composing a SKU

A “SKU” is just a feature set. Start from --no-default-features and add exactly what the device class needs:
Since SQLite replication is core, it is present in every one of these — you never add it as a feature. The device’s profile must then list only modules and capabilities that this feature set provides. Keep the two in step by validating (below) as part of your build.

Validate a build against a profile

Before shipping, confirm the binary can honor the profile it will run:
It prints ✓ config valid on success, or one ERROR: line per problem — each naming the exact module or capability that the profile requires but the build does not provide. Wire this into CI so a SKU/profile mismatch fails the build rather than a device. There is also a standalone profile validator, omega-codegen, for checking a client profile in isolation:

What a feature pulls in

Most features gate only Omega’s own code (smaller binary, no new dependency). A few pull real dependencies — worth knowing for build size and toolchain: Everything else compiles from Omega’s own source with no exclusive third-party dependency. The one core piece with a native cost is sqlite-replication: it brings bundled SQLite (C) + zstd (C). Because it is always compiled, that cost is in every build — there is no SKU without it.

See also

  • Configure Omega — writing the profile the build must satisfy.
  • Connect — transports and the topic namespace.