Signed release manifests
An artifact proves which bytes were published. A signed release manifest records who authorized those bytes for a product and the safety rules that belong to the release.
The meshanics.release.v1 payload binds the tenant, product, release identity,
components, TUF targets, compatibility profiles, activation order, health policy,
rollout constraints, approval references, recovery behavior and related
attestation digests. The payload is wrapped in a DSSE envelope and signed with an
Ed25519 key controlled by your release process.
Publish a release
- Create an Ed25519 signing key outside Meshanics. Keep the private key in your CI secret store, HSM or offline release process.
- Add the public key under Signed releases - Trusted authorizer keys.
- Select the target device group in Signed releases - Authorized targets.
Copy its SHA-256 value into
rollout.target_policy_digest. This binds the authorization to that exact static membership snapshot. - Create the release JSON and sign it locally with
meshanics-release sign. - Submit the DSSE envelope and its expected product ID in the control panel or
POST /api/v1/releases.
The service verifies the signature, registered key state, tenant, product, validity window and required safety fields. It then stages and publishes the exact envelope as an immutable TUF target. A conflicting product/version cannot replace an existing release.
To start work, select the same group and choose Roll out beside the published release. The service re-verifies the authorizer, envelope digests, current group snapshot, artifact record, device compatibility, health probe, rollout waves and recovery policy. A changed group produces a different target-policy digest and is refused.
Verify outside Meshanics
Download the exact envelope from the release row and run:
meshanics-release verify \
-envelope release.dsse.json \
-key release-authorizer.pub \
-tenant YOUR_TENANT_UUID \
-product YOUR_PRODUCT_ID
The verifier checks canonical payload bytes, DSSE signature, expected tenant and product, authorizer key, and current validity period. It prints both the signed payload digest and the complete envelope digest.
Device verification
Signed-release assignments carry a TUF target and pinned envelope/payload digests alongside legacy advisory fields. A configured Linux agent downloads the release through TUF, verifies it against locally pinned customer authorizer keys, checks its tenant, product, profile, validity and offline-age limits, then rejects any conflict in the artifact or health fields. It persists the verified desired state before applying the artifact.
Provision all four settings together:
| Environment | Purpose |
|---|---|
MESHANICS_RELEASE_TENANT | Tenant UUID the device accepts |
MESHANICS_RELEASE_PRODUCT | Product ID physically assigned to the device |
MESHANICS_RELEASE_PROFILE | Compatibility profile, for example linux-arm64 |
MESHANICS_RELEASE_TRUST_DIR | Directory containing customer Ed25519 public key PEM files |
The directory is a local trust anchor. The control plane does not silently add or replace keys after enrollment. A release pointer fails closed when these settings are absent. Legacy rollouts without a release pointer continue during migration and remain distinguishable from signed-release work.
For a multi-component Linux release, use recovery.on_failure: rollback and
recovery.rollback_boundary: release. Supported transaction members are
containers, models, placed configurations and systemd service binaries. Signed
maintenance windows, minimum-agent constraints, Compose, operating-system and
package-manager members are refused until those adapters can enforce the same
recovery contract.
An os-bundle uses a separate standalone release boundary. It must be the only
component in the signed release and must name a .raucb artifact with media type
application/vnd.rauc.bundle. The device verifies TUF and the customer release
authorization before RAUC independently verifies the bundle signature and
compatible string. See Linux A/B system updates.
Multi-component release transactions
The rollout service resolves every signed component before it exposes any work
to a device. Each deployment receives a unique transaction ID, so two rollouts
of the same release cannot be mixed. Assignment metadata carries the complete
member count and the exact group and position from activation.ordered_groups.
On the device, the agent:
- verifies the same signed release for every member;
- waits for the complete member set;
- downloads and stages every descriptor and payload before activation;
- activates and checks one signed order group at a time;
- restores every attempted member in reverse order if activation or health fails; and
- keeps a local crash journal so an interrupted activation is rolled back conservatively before retry.
The control panel shows the transaction as running, committed, rolled back or
failed. Download result returns deterministic per-device result manifests
that reference every member by rollout ID, artifact ID, digest and ordered
position. The API endpoints are GET /api/v1/release-transactions,
GET /api/v1/release-transactions/{id} and
GET /api/v1/release-transactions/{id}/result.
Device-signed receipts
For a customer-authorized single-component release, the agent writes a terminal
meshanics.release-receipt.v1 object before reporting it. The receipt binds the
release and rollout, device identity, candidate, previous and resulting digests,
activation outcome, health verdict and timestamp. It is signed with the
device's existing ECDSA P-256 identity key and uploaded over the same mTLS
connection. A failed upload is retried from the locally persisted exact bytes.
A multi-component deployment writes one receipt for the transaction. Its
ordered members array records each component's rollout, candidate, previous
and resulting digest and terminal verdict. The service validates the complete
set against the transaction before accepting the receipt. This avoids treating
several independent signatures as proof of one atomic release outcome.
For an OS result, the signed receipt also binds the RAUC compatible string, bundle version, inspected manifest hash, previous and installed slots, observed boot slot, bootloader primary, mark operation and final lifecycle phase. The control panel shows this boot evidence beside the downloadable exact receipt.
The service verifies that the embedded certificate is the certificate on the
mTLS connection, checks every field against the signed rollout, and appends the
receipt without an update or delete path. The control panel labels this
software-key. Legacy rollout status remains device-reported; it is never
upgraded merely because it used authenticated transport. A hardware-backed label
requires an appraised TPM, TEE or secure-element provider and is not inferred from
the software-held device key.
Download one exact envelope from Signed releases - Signed release receipts,
or use /api/v1/release-receipts/export for a tar batch with an index. Verify an
envelope independently with the tenant device CA:
meshanics-release verify-receipt \
-envelope DEVICE.receipt.json \
-ca tenant-device-ca.pem \
-tenant YOUR_TENANT_UUID \
-device DEVICE_NAME