Connect Telegram to nanoinfra
This guide connects one Telegram bot to nanoinfra. Messages sent to that bot use your normal nanoinfra model, tools, memory, and workspace.
What this guide builds
- a Telegram bot created through BotFather
- the
telegramchannel enabled in nanoinfra - a running nanoinfra gateway
- one pairing-approved Telegram account
Prerequisites
- A working nanoinfra CLI reply:
nanoinfra agent -m "Hello!"
- A Telegram account.
- A bot token from
@BotFather.
Install nanoinfra
Quick Start ranks four install methods easiest first. This is the first of them. Use pip, Docker or a source checkout instead if you prefer, and come back here.
uv tool install nanoinfra
nanoinfra onboard --wizard
Connect Telegram in the WebUI
Start the WebUI:
nanoinfra webui
Open Settings → Channels → Telegram:
- If Telegram support is not installed, turn on its switch and confirm the installation.
- Paste the token from BotFather.
- If the gateway cannot reach Telegram directly, expand Advanced and enter
an HTTP or SOCKS proxy such as
http://127.0.0.1:7890. - Save and enable Telegram.
The configuration badge appears as soon as a bot token is saved. A connection check is separate. If Telegram is temporarily unreachable, the saved configuration remains valid. The bot keeps working in an environment where the gateway has network access.
Saved tokens and proxy URLs are masked. A proxy entered here is used both for the connection check and for normal Telegram traffic.
Manual setup
For a headless installation, install Telegram support:
nanoinfra plugins enable telegram
Then merge this snippet into ~/.nanoinfra/config.json:
{
"channels": {
"telegram": {
"enabled": true,
"token": "YOUR_BOT_TOKEN",
"proxy": "http://127.0.0.1:7890"
}
}
}
Omit proxy when the gateway can reach Telegram directly.
Omitting allowFrom enables pairing-only mode. The first DM from a new user
gets a pairing code instead of agent access.
Telegram uses long polling by default. Webhook mode is available for public HTTPS deployments. Start with long polling for the first test.
Run nanoinfra gateway
nanoinfra channels status
nanoinfra gateway
Leave the gateway running while you test messages.
Test a message
Open Telegram, DM the bot, and send:
Hello from Telegram
The bot should reply with a pairing code. Approve that code from an already trusted surface, such as the local CLI, and not the example below:
nanoinfra agent -m "/pairing approve <the code the bot sent you>"
If you missed the code, list the pending requests:
nanoinfra agent -m "/pairing"
Send the message again after approval. The reply should use the same model and workspace as your local CLI check.
Security notes
- Prefer pairing-only mode for first setup. Add
allowFromonly when you want a static allowlist instead of code approval. - Do not use
allowFrom: ["*"]unless the bot is isolated or intentionally public. - Rotate the BotFather token if it is pasted into logs or shared files.
- Review tool access before adding group chats or more users.
Troubleshooting
- If the channel is not listed, run
nanoinfra plugins enable telegramagain in the same Python environment. - If the WebUI shows a saved configuration but the live check cannot reach Telegram,
the token is still saved. Confirm the gateway can reach
api.telegram.org, or open Advanced → Network proxy and enter a proxy. - If Telegram rejects the token, copy the current token from BotFather or regenerate it.
- If messages do not arrive, run
nanoinfra gateway --verboseand confirm the Telegram channel is enabled. - If a first DM returns a pairing code, that is expected. Approve the code before testing normal agent replies.
- If Telegram Web shows unsupported rich messages, keep
richMessagesdisabled.