Command center for your Telegram bots
Multi-bot dashboard with built-in reverse proxy, inter-bot routing, protocol bridges, and AI-powered smart routing. Single binary. Pure Go.
One binary manages all your bots. Proxy, route, bridge, and monitor — from a single dashboard.
Manage all bots from one instance. Add via CLI or web UI. Per-bot status, health checks, and config. No restarts needed.
Poll Telegram, forward updates to webhook backends. Secret token auth, webhook-style responses, automatic health checks every 60s.
Telegram-compatible getUpdates via BotMux. Change the API base URL in your backend — zero other code changes.
Route messages between bots by text pattern, user ID, chat ID, or LLM decision. Forward, copy, or drop. Source-NAT return path keeps bidirectional conversations working — replies automatically flow back through the original bot.
Bridge Slack, webhooks, and external protocols to Telegram. Bidirectional — outgoing messages flow back automatically. Native Slack with HMAC-SHA256.
Describe routing rules in natural language. Works with any OpenAI-compatible API — OpenAI, Ollama, LM Studio. Runs after rule-based routes as a fallback.
Session cookies and Bearer API keys (bmx_ prefix). Two roles: admin and user. Per-bot access control. Passwords bcrypt-hashed, API keys SHA-256. Default admin auto-created on first run.
Message counts, hourly activity charts, weekly active users, top contributors. Full audit log of every admin action. User profile cards with aggregated data.
Transparent Telegram API proxy at /tgapi/. Captures outgoing messages that getUpdates never sees. WebP→PNG sticker conversion built-in.
Inline rendering of photos, videos, stickers, voice, audio. Image lightbox, video players. Interface in English and Russian with instant toggle.
Dark and light themes, responsive design, built for daily use.
BotMux sits between Telegram and your backends. It owns the polling loop and distributes updates however you need.
Telegram ──getUpdates──▶ BotMux (polling loop per bot) │ ├── Dashboard: trackChat() / saveMessage() ──▶ SQLite │ ├── Push Proxy: POST update ──▶ Backend URL │ │ │ └── webhook reply ──▶ Telegram API │ ├── Long Poll: enqueue ──▶ UpdateQueue (ring buffer) │ │ │ Backend ──getUpdates──▶ /tgapi/ ──▶ dequeue │ ├── Routing: match rules ──▶ send via Target Bot │ └── save mapping ──▶ route_mappings │ └── Bridges: Slack / Webhook ◀──▶ Telegram Backend ──sendMessage──▶ /tgapi/ (API proxy) ──▶ Telegram API │ └── capture response ──▶ saveMessage() ──▶ SQLite
Docker, binary, or go install. Pick your favorite.
| Flag | Default | Description |
|---|---|---|
| -token | "" | Bot token (or TELEGRAM_BOT_TOKEN) |
| -addr | :8080 | Listen address |
| -db | botdata.db | SQLite database path |
| -webhook | "" | Webhook URL for receiving updates |
| -tg-api | "" | Custom Telegram API URL |
| -demo | false | Demo mode (DEMO_MODE=true) |
| -version | false | Print version and exit |