Auth model
Installed plugin + Nextcloud Talk credentials + room policy
A self-hosted collaboration lane that stays inside the Nextcloud perimeter.
Nextcloud Talk for OpenClaw covers plugin setup, server credentials, room access, and a verification path tuned for self-hosted teams.
Auth model
Installed plugin + Nextcloud Talk credentials + room policy
Safety stance
Document which server, rooms, and identity policy define the trust boundary.
Verification ritual
Validate login, room delivery, and reconnect behavior on the exact self-hosted instance meant for production.
Rollout mode
25–40 min setup
Nextcloud Talk webhook bot
This plugin supports direct messages, rooms, reactions, and markdown, but users must message first, media goes out as URLs, and rooms stay allowlisted and mention-gated by default.
Watch the Talk bot
Room-level access assumptions can drift after server upgrades or admin policy changes.
Nextcloud Talk is the self-hosted collaboration lane in this batch, but the important boundary is not “self-hosted therefore trusted.” The actual trust boundary is the combination of plugin installation, Nextcloud bot registration, shared-secret webhook delivery, room enablement, and OpenClaw DM / room policy.
Nextcloud Talk is documented upstream as a plugin-backed webhook bot.
That immediately gives it a different shape from cloud-bot lanes:
That is good for privacy and control, but it also means “the server is ours” should not be confused with “the integration is simple.”
The local official docs describe Nextcloud Talk as supporting:
The same docs are equally clear about the limits:
Those four facts shape both operator expectations and rollout design.
Keep these facts near the top of the dossier because they determine whether the lane is even alive:
openclaw plugins install @openclaw/nextcloud-talkocc talk:bot:installbaseUrl and botSecretwebhookPublicUrl if the gateway sits behind a proxy or internal bind addressThis is not a channel where “I set a token” proves very much.
There are two platform-specific details in the official docs that deserve special attention.
A user must message the bot first.
That means “nothing happened when we tried to greet a user proactively” is not a bug according to the documented behavior.
The official docs state that without apiUser and apiPassword, the webhook payload does not distinguish DMs from rooms and DMs are treated as rooms.
That is a big operational clue.
If you expect both direct messages and shared rooms to behave correctly, plan room-type lookup credentials from the start rather than discovering this after rollout.
The official minimal config is enough to boot the lane, but a practical baseline should still be narrow.
Recommended first posture:
pairing,{
channels: {
'nextcloud-talk': {
enabled: true,
baseUrl: 'https://cloud.example.com',
botSecret: 'shared-secret',
dmPolicy: 'pairing',
groupPolicy: 'allowlist',
rooms: {
'room-token': { requireMention: true },
},
},
},
}
{
channels: {
'nextcloud-talk': {
baseUrl: 'https://cloud.example.com',
botSecret: 'shared-secret',
apiUser: 'bot-api-user',
apiPasswordFile: '/path/to/nextcloud-app-password.txt',
webhookPublicUrl: 'https://gateway.example.com/nextcloud-talk-webhook',
dmPolicy: 'pairing',
groupPolicy: 'allowlist',
rooms: {
'room-token': { requireMention: true },
},
},
},
}
That second shape is not mandatory for every deployment, but it is the safest documented posture when DMs and rooms both matter.
This channel is explicitly not bundled with core OpenClaw.
Install the plugin first:
openclaw plugins install @openclaw/nextcloud-talk
Then create the bot on the Nextcloud server with the documented command:
./occ talk:bot:install "OpenClaw" "<shared-secret>" "<webhook-url>" --feature reaction
That command is worth documenting exactly because it establishes three things at once:
The official docs say to enable the bot in the target room settings.
That is easy to miss if you are thinking purely in gateway terms.
A room can exist, the server can be up, and the webhook can be correct, yet the bot still will not participate if the room-level enablement step was skipped.
The local docs call out the required baseline fields clearly:
channels.nextcloud-talk.baseUrlchannels.nextcloud-talk.botSecretFrom there, the most important optional fields are operational rather than decorative:
apiUserapiPassword or apiPasswordFilewebhookPublicUrlThat is the right order to think in as well: first make the server relationship real, then make DM / room detection and proxy reachability boring.
The official default is:
channels.nextcloud-talk.dmPolicy = "pairing"Unknown senders get a pairing code and must be approved:
openclaw pairing list nextcloud-talk
openclaw pairing approve nextcloud-talk <CODE>
The docs also note that allowFrom matches Nextcloud user IDs, not display names.
That is important if you move from pairing to allowlists later.
The local docs document rooms as the central group-control surface:
groupPolicy is allowlistchannels.nextcloud-talk.roomsrequireMention can be set per roomThat makes Nextcloud Talk one of the easier channels to keep conservative by default.
Before talking about prompt quality or model behavior, verify the infrastructure pieces:
webhookPublicUrl is set if the internal bind address is not externally reachable.For broader gateway checks, keep these nearby:
Because bots cannot initiate DMs, the first real proof is a user message to the bot.
Expect pairing by default, then approve it:
openclaw pairing list nextcloud-talk
openclaw pairing approve nextcloud-talk <CODE>
If pairing behavior needs a refresher:
After the DM works, enable exactly one room and verify:
channels.nextcloud-talk.rooms,requireMention posture,The official docs say reactions are supported.
So after plain text is stable, it is reasonable to test one reaction flow.
That is a better checkpoint than testing unsupported features like threads.
Webhook lanes behind self-hosted infrastructure should survive a simple lifecycle event.
Restart the gateway, or bounce the proxy if you have one, then repeat the DM and one-room test.
The official docs call this out directly and provide webhookPublicUrl for the behind-proxy case.
If Nextcloud cannot reach the gateway on the URL it was given, nothing else matters.
This is a very plausible first failure because bot registration and room enablement are separate steps in the documented flow.
The local docs explicitly warn that this happens when apiUser and apiPassword are not set.
If your operator notes mention “DMs seem to follow room logic,” this is the first supported explanation to check.
Those are expectation bugs, not implementation bugs, according to the official docs:
Document that early and you avoid a whole class of false incident reports.
This lane is a strong fit when:
It is a weaker first lane if you want a platform that handles most ingress complexity for you.
Nextcloud Talk will usually be a narrower internal lane rather than the broadest public ingress path.
That makes it a good candidate for:
For the routing model itself, use:
Verification & references
References