Bot que reposta seus commits do GitHub num chat/canal do Telegram.
Webhook do GitHub → Vercel serverless → Telegram Bot API.
Quando você dá git push num repo seu, esse bot recebe o webhook do GitHub, formata os commits bonitinho e manda pro seu Telegram (chat pessoal ou canal). Útil pra:
- Manter um devlog automático do seu trabalho
- Visualizar atividade entre múltiplos repos num lugar só
- Compartilhar progresso com mentores/amigos via canal público
- Histórico cronológico independente do GitHub (busca no Telegram)
Mirrors your GitHub commits to a Telegram chat/channel automatically via webhook.
git push Telegram chat/canal
│ ▲
▼ │
GitHub webhook (push event) │
│ HMAC SHA-256 signed │
▼ │
api/webhook.ts (Vercel serverless) │
├── verifySignature() — HMAC SHA-256, timingSafeEqual │
├── formatMessage() — MarkdownV2, máx 5 commits visíveis │
└── grammy Bot.api.sendMessage() ────────────────────────────────┘
- Abre
@BotFatherno Telegram - Manda
/newbot - Escolhe um nome (ex: "Meus Commits")
- Escolhe um username terminando em
_bot(ex:guuszz_commits_bot) - Copia o token que ele te entrega
Pra mandar pra você mesmo (DM):
- Manda qualquer mensagem pro bot que você criou
- Acessa
https://api.telegram.org/bot<TOKEN>/getUpdates - Procura o
"chat":{"id": ...}— esse é seu chat ID
Pra mandar pra um canal:
- Cria um canal (público ou privado)
- Adiciona o bot como admin com permissão "Post messages"
- Posta qualquer mensagem no canal
- Acessa o getUpdates igual acima
- Chat ID de canal é negativo, tipo
-1001234567890
git clone https://github.com/guuszz/telegram-commits-mirror
cd telegram-commits-mirror
npm install
# Setup Vercel
npx vercel link
npx vercel env add TELEGRAM_BOT_TOKEN production # paste o token do BotFather
npx vercel env add TELEGRAM_CHAT_ID production # paste o chat ID
npx vercel env add GITHUB_WEBHOOK_SECRET production # gera com: openssl rand -hex 32
# Deploy
npx vercel --prodAnota a URL que o Vercel te dá (ex: https://telegram-commits-mirror.vercel.app).
Em cada repo que você quer monitorar:
- Settings → Webhooks → Add webhook
- Payload URL:
https://<sua-url-vercel>/api/webhook - Content type:
application/json - Secret: mesmo valor que você gerou pra
GITHUB_WEBHOOK_SECRET - Which events? Just the
pushevent - Active: ✓
- Save
Bonus: usar GitHub CLI pra automatizar em massa:
URL="https://<sua-url>/api/webhook"
SECRET="<seu-secret>"
for repo in $(gh repo list guuszz --limit 100 --json name --jq '.[].name'); do
gh api -X POST "repos/guuszz/$repo/hooks" \
-f name=web \
-F active=true \
-f events[]=push \
-f config[url]="$URL" \
-f config[content_type]=json \
-f config[secret]="$SECRET"
donecp .env.example .env.local
# preenche .env.local com seus valores
npx vercel devEm outra aba, simula um push payload:
curl -X POST http://localhost:3000/api/webhook \
-H "Content-Type: application/json" \
-H "x-github-event: ping" \
-H "x-hub-signature-256: sha256=$(echo -n '{}' | openssl dgst -sha256 -hmac "<seu-secret>" -hex | cut -d' ' -f2)" \
-d '{}'- ✅ HMAC SHA-256 com
timingSafeEqualprevine timing attacks - ✅ Secret nunca é logado nem retornado em endpoint
- ✅ Token do Telegram só lido de env var (nunca commitado)
- ✅ Bot só envia em 1 chat configurado — usuário malicioso que descubra a URL não consegue spam em outro lugar
| Var | Obrigatória | Descrição |
|---|---|---|
TELEGRAM_BOT_TOKEN |
✅ | Token do bot via @BotFather |
TELEGRAM_CHAT_ID |
✅ | ID do chat/canal destino (negativo para canal) |
GITHUB_WEBHOOK_SECRET |
✅ | Secret do webhook do GitHub (random 32+ bytes hex) |
- Suporte a múltiplos chats (mapeamento por repo)
- Resumo diário/semanal em vez de cada commit
- Filtro por branch (só
main, ignorarwip/*) - Comando
/statsno bot pra ver totais por repo - Webhook signature verification em modo strict (rejeita tudo sem header)
MIT © Gustavo Oliveira