tg-git-notifications-bot

Stop pinging people about code review.Хватит пинговать коллег по код‑ревью.

A self-hosted Telegram bot for GitLab and GitHub. It tells each person when a merge request needs their move — a review request, a reply to their comment, new commits after their review — and lets them reply, resolve or approve right from the chat.

Self-hosted Telegram-бот для GitLab и GitHub. Пишет каждому, когда в MR ход за ним: новое ревью, ответ на его комментарий, новые коммиты после его ревью — и даёт ответить, резолвнуть или заапрувить прямо из чата.

Open source under MIT. One container and SQLite; no public URL needed.Open source, MIT. Один контейнер и SQLite, публичный адрес не нужен.

your-workday.diff+4 −3
@@ every merge request, every day @@@@ каждый MR, каждый день @@
1−“Hey, did you see my MR?” in the team chat«Ну что, глянешь мой MR?» в общем чате
2−Refreshing GitLab to check for repliesF5 в GitLab — ответили или нет
3−A reply to your comment, noticed two days laterОтвет на твой комментарий, замеченный через два дня
1+🔔 New merge request to review from @alice🔔 Новый MR на ревью от @aliceApprove
2+↩️ @bob replied to your comment↩️ @bob ответил на твой комментарийReplyResolve
3+🔁 @alice pushed new commits after your review🔁 @alice запушила коммиты после твоего ревью
4+⏳ !42 has waited 24 h for reviewers⏳ !42 ждёт ревьюеров уже 24 чPing

Every merge request has a next move. The bot knows whose.В каждом MR есть следующий ход. Бот знает, чей.

Notifications are only useful when they mean “you’re up”. So the bot tracks, for each merge request, who should act next — and /inbox lists only the ones where it’s you.

Уведомление полезно, только когда оно значит «твоя очередь». Поэтому бот для каждого MR считает, кто должен действовать следующим, а /inbox показывает только те, где это ты.

  • Your moveХод за тобой You were asked to review, the author answered your thread, or pushed after your review. On your own MR: a reviewer asked something, there’s a conflict, or it’s approved and ready to merge. Тебя позвали на ревью, автор ответил в твоём треде или запушил после твоего ревью. В твоём MR: ревьюер что-то спросил, появился конфликт или всё одобрено и пора мёржить.
  • Their moveХод за другими You left comments and wait for the author, or your MR waits for reviewers. After 24 hours you get a Ping button. Ты оставил комментарии и ждёшь автора, или твой MR ждёт ревьюеров. Через сутки появится кнопка «Пингануть».
  • Nothing needed from youС тебя ничего You approved and nothing is open. Drafts stay quiet until they’re ready. Ты одобрил, открытых вопросов нет. Черновики молчат, пока их не снимут.
↩️ @bob replied to your comment ↩️ @bob ответил на твой комментарий !42 — Cache search results team/backend
Your comment: why a second query here?Твой комментарий: зачем здесь второй запрос?
Good catch — merged them into one, see the latest commit.Верно — объединил в один, смотри последний коммит.
10:42

What it doesЧто умеет

Doesn’t let a review slipНе даёт пропустить ревью

  • Review requests, including re-requests and drafts once they’re ready
  • Replies to your comments and mentions, quoted with context
  • New commits after your review — it’s your move again, no re-request click needed
  • On your MRs: approvals, change requests, conflicts, merged or closed
  • A daily nudge when an MR has waited on you for two days
  • Запросы ревью, в том числе повторные и черновики после снятия draft
  • Ответы на твои комментарии и упоминания — с цитатой
  • Новые коммиты после твоего ревью — ход снова твой, даже без re-request
  • По твоим MR: апрувы, запросы изменений, конфликты, влит или закрыт
  • Напоминание, если MR ждёт тебя уже два дня

Replaces the manual pingПингует вместо тебя

  • Your MR waits 24 hours for reviewers — one tap on Ping
  • Colleagues who use the bot get it in Telegram; everyone else as an MR comment
  • /invite gives a one-time link that skips admin approval
  • Твой MR сутки ждёт ревьюеров — одно нажатие на «Пингануть»
  • Коллеги, у которых есть бот, получают напоминание в Telegram, остальные — комментарием в MR
  • /invite — одноразовая ссылка, которая пускает без одобрения админа

Lets you act from the chatДействия прямо из чата

  • Reply in the thread, Resolve, Approve (with a confirmation), Snooze
  • /watch someone else’s MR by link: approvals, merged, closed
  • /mr and /my show everything you review and everything you own
  • Ответить в тред, Resolve, Approve (с подтверждением), Отложить
  • /watch — следить за чужим MR по ссылке: апрувы, влит, закрыт
  • /mr и /my — всё, что ты ревьюишь, и все твои MR

