Add Telegram as a channel. Can replace WhatsApp entirely or run alongside it. Also configurable as a control-only channel (triggers actions) or passive channel (receives notifications only).
This skill adds Telegram support to NanoClaw using the skills engine for deterministic code changes, then walks through interactive setup.
Read .nanoclaw/state.yaml. If telegram is in applied_skills, skip to Phase 3 (Setup). The code changes are already in place.
Mode: Replace WhatsApp or add alongside it?
TELEGRAM_ONLY=trueDo they already have a bot token? If yes, collect it now. If no, we'll create one in Phase 3.
Run the skills engine to apply this skill's code package. The package files are in this directory alongside this SKILL.md.
If .nanoclaw/ directory doesn't exist yet:
npx tsx scripts/apply-skill.ts --init
Or call initSkillsSystem() from skills-engine/migrate.ts.
npx tsx scripts/apply-skill.ts .claude/skills/add-telegram
This deterministically:
src/channels/telegram.ts (TelegramChannel class implementing Channel interface)src/channels/telegram.test.ts (46 unit tests)src/index.ts (multi-channel support, findChannel routing)src/config.ts (TELEGRAM_BOT_TOKEN, TELEGRAM_ONLY exports)src/routing.test.tsgrammy npm dependency.env.example with TELEGRAM_BOT_TOKEN and TELEGRAM_ONLY.nanoclaw/state.yamlIf the apply reports merge conflicts, read the intent files:
modify/src/index.ts.intent.md — what changed and invariants for index.tsmodify/src/config.ts.intent.md — what changed for config.tsnpm test
npm run build
All tests must pass (including the new telegram tests) and build must be clean before proceeding.
If the user doesn't have a bot token, tell them:
I need you to create a Telegram bot:
- Open Telegram and search for
@BotFather- Send
/newbotand follow prompts:
- Bot name: Something friendly (e.g., "Andy Assistant")
- Bot username: Must end with "bot" (e.g., "andy_ai_bot")
- Copy the bot token (looks like
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11)
Wait for the user to provide the token.
Add to .env:
TELEGRAM_BOT_TOKEN=<their-token>
If they chose to replace WhatsApp:
TELEGRAM_ONLY=true
Sync to container environment:
mkdir -p data/env && cp .env data/env/env
The container reads environment from data/env/env, not .env directly.
Tell the user:
Important for group chats: By default, Telegram bots only see @mentions and commands in groups. To let the bot see all messages:
- Open Telegram and search for
@BotFather- Send
/mybotsand select your bot- Go to Bot Settings > Group Privacy > Turn off
This is optional if you only want trigger-based responses via @mentioning the bot.
npm run build
launchctl kickstart -k gui/$(id -u)/com.nanoclaw
Tell the user:
- Open your bot in Telegram (search for its username)
- Send
/chatid— it will reply with the chat ID- For groups: add the bot to the group first, then send
/chatidin the group
Wait for the user to provide the chat ID (format: tg:123456789 or tg:-1001234567890).
Use the IPC register flow or register directly. The chat ID, name, and folder name are needed.
For a main chat (responds to all messages, uses the main folder):
registerGroup("tg:<chat-id>", {
name: "<chat-name>",
folder: "main",
trigger: `@${ASSISTANT_NAME}`,
added_at: new Date().toISOString(),
requiresTrigger: false,
});
For additional chats (trigger-only):
registerGroup("tg:<chat-id>", {
name: "<chat-name>",
folder: "<folder-name>",
trigger: `@${ASSISTANT_NAME}`,
added_at: new Date().toISOString(),
requiresTrigger: true,
});
Tell the user:
Send a message to your registered Telegram chat:
- For main chat: Any message works
- For non-main:
@Andy helloor @mention the botThe bot should respond within a few seconds.
tail -f logs/nanoclaw.log
TELEGRAM_BOT_TOKEN is set in .env AND synced to data/env/envsqlite3 store/messages.db "SELECT * FROM registered_groups WHERE jid LIKE 'tg:%'"launchctl list | grep nanoclawGroup Privacy is enabled (default). Fix:
@BotFather > /mybots > select bot > Bot Settings > Group Privacy > Turn offIf /chatid doesn't work:
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getMe"tail -f logs/nanoclaw.logAsk the user:
Would you like to add Agent Swarm support? Each subagent appears as a different bot in the Telegram group. If interested, run
/add-telegram-swarm.