Globally-installed CLI commands that let Claude Code, opencode, gemini-cli β anything with a terminal β message you on Telegram and block until you reply. Approve a deploy from your phone. Get a voice note when the build lands, in a voice that sounds human β and answer it by holding the mic, transcribed on your own CPU.
$ telegram-wait "ready to push to prod?" π€ sending [d-repos-my-bot] prompt... β³ [d-repos-my-bot] waiting for reply (timeout 36000s, poll 2s)... β you tap Reply on your phone and just hold the mic β π₯ received at 4/29/2026, 12:34:56 AM π§ voice note (4s) β transcribing locally (0 VRAM)... yes go ahead and push the changes to production $ git push origin main && telegram-voice "deployed, all green" π£οΈ Synthesizing speech (kokoro)... π€ Sending voice note as [d-repos-my-bot]... [+] Voice message sent.
The toolkit
Every one works from any directory once installed. They're shell commands, not MCP tools β your agent just runs them.
Why it's not just a webhook
Each agent derives an id from its working directory β D:\Repos\my-bot becomes [d-repos-my-bot]. Ten agents, one chat, zero crossed wires.
Prefix the agent id, or just tap-and-Reply on its message in the Telegram client. Both routes unblock the right waiter.
Agent speaks as a real voice note in a human-sounding local voice (Kokoro-82M). You reply by holding the mic β whisper.cpp turns it into text. Both directions offline, zero VRAM, no API key.
Say βtelegram mode onβ and every reply for the rest of the session routes to your phone. The IDE becomes a worker pane. Say βvoice mode onβ and it goes hands-free β it speaks, you hold the mic, neither side types.
A Convex cron fires scheduled and recurring messages 24/7 β long after the agent that queued them exited.
Pipe anything on stdin. Past Telegram's 4096-char ceiling it auto-splits on sentence boundaries, prefix intact on every chunk.
Talk, donβt type
Two local models, no API key on either side: Kokoro-82M reads your agentβs message out loud, whisper.cpp turns your held-mic reply back into text. Both run on the CPU.
$ telegram-setup-tts β kokoro-onnx already available in python β kokoro-v0_19.onnx already present (310 MB) π£οΈ Test synthesis with voice af_bella... [+] Local voice ready. $ telegram-voice "the build is green, nothing needs you" π£οΈ Synthesizing speech (kokoro)... [+] Voice message sent.
Kokoro-82M through ONNX runtime β 82 million parameters, about a second per sentence on the CPU. Pick a voice with TELEGRAM_TTS_VOICE: af_bella, af_sarah, am_adam, bf_emma.
Say βvoice mode onβ and the whole session goes hands-free: the agent speaks every turn, you answer by holding the mic.
With no model on disk it falls back to the Windows built-in voice β sounds like 2003, needs zero setup. Force either engine with TELEGRAM_TTS=kokoro|sapi.
The model lands in the same directory mcp-server-notify uses for its desktop voice. Set up either tool and the other is already done β 331 MB once, not twice.
Setup
Setup also drops the skill into ~/.claude/skills/telegram/, so every Claude Code instance on the box picks it up automatically.
$ git clone https://github.com/qxZap/telegram-bro.git $ cd telegram-bro $ bun install && bun link $ telegram-setup "<bot_token>" "<user_id>" "<convex_deploy_key>"
Message @BotFather, send /newbot, copy the token.
Message @userinfobot, copy the numeric id.
New project at dashboard.convex.dev β Settings β Deploy Keys. The free tier covers personal use.
telegram-setup-ttsFetches the Kokoro-82M voice so your agent stops sounding like a screen reader. ~331 MB, CPU-only.
telegram-setup-sttFetches whisper.cpp so the voice notes you send back get transcribed. ~160 MB, zero VRAM.
Under the hood
telegram-send POSTs to Convex, which calls the Telegram Bot API and stores the resulting message_id for later reply-matching.
Telegram's webhook hits a Convex HTTP action, which records the message along with its reply_to chain.
telegram-wait polls getInboundForAgent, which returns only messages addressed to this agent β by prefix or by reply chain.