OpenClaw on Nextcloud Talk
The webhook bot, the response feature that prevents 401s, the room-lookup credentials, and the 64-read cap
Nextcloud Talk is a downloadable channel plugin that connects OpenClaw to a self-hosted Nextcloud instance through a Talk webhook bot. Direct messages, rooms, reactions and markdown messages are supported, and media goes out as URLs. Here is the setup, including the one bot feature that stops replies failing, the notes that explain most surprises, access control for DMs and rooms, the capabilities table, and the reference.
Setup
- Install the plugin, then create the bot on the Nextcloud server with the occ command, a name, a shared secret, the webhook URL and three features, webhook, response and reaction; keep the response feature, because without it outbound replies fail with 401, and an existing bot is repaired with the state command.
- Enable the bot in the target room’s settings, then configure OpenClaw with the base URL and the bot secret, in config, as an environment variable for the default account, or through the channel-add command whose URL and token flags are aliases for the explicit base-URL and secret fields, with a file-backed secret option.
- Run the probe, start the Gateway if it is offline; config changes hot-reload, and a changed service environment needs a restart.
- Bots cannot initiate DMs, so the user must message the bot first; the webhook URL must be reachable from the Nextcloud server, with a public webhook URL set when the Gateway sits behind a proxy.
Bots cannot initiate DMs. The user must message the bot first.
The notes that explain surprises
Webhook requests are signed with an HMAC over the bot secret, and invalid signatures are rejected and rate limited. A message webhook returns 200 only after the raw event is durably stored, 500 on a storage failure, and the durable 200 carries the acceptance header a reverse proxy can require; unsupported non-message events get a 200 without the marker and are logged as ignored. The listener admits at most sixty-four concurrent unauthenticated body reads, and overflow gets a 429 with a closed connection; the budget is fixed, so deployments that saturate it should cap upstream fan-in and accept that refused deliveries may be lost. Media uploads are not supported by the bot API, so outbound media is appended as an attachment line with a URL. The webhook payload does not distinguish DMs from rooms: set an API user and app password to enable room-type lookups, cached about five minutes, or every conversation is treated as a room. Outbound requests pass the SSRF guard, with an explicit opt-in for a Nextcloud host on a trusted private network, and with the API credentials and public URL set, the status command probes the bot and warns when the response feature is missing.
Access control
- Direct messages default to pairing, approved from the CLI; open DMs need the open policy plus the wildcard entry, and the allow list matches lowercased Nextcloud user ids only, never display names.
- Rooms default to allowlist and are mention-gated: allow rooms by token in a rooms map, with a wildcard entry as the default, and per-room keys for require-mention, enabled, a sender allow list, tool overrides, a skills limit and a system prompt; an empty allowlist or the disabled policy allows no rooms.
- The capabilities table: direct messages, rooms and reactions supported; threads and native commands not; media URL-only.
OpenClaw pairing explains the approval code the DM default sends, and OpenClaw hooks and webhooks the durable-acceptance contract the webhook follows.
The reference
Beyond the base URL and secret: the API user, password and password file for room lookups and the probe; a webhook port of 8788 by default, host, path and public URL; the DM and group policies with their allow lists and access-group references; per-room settings; history limits for rooms and DMs with per-DM overrides; a text chunk limit of four thousand, the chunk mode and block-streaming keys; a reply-reference mode defaulting to all; a response prefix, a markdown table mode, the private-network opt-in, and per-account overrides with a default account. OpenClaw on Matrix is the other self-hosted protocol in the channel list for people who run their own server.
On Diali
Nextcloud Talk is not among the channels Diali connects today: the ones we run are WhatsApp, Telegram, Discord, Slack, Mattermost, Matrix, SMS and voice, and a self-run instance is where this plugin lives for now. Connect your first channel in five minutes shows our connect flow, Hosted OpenClaw on Diali is the assistant and Diali security describes the boundary.
- Three bot features, and response is the one that matters.
- Without API credentials, every conversation is a room.
- Sixty-four concurrent reads, then 429.
Stop reading about it, build one
Set up an agent, pick a channel, and have it working inside the app you already keep open.
