AXEG0's fork of Anthropic's official Telegram channel plugin. Your bot forwards messages into the Claude Code session, and Claude replies, reacts and edits through it.
| Feature | What you get |
|---|---|
| ⌨️ Typing for the whole turn | "typing…" stays on while Claude works, whoever started the turn. Running the typing hooks by hand in the session, with nothing or junk on stdin, neither stops nor starts it. |
| 🚨 Stuck alerts | The bot tells you when a turn shows no activity for 10 minutes, or, with an alert chat set, the whole session for 45, and again when Claude is back. |
| 📡 Through Telegram's bad minutes | A poll Telegram never answers is dropped after 45 seconds and the next goes 3 seconds later, so the chat is back within about a minute of Telegram recovering, and each failed poll leaves a line in the log. A send Telegram may still deliver says so, in a result that is no error, so Claude does not send it twice. The bot's replies to commands and pairing and its answers to a tap run beside the update loop, so one Telegram never answers holds up no message, while a tap waiting for another change of buttons holds back other messages for up to 10 seconds per Telegram call made under it. |
| 🚦 Rate limits leave a trace | When Telegram tells the bot to slow down, the log gets one line naming the call, the chat and how long Telegram asks it to wait. While that wait runs, typing and the live subagents message send nothing to that chat, a chat with another bot included, and both come back by themselves once it ends. Replies, edits and reactions still go to Telegram, and a refused reply tells Claude it was not sent and how long to wait. Nothing is sent again or queued. |
| 🗒️ A log that outlasts start-up | Claude Code keeps a plugin's output only until the plugin has started. Every line the plugin prints, its libraries' errors and Bun's warnings included, also goes to a file of its own, one per plugin start, with the time and the plugin's version, so a notice that failed to send or a rate limit stays readable afterwards. The bot token and the speech-to-text key never reach it. A file past 1 MiB is set aside and a fresh one starts, only the last one set aside is kept, and files untouched for a week are deleted. If the file can't be written, the plugin carries on as before. |
| 📊 A record of every call | Every call the bot makes to Telegram, except its checks for new messages, leaves one line in a file of its own: when, which kind, which chat, how long it took, and whether Telegram accepted it, refused it (with its error number and wait) or never answered. Never a message's text, a file or the bot token. One command prints the day before Telegram's latest block: calls per kind and per hour, with the subagents message's edits apart. A file past 16 MiB is set aside and a fresh one starts, and files untouched for a week are deleted. If the file can't be written, the plugin carries on as before. |
| When a turn your message started ends on an error, such as the model's provider refusing every call, the bot tells you once, with the error's type and Claude Code's text, and again when turns end without an error. | |
| 🤖 Live subagents and shells | Concurrent subagents and background shells share one live message, updated at most once every 12 seconds per chat: one row each with step, time and tokens, or a shell's description and time. A row ends as Done, Failed (with a shell's exit code, or the class of the API error a subagent's model call ended on), Stopped, or No longer followed once its server stops. A workflow's subagents show under the labels the workflow gave them, and stopping the workflow closes their rows still running as Stopped. A finished row leaves the message five minutes after it first shows finished. When a server dies before it can close its message, the next server that polls the bot closes it. |
| 📄 Messages from files | Claude sends or edits a message whose text is a Markdown file it already wrote, by its path, instead of typing the whole text out again for each chat: the file's text goes as the message itself, never as an attached document, with the same formats, splitting and buttons as typed text. Several files join into one message, so each chat can get only the sections meant for it. The channel's own files are refused, and so are binary files and more than 256 KiB in all. The answer names a copy of the exact words sent, kept on the machine that sent them, and deleted, as the plugin's log files are, once untouched for a week, and sooner, oldest first, once all copies together pass 64 MiB. |
| 📝 Rich messages | Headings, tables, task lists, code and collapsible sections render natively in Telegram. A format the plugin does not take, such as markdown, is refused with an error naming the formats, and nothing is sent. |
| 🎙️ Voice messages | Voice notes, audio and video notes reach Claude as text, transcribed by OpenAI. A slow download or transcription holds up no other chat, reaction or press, your own messages keep their order, and a note that cannot be transcribed arrives with the reason. A message a crash or a restart cut off reaches the next session. |
| 📦 Bursts as one message | Quick texts, a long paste Telegram split, and photos or documents with the text sent beside them arrive together, so Claude answers once. |
| ↩️ Reply context | Claude sees the message you replied to and the part you quoted. |
| ✏️ Edits | Edit a message you sent, and Claude gets its new text as an edit of that message. |
| 👍 Reactions | React to a message the bot sent, and Claude gets the emoji at once as your reaction to that message, with its opening words. |
| 🔘 Answer buttons | Claude puts buttons under a question, such as Yes and No; your press reaches Claude once, as your choice on that message, and the buttons then show what you picked. |
| 🤝 Other bots | Claude talks to another bot that has bot-to-bot communication on, and the live subagent message and stuck alerts that would go to the bot go to you. Chat IDs are numeric: only you add another bot, in the terminal, with /telegram:access bot <id> @username, and Claude then reaches it before it has written. A reply with files reaches another bot on this plugin as one message: the files go first, as one album of documents, with the text as the album's caption or right after it. The reply's answer says which message holds the text, a file's caption included, and edit_message corrects the text there. |
| 🔐 Permissions for you alone | Permission prompts go only to you, and only your tap or yes <code> reply answers them. In bypass mode, a Bash ask is allowed with a notice to you instead of a prompt. |
Plus everything from the official plugin: pairing and allowlists, photos and files, and reactions.
🤖 Subagents · 🐚 Shells
1. ⏳ general-purpose · Review PRs 3 and 4 · Checking gate · 4m 31s · 85.4k tokens
2. ✅ Done in 1m 12s · Explore · Find the retry logic · 41.3k tokens
3. ⏳ shell · Wait for CI · 2m 5s
claude plugin marketplace add AXEG0/claude-telegram
claude plugin install telegram@claude-telegram
claude --dangerously-load-development-channels plugin:telegram@claude-telegramThen give the bot its token with /telegram:configure and pair your account.
The setup guide walks
through BotFather, the token and pairing. With the official plugin installed,
disable it first (claude plugin disable telegram@claude-plugins-official):
both share the same token and pairing.
Turn on the optional features in ~/.claude/channels/telegram/.env:
# Rich messages
TELEGRAM_RICH_MESSAGES=true
# Voice messages as text
TELEGRAM_STT_OPENAI_KEY=sk-...- Plugin README: setup, settings, tools and how each feature behaves.
- ACCESS.md: DM policies, groups and allowlists.
Forked from anthropics/claude-plugins-official. This marketplace publishes the Telegram plugin; the other directories come from the upstream repository. Licensed under Apache 2.0.