Summary
When two OpenClaw gateways are running on the same host/network namespace, the Bonjour/mDNS advertiser can hit a name/hostname conflict and crash the gateway with an unhandled promise rejection from @homebridge/ciao.
This looks like a recoverable local-discovery conflict, but it currently takes down the whole gateway process.
Environment
- OpenClaw gateway service version:
2026.4.24
- Node:
22.22.2
- OS: Ubuntu 24.04 on Linux
6.17.0-1011-azure
- Runtime: systemd user service
- Setup: two OpenClaw gateways on the same host
- user gateway on
127.0.0.1:18789
- second gateway on
127.0.0.1:18790
What happened
The user gateway starts successfully and reports ready, but shortly after startup the Bonjour plugin detects that the service is stuck in probing or announcing, attempts to re-advertise, and then the gateway exits because a CIAO cancellation rejection is unhandled.
Example logs:
[gateway] ready (8 plugins: acpx, active-memory, bonjour, browser, device-pair, phone-control, talk-voice, telegram; 5.8s)
[plugins] bonjour: watchdog detected non-announced service; attempting re-advertise (gateway fqdn=Claude (OpenClaw)._openclaw-gw._tcp.local. host=openclaw.local. port=18789 state=probing)
[plugins] bonjour: restarting advertiser (service stuck in probing for 8990ms (gateway fqdn=Claude (OpenClaw) (2)._openclaw-gw._tcp.local. host=openclaw-(2).local. port=18789 state=probing))
[plugins] bonjour: advertised gateway fqdn=Claude (OpenClaw) (2)._openclaw-gw._tcp.local. host=openclaw-(2).local. port=18789 state=unannounced
[openclaw] Unhandled promise rejection: CIAO PROBING CANCELLED
systemd[834]: openclaw-gateway.service: Main process exited, code=exited, status=1/FAILURE
systemd[834]: openclaw-gateway.service: Failed with result 'exit-code'.
I also saw the same failure mode with:
[openclaw] Unhandled promise rejection: CIAO ANNOUNCEMENT CANCELLED
Expected behavior
Bonjour/mDNS announcement conflicts or CIAO cancellation errors should be handled locally by the Bonjour plugin. The gateway should keep running, possibly with local discovery disabled/degraded or with a logged warning.
Actual behavior
The gateway process exits with status 1 and systemd restarts it. This can lead to a restart loop.
Workaround
Disabling Bonjour for the affected gateway avoids the crash:
[Service]
Environment=OPENCLAW_DISABLE_BONJOUR=1
After applying that systemd drop-in and restarting, the gateway stayed active and /health returned:
{"ok":true,"status":"live"}
Notes
The duplicate-gateway setup is likely what triggers this, but the crash itself appears to be caused by an unhandled cancellation rejection from the Bonjour/CIAO path. Ideally this should not terminate the whole gateway.
Summary
When two OpenClaw gateways are running on the same host/network namespace, the Bonjour/mDNS advertiser can hit a name/hostname conflict and crash the gateway with an unhandled promise rejection from
@homebridge/ciao.This looks like a recoverable local-discovery conflict, but it currently takes down the whole gateway process.
Environment
2026.4.2422.22.26.17.0-1011-azure127.0.0.1:18789127.0.0.1:18790What happened
The user gateway starts successfully and reports ready, but shortly after startup the Bonjour plugin detects that the service is stuck in
probingorannouncing, attempts to re-advertise, and then the gateway exits because a CIAO cancellation rejection is unhandled.Example logs:
I also saw the same failure mode with:
Expected behavior
Bonjour/mDNS announcement conflicts or CIAO cancellation errors should be handled locally by the Bonjour plugin. The gateway should keep running, possibly with local discovery disabled/degraded or with a logged warning.
Actual behavior
The gateway process exits with status 1 and systemd restarts it. This can lead to a restart loop.
Workaround
Disabling Bonjour for the affected gateway avoids the crash:
After applying that systemd drop-in and restarting, the gateway stayed active and
/healthreturned:{"ok":true,"status":"live"}Notes
The duplicate-gateway setup is likely what triggers this, but the crash itself appears to be caused by an unhandled cancellation rejection from the Bonjour/CIAO path. Ideally this should not terminate the whole gateway.