How We Migrated 20+ AI Agents from Telegram to Slack in a Single Day
TL;DR
We fully migrated a 9-node, 20+ agent OpenClaw multi-agent environment from Telegram to Slack in one day. Here's what tripped us up and what we learned.
Background
We run a cluster of 9 GMK mini PCs at home, each hosting multiple OpenClaw-based AI agents for different purposes — work, hobbies, family tasks, and more.
Up until now, we managed each agent through individual Telegram Bots. But the pain points were stacking up:
- Managing 20+ separate bot tokens is tedious
- Slack lets us unify all channels and DMs in one workspace
- Slack offers better UX with ack reactions (👀) and partial streaming support
So we decided to make the switch.
What We Did
Step 1: Remove Telegram from all nodes
We SSH'd into all 9 nodes and edited openclaw.yaml to remove channels.telegram, related plugins, and all Telegram bindings. Then we restarted the gateway on each node.
Step 2: Create Slack Apps and distribute tokens
We created a Slack App per node, generated Bot Tokens and App Tokens, and placed them in the config. That's where the first trap hit us.
Step 3: Test, break, fix, repeat
This is where the real work was.
5 Traps We Fell Into
1. Adding assistant:write scope breaks DM delivery
When we added assistant:write to the Slack App Manifest's OAuth scopes, bot DMs stopped working completely. It turns out this scope enables Slack's "AI Assistant" mode, which silently disables normal chat:write-based DMs.
Fix: Remove assistant:write from scopes and recreate the app.
2. ackReactionScope: "group-mentions" doesn't fire in DMs
We had OpenClaw's messages.ackReactionScope set to "group-mentions". The 👀 ack reaction worked fine in group channels, but nothing happened in DMs.
Fix: Change to ackReactionScope: "all". DMs now get acknowledged too.
3. Missing entries in agents.list breaks bindings silently
When hosting multiple agents (multiple Slack Apps) on one node, you must list all agent IDs in agents.list. Any omission causes that agent's binding to silently fall back to the default agent — no error, just the wrong agent responding.
4. Pi4 gateway startup failure — controlUi.allowedOrigins
After upgrading OpenClaw on a Pi4 node with gateway.bind: "lan", the gateway refused to start. Root cause: controlUi.allowedOrigins was not set.
Fix: Add gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback: true to the config.
5. Updating Slack App Manifests requires an App Configuration Token
Standard Bot Tokens can't call app.manifest.update. You need an App Configuration Token, which is workspace-scoped and expires after 12 hours. If you're automating manifest updates, plan for refresh token management.
Results
| Metric | Before | After |
|---|---|---|
| Chat platform | Telegram Bot ×20+ | Slack App ×20+ |
| Ack display | None | 👀 reaction |
| Streaming | Endless "typing..." | Partial streaming |
| Management UI | Telegram BotFather | Slack App dashboard + API |
| Migration time | — | ~3 hours (including fixes) |
Lessons Learned
-
Be careful with Slack App scopes —
assistant:writehas unexpected side effects - Use
ackReactionScope: "all"if you need DM acknowledgement - In multi-agent setups, always double-check
agents.listcompleteness -
Store tokens in
.envfiles — don't embed credentials directly in config files - The migration itself is doable in a day; knowing the pitfalls cuts it to half a day
Environment
- OpenClaw (latest)
- Ubuntu 24.04 (9-node GMK mini PC cluster)
- Slack Free Plan
Tags: #OpenClaw #Slack #Telegram #MultiAgent #Infrastructure #Migration #DevOps
Top comments (0)