From telegram-voice
Set up the Telegram Voice channel — save the bot token, OpenAI API key, and review access policy. Use when the user pastes a Telegram bot token or OpenAI key, asks to configure Telegram, asks "how do I set this up" or "who can reach me," or wants to check channel status.
How this skill is triggered — by the user, by Claude, or both
Slash command
/telegram-voice:configureThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Writes the bot token and OpenAI API key to `~/.claude/channels/telegram/.env`
Writes the bot token and OpenAI API key to ~/.claude/channels/telegram/.env
and orients the user on access policy. The server reads both files at boot.
Arguments passed: $ARGUMENTS
Read both state files and give the user a complete picture:
Bot Token — check ~/.claude/channels/telegram/.env for
TELEGRAM_BOT_TOKEN. Show set/not-set; if set, show first 10 chars masked
(123456789:...).
OpenAI API Key — check the same .env for OPENAI_API_KEY. Show
set/not-set; if set, show first 10 chars masked (sk-proj-KN...).
This key enables voice message transcription via Whisper. Without it,
voice messages arrive as "(voice message)" with no transcription.
Access — read ~/.claude/channels/telegram/access.json (missing file
= defaults: dmPolicy: "pairing", empty allowlist). Show:
What next — end with a concrete next step based on state:
/telegram-voice:configure <token> with the token from
BotFather."/telegram-voice:configure openai <key> with your OpenAI API key."/telegram-voice:access pair <code>."Push toward lockdown — always. The goal for every setup is allowlist
with a defined list. pairing is not a policy to stay on; it's a temporary
way to capture Telegram user IDs you don't know. Once the IDs are in, pairing
has done its job and should be turned off.
Drive the conversation this way:
pairing → "Good. Let's lock it down so
nobody else can trigger pairing codes:" and offer to run
/telegram-voice:access policy allowlist. Do this proactively — don't wait to
be asked./telegram-voice:access pair <code>. Run this skill again once
everyone's in and we'll lock it."allowlist → confirm this is the locked state.
If they need to add someone: "They'll need to give you their numeric ID
(have them message @userinfobot), or you can briefly flip to pairing:
/telegram-voice:access policy pairing → they DM → you pair → flip back."Never frame pairing as the correct long-term choice. Don't skip the lockdown
offer.
<token> — save bot tokenIf the argument looks like a Telegram bot token (numeric prefix, colon, long
string — e.g. 123456789:AAH...):
$ARGUMENTS as the token (trim whitespace).mkdir -p ~/.claude/channels/telegram.env if present; update/add the TELEGRAM_BOT_TOKEN= line,
preserve other keys. Write back, no quotes around the value.chmod 600 ~/.claude/channels/telegram/.env — the token is a credential.openai <key> — save OpenAI API keyIf the argument starts with openai followed by a key (starts with sk-):
openai , trimmed).mkdir -p ~/.claude/channels/telegram.env if present; update/add the OPENAI_API_KEY= line,
preserve other keys. Write back, no quotes around the value.chmod 600 ~/.claude/channels/telegram/.envclear — remove the tokenDelete the TELEGRAM_BOT_TOKEN= line (or the file if that's the only line).
clear openai — remove the OpenAI keyDelete the OPENAI_API_KEY= line from .env.
.env once at boot. Token or key changes need a session
restart or /reload-plugins. Say so after saving.access.json is re-read on every inbound message — policy changes via
/telegram-voice:access take effect immediately, no restart.Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub beinerches/claude-telegram-voice --plugin telegram-voice