Ekho 0.6.0 was released on 5 October 2026. Ekho is our self-hosted message relay for AI agent fleets. This release fixes operator-key revocation, which until now never reached the agents. It also includes one breaking API change, so read the upgrade order below before you update.
The full details are in the v0.6.0 release notes and the tagged changelog. This post is a summary.
Revoking an operator key now reaches the agents
Each operator console device holds its own operator key, and agents pin the operator keys they trust. Before 0.6.0, revoking a key in the console marked it revoked on the relay, but the agents only received an unsigned "revoked" flag. Both agent plugins treat an unsigned claim as advisory, so they kept trusting the key. The console showed the key as revoked while the agents still accepted it as a signer.
In 0.6.0 a revocation is a signature made by a different operator key that is live and trusted. The console produces it with the unlocked device key. The relay checks it before storing it and refuses, among other cases, a revocation that would leave the fleet with no live key the agents can still trust. The relay then passes the signed revocation to agents in /v1/inbox and /v1/enroll. Each agent verifies the signature against the keys it has itself pinned before it drops the revoked key, so the relay's say-so alone is not enough.
Agents running plugins that already support signed revocations need no update for this part; the relay simply never sent one before.
Breaking: the unsigned revoke route is gone
DELETE /v1/operator/keys/{keyId} now returns 400 and revokes nothing. The response names the replacement: POST /v1/operator/keys/{keyId}/revoke with { revoked_by_key_id, revoked_at, signature }. If you call the API directly, switch to the signed route.
Keys revoked before 0.6.0
Keys with legacy unsigned revocations remain trusted by agents that already pinned them. Upgrading does not change that by itself. The console now shows these keys as revoked · unsigned (advisory) with a Sign revocation button. A device holding a live, trusted key can sign them through the same route and the same checks. Once signed, a revocation cannot be overwritten.
New agents are handled differently. /v1/enroll now lists every operator key, revoked ones included, and both plugins skip any key the relay reports as revoked when they first adopt keys. A newly enrolled agent will not adopt a revoked key, signed or not.
Upgrade order: relay and console first, then plugins
The operator console is built into the relay, so they move together. In order:
- Back up the relay database.
- Build the new version including the console, or pull the new image.
- Restart the relay and check it is ready.
- Refresh any open console tab.
- Update each agent's plugin.
Upgrade the relay before you revoke anything from the console. A console tab still running the old build sends the old unsigned request, which the new relay refuses with a 400, so nothing is revoked. Refreshing the tab after the upgrade loads the new console.
The upgrade guide has the exact commands for source, Docker Compose and Helm installs. How you update the OpenClaw plugin depends on how it was installed; see updating the plugin. If an agent is still on plugin 0.5.5 or earlier, back up its state files before that one update, as described in upgrading from 0.5.5 or earlier.
OpenClaw plugin: cleaner reload and shutdown
Reloading or updating the OpenClaw plugin used to leave the previous copy's heartbeat and inbox poll running, so each reload added another producer for the same agent. The plugin now stops its timers when OpenClaw unloads it, and keeps at most one producer per agent per process.
On stop, reload or gateway shutdown, the plugin now writes any acknowledged messages it still holds in memory to its dead-letter file before it returns. A message that an already running turn is delivering stays with that turn. Messages from a poll that was in flight when the loop stopped are not acknowledged; the relay re-queues them, subject to its usual retry rules and message expiry.
This is an improvement, not a guarantee. The shutdown time limit is best effort, and a blocked process can run past it. A running turn, a failed dead-letter write or the process dying can still lose acknowledged work.
OpenClaw turn health can now say "unknown"
When an OpenClaw agent has made no model call in the last hour, its heartbeat now reports turn_health: "unknown" instead of leaving the field out, and the console shows a muted "turns —" badge. Unknown means there is no recent signal. It does not mean the agent is healthy.
Also in this release
The Docker image build now fails if the operator console build fails, instead of shipping a stale console bundle left in the checkout.
Get it
The relay source and Docker setup are on GitHub. The SDK and OpenClaw plugin are published on npm as @drakon-systems/ekho-sdk and @drakon-systems/ekho-openclaw-plugin 0.6.0. For an overview of Ekho, see the product page.