DEV Community

linou518
linou518

Posted on

How We Migrated 20+ AI Agents from Telegram to Slack in a Single Day

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

  1. Be careful with Slack App scopesassistant:write has unexpected side effects
  2. Use ackReactionScope: "all" if you need DM acknowledgement
  3. In multi-agent setups, always double-check agents.list completeness
  4. Store tokens in .env files — don't embed credentials directly in config files
  5. 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)