Stays quiet when it shouldМолчит, когда надо

  • Quiet hours and weekends, with one catch-up message in the morning
  • A daily summary at the time you choose, and an optional evening one
  • Five comments from one person arrive as one message
  • Bots and drafts are muted by default; /mute a whole project
  • MRs labelled blocker or hotfix still get through at night
  • Тихие часы и выходные — и одно сообщение со всем пропущенным утром
  • Ежедневная сводка в удобное время и, по желанию, вечерняя
  • Пять комментариев от одного человека — одно сообщение
  • Боты и черновики по умолчанию молчат; /mute глушит проект целиком
  • MR с метками blocker или hotfix доходят и ночью
/inboxWhere it’s your move, with unread countsГде ход за тобой и сколько непрочитанного
/mrTo review (not yet approved by you) and your ownНа ревью (ещё не одобренные тобой) и твои
/watch <link>Follow someone else’s MRСледить за чужим MR
/muteSilence a noisy projectЗаглушить шумный проект
/settingsNotification types, summaries, quiet hours, language, time zoneТипы уведомлений, сводки, тихие часы, язык, таймзона
/loadWho is holding reviews — numbers only, no titlesКто сколько ревью держит — только числа, без названий
/statsYour review week: requests, replies, mergesТвоя неделя в ревью: запросы, ответы, влитые MR
/statusIs it working: last check, errors, API limit leftРаботает ли бот: последний опрос, ошибки, остаток лимита API

Running in five minutes, on any machine with DockerПять минут на любой машине с Docker

  1. Create a botСоздай бота

    Talk to @BotFather and copy the token. It’s the only setting you need.

    Напиши @BotFather и скопируй токен — это единственная обязательная настройка.

  2. Start the containerЗапусти контейнер

    A VPS, a home server or a Raspberry Pi. It only makes outgoing requests, so it works behind NAT.

    VPS, домашний сервер или Raspberry Pi. Бот делает только исходящие запросы — работает и за NAT.

  3. Send /startОтправь /start

    The first person becomes admin. Connect GitLab (token with api) or GitHub (classic token with repo).

    Первый, кто напишет, становится админом. Подключи GitLab (токен с api) или GitHub (classic-токен с repo).

# one commandодной командой
$ docker run -d --name git-notify --restart unless-stopped \
    -e TELEGRAM_TOKEN=123456:ABC... \
    -v git-notify-data:/data \
    ghcr.io/isaevdimka/tg-git-notifications-bot:latest

# or on a server, with the Makefile (asks for the token, writes .env, starts)или на сервере через Makefile (спросит токен, создаст .env, запустит)
$ git clone https://github.com/IsaevDimka/tg-git-notifications-bot && cd tg-git-notifications-bot
$ make install

RequirementsТребования

  • Docker on Linux or macOS, amd64 or arm64; Compose v2 for make
  • About 50 MB RAM and 300 MB disk
  • Outbound HTTPS to Telegram and your Git host — no inbound ports
  • A bot token from @BotFather
  • Per user: GitLab token with api, or GitHub classic token with repo
  • Docker на Linux или macOS, amd64 или arm64; для make — Compose v2
  • Около 50 МБ RAM и 300 МБ диска
  • Исходящий HTTPS до Telegram и твоего Git-хостинга — входящие порты не нужны
  • Токен бота от @BotFather
  • Каждому пользователю: токен GitLab с api или classic-токен GitHub с repo

Everyday commandsКоманды на каждый день

make statusIs it running and healthyЗапущен ли и здоров ли
make logsFollow the logsЛоги в реальном времени
make restartRestart the botПерезапустить бота
make updateNewest version, data keptОбновиться, данные сохранятся
make backupDatabase and key to ./backupsБаза и ключ в ./backups
make downStop (make up to start again)Остановить (make up — запустить)

Your tokens stay on your serverТокены остаются на твоём сервере

  • Self-hostedСвой серверNo SaaS in the middle. Your code review never leaves your infrastructure.Никакого SaaS посередине. Данные ревью не покидают твою инфраструктуру.
  • Tokens encryptedТокены зашифрованыStored with a key that lives only in your data volume. The message with your token is deleted right away.Хранятся под ключом, который есть только в твоём томе с данными. Сообщение с токеном удаляется сразу.
  • No open portsБез открытых портовLong polling to Telegram and your Git host. Nothing listens for incoming connections.Long polling к Telegram и Git-хостингу. Ничего не слушает входящие соединения.
  • Invite-onlyТолько по приглашениюThe first user is the admin. Everyone else needs approval or an invite link.Первый пользователь — админ. Остальным нужно одобрение или ссылка-приглашение.
  • Private by defaultПриватно по умолчаниюCommands that show merge requests answer only in private chats.Команды со списками MR отвечают только в личке.
  • MIT licensedЛицензия MITRead the code, fork it, add your Git host. Russian and English interface.Читай код, форкай, добавляй свой Git-хостинг. Интерфейс на русском и английском.