docs/book/src/channels/nextcloud-talk.md
Nextcloud Talk integration via the Talk Bot webhook protocol. Self-hosted, federated, and E2E-capable: another sovereign-communication option alongside Matrix and Mattermost.
{{#peer-group nextcloud}}
POST /nextcloud-talk/<alias> on the gateway (bare /nextcloud-talk still works as a deprecated fallback)zeroclaw-bot){{#config-fields channels.nextcloud_talk}}
The channel is read from the default alias. Set it through any config surface:
{{#config-where channels nextcloud_talk}}
webhook_secret can also be supplied at runtime via the generic env override {{#env-var-name channels.nextcloud_talk.default.webhook_secret}}, useful for rotating it without editing the config.
zeroclaw daemon
Configure your Talk bot's webhook URL to point at the alias of the
[channels.nextcloud_talk.<alias>] instance that should receive it:
https://<your-public-url>/nextcloud-talk/<alias>
For example, [channels.nextcloud_talk.work] receives POST /nextcloud-talk/work.
This per-alias routing (#6312) lets you run several Talk bots side by side and
deliver each one's webhooks to the right instance.
The bare https://<your-public-url>/nextcloud-talk path still works but is
deprecated: it resolves to the lexicographically-first alias (deterministic
across restarts) and returns an X-Zeroclaw-Deprecation response header.
Single-instance deployments can keep using it unchanged. An unknown alias returns 404.
Local development? Configure [tunnel] in your config (ngrok, Cloudflare, or Tailscale) and the gateway exposes itself on startup: see Operations → Network deployment.
When webhook_secret is set, inbound requests must carry:
X-Nextcloud-Talk-Random headerX-Nextcloud-Talk-Signature headerZeroClaw verifies:
expected_sig = hex(hmac_sha256(secret, random + raw_request_body))
if X-Nextcloud-Talk-Signature != expected_sig:
return 401
Without a secret, no verification: don't expose this endpoint publicly in that mode.
actorType = "bots") are ignored: prevents feedback loopstoken in the webhook payloadexternal_peers = ["*"] in the peer group for first-time testing["alice", "bob"])404 Nextcloud Talk not configured: [channels.nextcloud_talk.default] section missing or enabled = false401 Invalid signature: secret mismatch, wrong random header, or body-signing bug. Check the raw body is being signed (not the parsed JSON)200: event was filtered. Check logs for "actorType = bots" or a sender not in the peer setNextcloud Talk does not support message edits via the Bot API, so streaming draft updates are disabled for this channel. Replies are sent on stream completion only.
proxy_url to override the global [proxy] setting for Nextcloud Talk only (http://, https://, socks5://, socks5h://)