add-telegram
npx machina-cli add skill qwibitai/nanoclaw/add-telegram --openclawAdd Telegram Channel
This skill adds Telegram support to NanoClaw using the skills engine for deterministic code changes, then walks through interactive setup.
Phase 1: Pre-flight
Check if already applied
Read .nanoclaw/state.yaml. If telegram is in applied_skills, skip to Phase 3 (Setup). The code changes are already in place.
Ask the user
Use AskUserQuestion to collect configuration:
AskUserQuestion: Do you have a Telegram bot token, or do you need to create one?
If they have one, collect it now. If not, we'll create one in Phase 3.
Phase 2: Apply Code Changes
Run the skills engine to apply this skill's code package. The package files are in this directory alongside this SKILL.md.
Initialize skills system (if needed)
If .nanoclaw/ directory doesn't exist yet:
npx tsx scripts/apply-skill.ts --init
Or call initSkillsSystem() from skills-engine/migrate.ts.
Apply the skill
npx tsx scripts/apply-skill.ts .claude/skills/add-telegram
This deterministically:
- Adds
src/channels/telegram.ts(TelegramChannel class with self-registration viaregisterChannel) - Adds
src/channels/telegram.test.ts(46 unit tests) - Appends
import './telegram.js'to the channel barrel filesrc/channels/index.ts - Installs the
grammynpm dependency - Updates
.env.examplewithTELEGRAM_BOT_TOKEN - Records the application in
.nanoclaw/state.yaml
If the apply reports merge conflicts, read the intent file:
modify/src/channels/index.ts.intent.md— what changed and invariants
Validate code changes
npm test
npm run build
All tests must pass (including the new telegram tests) and build must be clean before proceeding.
Phase 3: Setup
Create Telegram Bot (if needed)
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.
Configure environment
Add to .env:
TELEGRAM_BOT_TOKEN=<their-token>
Channels auto-enable when their credentials are present — no extra configuration needed.
Sync to container environment:
mkdir -p data/env && cp .env data/env/env
The container reads environment from data/env/env, not .env directly.
Disable Group Privacy (for group chats)
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.
Build and restart
npm run build
launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS
# Linux: systemctl --user restart nanoclaw
Phase 4: Registration
Get Chat ID
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).
Register the chat
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):
registerGroup("tg:<chat-id>", {
name: "<chat-name>",
folder: "telegram_main",
trigger: `@${ASSISTANT_NAME}`,
added_at: new Date().toISOString(),
requiresTrigger: false,
isMain: true,
});
For additional chats (trigger-only):
registerGroup("tg:<chat-id>", {
name: "<chat-name>",
folder: "telegram_<group-name>",
trigger: `@${ASSISTANT_NAME}`,
added_at: new Date().toISOString(),
requiresTrigger: true,
});
Phase 5: Verify
Test the connection
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.
Check logs if needed
tail -f logs/nanoclaw.log
Troubleshooting
Bot not responding
Check:
TELEGRAM_BOT_TOKENis set in.envAND synced todata/env/env- Chat is registered in SQLite (check with:
sqlite3 store/messages.db "SELECT * FROM registered_groups WHERE jid LIKE 'tg:%'") - For non-main chats: message includes trigger pattern
- Service is running:
launchctl list | grep nanoclaw(macOS) orsystemctl --user status nanoclaw(Linux)
Bot only responds to @mentions in groups
Group Privacy is enabled (default). Fix:
@BotFather>/mybots> select bot > Bot Settings > Group Privacy > Turn off- Remove and re-add the bot to the group (required for the change to take effect)
Getting chat ID
If /chatid doesn't work:
- Verify token:
curl -s "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getMe" - Check bot is started:
tail -f logs/nanoclaw.log
After Setup
If running npm run dev while the service is active:
# macOS:
launchctl unload ~/Library/LaunchAgents/com.nanoclaw.plist
npm run dev
# When done testing:
launchctl load ~/Library/LaunchAgents/com.nanoclaw.plist
# Linux:
# systemctl --user stop nanoclaw
# npm run dev
# systemctl --user start nanoclaw
Agent Swarms (Teams)
After completing the Telegram setup, use AskUserQuestion:
AskUserQuestion: Would you like to add Agent Swarm support? Without it, Agent Teams still work — they just operate behind the scenes. With Swarm support, each subagent appears as a different bot in the Telegram group so you can see who's saying what and have interactive team sessions.
If they say yes, invoke the /add-telegram-swarm skill.
Removal
To remove Telegram integration:
- Delete
src/channels/telegram.tsandsrc/channels/telegram.test.ts - Remove
import './telegram.js'fromsrc/channels/index.ts - Remove
TELEGRAM_BOT_TOKENfrom.env - Remove Telegram registrations from SQLite:
sqlite3 store/messages.db "DELETE FROM registered_groups WHERE jid LIKE 'tg:%'" - Uninstall:
npm uninstall grammy - Rebuild:
npm run build && launchctl kickstart -k gui/$(id -u)/com.nanoclaw(macOS) ornpm run build && systemctl --user restart nanoclaw(Linux)
Source
git clone https://github.com/qwibitai/nanoclaw/blob/main/.claude/skills/add-telegram/SKILL.mdView on GitHub Overview
This skill adds Telegram as a channel to NanoClaw, allowing you to send notifications or trigger actions. It can replace WhatsApp entirely or run alongside it, and can be configured as a control-only channel or a passive notification channel. The setup uses the skills engine to deterministically apply code changes and configure a bot token.
How This Skill Works
The skill deterministically applies a code package that adds src/channels/telegram.ts and tests, updates the channel barrel, and installs grammy. It then guides through setup to collect or create a Telegram bot token, wire TELEGRAM_BOT_TOKEN in .env, and register chat IDs for main chats or groups.
When to Use It
- You want to replace WhatsApp with Telegram as the main notification channel.
- You want Telegram to run alongside WhatsApp for redundancy.
- You want a control-only Telegram channel that triggers actions in NanoClaw.
- You want a passive Telegram channel that only receives notifications.
- You need to operate in group chats and manage privacy by disabling Group Privacy for full message access.
Quick Start
- Step 1: Initialize and apply the skill: npx tsx scripts/apply-skill.ts .claude/skills/add-telegram
- Step 2: Provide a Telegram bot token or create one via BotFather during Phase 3
- Step 3: Configure environment and build: add TELEGRAM_BOT_TOKEN to .env, sync to data/env, then run npm run build and restart
Best Practices
- Decide early whether Telegram will replace or supplement existing channels.
- Store and rotate the bot token securely; use TELEGRAM_BOT_TOKEN in .env.
- Test in a dev environment with unit tests and a test Telegram chat.
- Follow Phase 3 setup steps for group privacy and obtaining chat IDs.
- Monitor Telegram interactions and handle chat IDs with proper validation.
Example Use Cases
- Send real-time incident alerts to a Telegram direct chat or group when critical events occur.
- Trigger automated actions in NanoClaw from Telegram commands or @mentions.
- Broadcast status updates to a Telegram channel or group for on-call teams.
- Deliver user-specific notifications to a direct Telegram chat with the bot.
- Manage group conversations by adding the bot and retrieving chat IDs for targeted dispatch.