A self-hosted GitHub webhook server that sends repository events to messaging platforms. Built with Dart. Currently supports Telegram, with potential for Slack, Discord, or custom endpoints through the loggme package. This tool sends events to where your team communicates. You control which events to track and where they go.
demo_issue_tracked.mov
- Commit and push notifications
- Issue assignments and comments
- Tag creation events
- Multi-organization support
- Custom topic routing per repository
GitHub webhook → issue_tracker server → Telegram bot → Your channel
The server receives webhook events from GitHub, processes them, and routes messages to the correct Telegram channel and topic based on your configuration.
- Dart SDK (for local testing)
- Docker (for deployment)
- Telegram bot token
- GitHub personal access token
Talk to @BotFather on Telegram and create a new bot. Save the bot token. Add the bot as admin to your channel.
Channel ID: Forward a message from your channel to @userinfobot and copy the ID.
Topic ID: If using topics, check the topic URL to find the ID number.
Generate a personal access token from GitHub with repo scope.
Create a .env file:
BOT_TOKEN=your_telegram_bot_token
CHANNEL_ID=your_telegram_channel_id
TOPIC_ID=your_telegram_topic_ic
TOKEN=github_pat_11AP...
GITHUB_ACCESS_TOKEN=ghp_QE...
SERVER_URL=https://your-deployed-server.com
TELEGRAM_CHANNELS=base64_encoded_jsonThe TELEGRAM_CHANNELS variable is a base64-encoded JSON array:
[
{
"organisation": "YourOrg",
"channelID": "-100....9",
"accessToken": "ghp_yourToken"
}
]Encode this JSON to base64 and set it as TELEGRAM_CHANNELS.
Add topic ID to your repository description to route events to specific topics:
Repository description: My project #5
The #5 routes events to topic 5. Without this, events go to the default channel.
Build the Docker image:
docker build -t issue_tracker .Deploy to any Docker host (Render, Railway, Fly.io, etc).
In your repository settings:
- Go to Webhooks and add a new webhook
- Payload URL:
https://your-server.com - Content type:
application/json - Select events: Pushes, Issues, Issue comments, Create
- Add webhook
| Variable | Description |
|---|---|
BOT_TOKEN |
Telegram bot token |
CHANNEL_ID |
Default Telegram channel ID |
TOPIC_ID |
Default topic ID |
TOKEN |
GitHub personal access token |
GITHUB_ACCESS_TOKEN |
GitHub personal access token |
SERVER_URL |
Deployed server URL |
TELEGRAM_CHANNELS |
Base64-encoded org-to-channel mapping |
Enable // env = DotEnv()..load(); in bin/dart
dart pub get
dart run bin/main.dartYou will see
Fork the repository, make your changes, and submit a pull request.
Made with ❤️ by the Ofceab Studio