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 GhostClaw using the skills engine for deterministic code changes, then walks through interactive setup.
Read .ghostclaw/state.yaml. If telegram is in applied_skills, skip to Phase 3 (Setup). The code changes are already in place.
Use AskUserQuestion to collect configuration:
AskUserQuestion: Should Telegram replace WhatsApp or run alongside it?
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.
Run the skills engine to apply this skill's code package. The package files are in this directory alongside this SKILL.md.
If .ghostclaw/ 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.ghostclaw/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.ghostclaw # macOS
# Linux: systemctl --user restart ghostclaw
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/ghostclaw.log
Check:
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 ghostclaw (macOS) or systemctl --user status ghostclaw (Linux)Group 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/ghostclaw.logIf running npm run dev while the service is active:
# macOS:
launchctl unload ~/Library/LaunchAgents/com.ghostclaw.plist
npm run dev
# When done testing:
launchctl load ~/Library/LaunchAgents/com.ghostclaw.plist
# Linux:
# systemctl --user stop ghostclaw
# npm run dev
# systemctl --user start ghostclaw
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.
To remove Telegram integration:
src/channels/telegram.tsTelegramChannel import and creation from src/index.tschannels array and revert to using whatsapp directly in processGroupMessages, scheduler deps, and IPC depsgetAvailableGroups() filter to only include @g.us chatsTELEGRAM_BOT_TOKEN, TELEGRAM_ONLY) from src/config.tssqlite3 store/messages.db "DELETE FROM registered_groups WHERE jid LIKE 'tg:%'"npm uninstall grammynpm run build && launchctl kickstart -k gui/$(id -u)/com.ghostclaw (macOS) or npm run build && systemctl --user restart ghostclaw (Linux)Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer