Skip to main content
A node installs through the ordinary OTA place_file step. There is no separate node install path. The one node-specific addition is the Register in node registry flag, which tells Omega to introspect the placed library and add it to the device’s node catalog.

Before you upload

  • Verify the library on its target platform with omega-agent __node-introspect as described in Build a node. Registration runs the same check and refuses the same failures.
  • Give the file a plain name with no path, for example libhello_node.so. Ship one artifact per platform and architecture.
  • Keep one domain per node. Two nodes claiming the same domain replace each other in the registry.

Upload as a release artifact

In the Console open OTA → Releases, create a release, and add the library as an artifact with a version. The platform records the artifact’s SHA-256 and signs it with its role key. Omega verifies that signature against the trust-set on the device before the file is written, so an artifact that was tampered with in transit is never placed and never loaded. Releases and deployments are covered in OTA updates.

Add the place_file step

In the release’s plan, add a place_file step for the artifact and check Register in node registry. Set Node version to the version you want the registry to show. Leave Destination blank. The same plan as YAML:
A register_node step must not set dest_dir. A registered node has exactly one home, dll/{domain}/{file_name} under the Omega root, and the domain is only known after the device introspects the library. A step that sets both is rejected at plan validation with place_file_dest_dir_not_allowed_for_register_node.
So the hello node on a Linux device lands at /var/lib/omega/dll/hello/libhello_node.so.

What the device does

When the deployment reaches a device, Omega:
  1. Downloads the artifact and verifies its role-bound signature. An unsigned or tampered file is never written.
  2. Lands the file in a staging directory and runs the protected-path checks.
  3. Introspects it in an ephemeral child process: ABI version, domain, capabilities, health. On Windows it runs regsvr32 /s first and discovers the node’s CLSID itself.
  4. Moves the file to dll/{domain}/{file_name}.
  5. Writes the node to the local registry, unless health is unavailable, the ABI is unsupported, the domain is empty, or an op is named unregister.
  6. Publishes the full node catalog on node/report/registry.
Updating a node is the same step with a new artifact version. Omega re-introspects and replaces the registry row.

Confirm in the Console

Open OTA → Node Registry. The device row lists the domain, version, ABI, health, whether the node is enabled, and each op with a Run button. Click Run on greet. The result appears against the device with the node’s return code and message:
ping has a cadence, so it also appears in the schedule the device reports, and it runs every hour without anybody clicking. On the device itself:
prints the node’s current health as Omega sees it.

Disable or remove a node

Disable in the Node Registry keeps the file and the registration but makes every invoke return -102 until it is enabled again. Every node also has a synthesised unregister op that Omega implements on the node’s behalf. Running it drops the registry row, unregisters the COM class on Windows, and deletes the file. Your node never implements unregister and must not declare an op by that name.

Troubleshooting