A high-performance Rust bot that receives GitHub organization events (stars, issues, PRs, releases, discussions, etc.) and forwards them to a Telegram group with topic support. Beautiful HTML formatting, admin commands, and full Docker support.
- GitHub Events: Stars/Unstars, Issues (opened/closed/reopened/assigned), Pull Requests (opened/merged/closed), Push (with commit messages), Releases (with markdown notes), Workflow Runs, New Repositories, Discussions
- Telegram Topics: Each event goes to a specific topic in forum groups
- Beautiful UI: Rich HTML messages with emojis, bold text, and formatted code blocks
- User Linking: Link Telegram accounts to GitHub usernames for @mentions
- Admin Commands: Manage repos, link/unlink users, mute/unmute, discover org
- Repository Guard: Only monitor specific repositories
- User Muting: Silence notifications from specific users
- Auto-Discovery: Scan entire org for repos and contributors
- SQLite Database: Zero-config, file-based persistence
- Docker Ready: Multi-stage build, health check, restart policy
- Rust 1.78+ (for building)
- Docker & Docker Compose (for containerized deployment)
- A Telegram Bot Token
- A GitHub Personal Access Token (with
repoandorg:readscopes)
cp .env.example .env
# Edit .env with your valuesdocker compose up -d --buildcargo run --releaseOn your GitHub organization or repository:
- Go to Settings → Webhooks → Add webhook
- Payload URL:
https://your-server.com/api/webhook/github - Content type:
application/json - Secret: Same as
GITHUB_WEBHOOK_SECRETin.env - Events: Select "Send me everything"
- Add the first repo with
/addrepoin Telegram
| Variable | Required | Default | Description |
|---|---|---|---|
API_PORT |
No | 8080 |
HTTP server port |
BOT_TOKEN |
Yes | — | Telegram bot token from BotFather |
BOT_CHAT_ID |
Yes | — | Telegram group/channel numeric ID |
BOT_TOPIC_ID |
No | — | Topic/thread ID for forum groups |
BOT_ADMIN_IDS |
No | — | Comma-separated admin Telegram IDs |
BOT_POLLING |
No | true |
Use polling instead of webhook |
GITHUB_TOKEN |
Yes | — | GitHub personal access token |
GITHUB_ORG_NAME |
Yes | — | GitHub organization name |
GITHUB_WEBHOOK_SECRET |
Yes | — | GitHub webhook secret |
DB_FILE_PATH |
No | data/cyrus_events.sqlite |
SQLite database path |
/help— Show available commands/listrepos— List monitored repositories/listcontributors— List contributors/whoami— Show your linked GitHub account
/addrepo <url>— Add a repository to monitoring/removerepo <url>— Remove a repository/link <gh-user> [@tg-user]— Link GitHub to Telegram/unlink <@tg-user>— Unlink accounts/mute <gh-user>— Mute notifications from a user/unmute <gh-user>— Unmute a user/discover— Auto-discover org repos and contributors
GitHub Webhook → HTTP Server (Axum) → Event Parser → Guards (repo check, mute check)
↓
Telegram Bot (teloxide)
↓
Group/Topic Message
# Build
cargo build
# Run with auto-reload
cargo watch -x run
# Check
cargo checkMIT