Distributed microservice platform for tracking web resource updates and delivering notifications via Telegram.
LinkTracker is a Telegram bot that monitors GitHub repositories and Stack Overflow questions for new activity and sends you real-time notifications. Under the hood it is a distributed microservice system with intelligent update processing: spam filtering, summarization, and priority ranking before anything reaches your Telegram chat.
User (Telegram)
↓
Telegram Bot API
↓
┌─────────────────┐
│ Bot Service │ ← receives commands, sends notifications
└────────▲────────┘
│
link.processed-updates (Kafka)
│
┌────────┴────────┐
│ AI Agent │ ← filters spam, summarizes, prioritizes
│ Service │
└────────▲────────┘
│
link.raw-updates (Kafka)
│
┌────────┴────────┐
│ Scrapper │ ← polls GitHub & Stack Overflow
│ Service │
└─────────────────┘
| Service | Port | Responsibility |
|---|---|---|
| Bot | 8080 | Telegram interface — accepts commands, delivers notifications |
| Scrapper | 8083 | Polls GitHub / Stack Overflow, publishes raw events to Kafka |
| AI Agent | — | Filters, summarizes and prioritizes events; publishes processed events |
| Layer | Technology |
|---|---|
| Runtime | Java 25, Spring Boot 4.x |
| Database | PostgreSQL 18 + Liquibase migrations |
| Cache | Redis 8 (with TTL-based invalidation) |
| Messaging | Apache Kafka 4 + Confluent Schema Registry (Avro) |
| Resilience | Resilience4j — retry, circuit breaker, rate limiter |
| Testing | Testcontainers (Kafka, PostgreSQL, Redis) |
| Build | Maven 3.9+ with Spotless, SpotBugs, PMD |
- JDK 25+
- Docker & Docker Compose
- Maven 3.9.12+ (or use the bundled
mvnw)
# Unix / macOS / WSL
./mvnw clean verify
# Windows
mvnw.cmd clean verifySecrets are stored in .env files at each module root (never commit them).
bot/.env
TELEGRAM_TOKEN=<your-bot-token>
SCRAPPER_BASE_URL=http://localhost:8083
KAFKA_BOOTSTRAP_SERVERS=localhost:9092scrapper/.env
SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5433/scrapper
SPRING_DATASOURCE_USERNAME=postgres
SPRING_DATASOURCE_PASSWORD=postgres
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=password
KAFKA_BOOTSTRAP_SERVERS=localhost:9092
GITHUB_TOKEN=<your-github-token>
STACKOVERFLOW_KEY=<your-stackoverflow-key>
STACKOVERFLOW_ACCESS_KEY=<your-stackoverflow-access-key># Format code
./mvnw spotless:apply
# Run tests only
./mvnw test
# Run all linters
./mvnw clean compile spotless:check modernizer:modernizer spotbugs:check pmd:check pmd:cpd-check
# Dependency tree
./mvnw dependency:tree| Command | Description |
|---|---|
/start |
Register and get a welcome message |
/track <url> [tags...] |
Start tracking a link |
/untrack <url> |
Stop tracking a link |
/list [tag] |
Show all tracked links (optionally filtered by tag) |
/help |
Show available commands |
link-tracker/
├── bot/ # Telegram Bot service
├── scrapper/ # Link monitoring service
├── ai-agent/ # Intelligent processing service
├── build-report-aggregate/ # Build report aggregation
├── pom.xml # Parent POM
├── pmd.xml # PMD rules
└── spotbugs-excludes.xml # SpotBugs exclusions
- User adds a link via Telegram (
/track) - Scrapper polls the source periodically
- On new activity → raw event published to
link.raw-updates - AI Agent filters spam, summarizes long content, assigns priority
- Processed event published to
link.processed-updates - Bot receives the event and sends a formatted Telegram message
LinkTracker — Telegram-бот для мониторинга GitHub-репозиториев и вопросов на Stack Overflow. При появлении новой активности система отправляет персональные уведомления в ваш Telegram-чат. Это распределённая микросервисная платформа с интеллектуальной обработкой обновлений: фильтрация спама, суммаризация и приоритизация происходят до того, как что-либо достигнет пользователя.
Пользователь (Telegram)
↓
Telegram Bot API
↓
┌───────────────────┐
│ Bot Service │ ← принимает команды, отправляет уведомления
└─────────▲─────────┘
│
link.processed-updates (Kafka)
│
┌─────────┴─────────┐
│ AI Agent │ ← фильтрует спам, суммаризирует, приоритизирует
│ Service │
└─────────▲─────────┘
│
link.raw-updates (Kafka)
│
┌─────────┴─────────┐
│ Scrapper │ ← опрашивает GitHub и Stack Overflow
│ Service │
└───────────────────┘
| Сервис | Порт | Ответственность |
|---|---|---|
| Bot | 8080 | Telegram-интерфейс — принимает команды, доставляет уведомления |
| Scrapper | 8083 | Опрашивает GitHub / Stack Overflow, публикует сырые события в Kafka |
| AI Agent | — | Фильтрует, суммаризирует и приоритизирует; публикует обработанные события |
| Слой | Технология |
|---|---|
| Runtime | Java 25, Spring Boot 4.x |
| База данных | PostgreSQL 18 + Liquibase миграции |
| Кэш | Redis 8 (TTL-инвалидация) |
| Очередь сообщений | Apache Kafka 4 + Confluent Schema Registry (Avro) |
| Отказоустойчивость | Resilience4j — retry, circuit breaker, rate limiter |
| Тестирование | Testcontainers (Kafka, PostgreSQL, Redis) |
| Сборка | Maven 3.9+ со Spotless, SpotBugs, PMD |
- JDK 25+
- Docker & Docker Compose
- Maven 3.9.12+ (или встроенный
mvnw)
# Unix / macOS / WSL
./mvnw clean verify
# Windows
mvnw.cmd clean verifyСекреты хранятся в .env-файлах в корне каждого модуля (не коммитить в репозиторий).
bot/.env
TELEGRAM_TOKEN=<токен-бота>
SCRAPPER_BASE_URL=http://localhost:8083
KAFKA_BOOTSTRAP_SERVERS=localhost:9092scrapper/.env
SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5433/scrapper
SPRING_DATASOURCE_USERNAME=postgres
SPRING_DATASOURCE_PASSWORD=postgres
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=password
KAFKA_BOOTSTRAP_SERVERS=localhost:9092
GITHUB_TOKEN=<токен-github>
STACKOVERFLOW_KEY=<ключ-stackoverflow>
STACKOVERFLOW_ACCESS_KEY=<access-key-stackoverflow># Автоформатирование кода
./mvnw spotless:apply
# Только тесты
./mvnw test
# Все линтеры
./mvnw clean compile spotless:check modernizer:modernizer spotbugs:check pmd:check pmd:cpd-check
# Дерево зависимостей
./mvnw dependency:tree| Команда | Описание |
|---|---|
/start |
Регистрация и приветственное сообщение |
/track <url> [теги...] |
Начать отслеживание ссылки |
/untrack <url> |
Прекратить отслеживание ссылки |
/list [тег] |
Показать список ссылок (опционально — с фильтром по тегу) |
/help |
Показать доступные команды |
link-tracker/
├── bot/ # Сервис Telegram-бота
├── scrapper/ # Сервис мониторинга ссылок
├── ai-agent/ # Сервис интеллектуальной обработки
├── build-report-aggregate/ # Агрегация отчётов сборки
├── pom.xml # Родительский POM
├── pmd.xml # Правила PMD
└── spotbugs-excludes.xml # Исключения SpotBugs
- Пользователь добавляет ссылку через Telegram (
/track) - Scrapper периодически опрашивает источник
- При новой активности → сырое событие публикуется в
link.raw-updates - AI Agent фильтрует спам, суммаризирует длинный контент, назначает приоритет
- Обработанное событие публикуется в
link.processed-updates - Bot получает событие и отправляет форматированное сообщение в Telegram