So no Valorant match slips by: a personal Telegram bot that watches vlr.gg.
It follows chosen tournaments and sends Turkish notifications 30 minutes before a match, when it goes live and when it ends. Live scores on demand. It runs 24/7 on Google Cloud's free tier.
The problem
vlr.gg is the main source for pro Valorant matches, but it has no notifications and no official API. Not missing a match means checking the site over and over.
The solution
The bot checks chosen tournaments at smart intervals without straining the site, keeps changes in its own database and only writes when something is actually new.
When it speaks up
The bot writes in Turkish. The screenshots below are real notifications, translated into English for this page.
- Tournament follow:
/turnuvalarlists ongoing and upcoming events as buttons; one tap follows or unfollows. - Daily digest: today's matches at 10:00 every morning; silent when there are none.
- Reminder and live: a reminder 30 minutes before, a ping when the match goes live.
- Result: series score with map-by-map scores.
- Self-monitoring: if vlr.gg's page layout changes or a problem repeats, it warns its owner, then reports "✅ Düzeldi" once fixed.
/canli: the score, on demand
It fetches the current score of followed live matches: finished maps plus the round score of the map in play. 🔄 Yenile updates the message in place. Scores are only fetched when asked; a 30-second cache keeps repeated taps off the site, and even when vlr.gg is slow the reply arrives within 8 seconds.
🔴 G2 Esports 1–0 Team Liquid
Valorant Champions 2026 — Decider (C) · Bo3
✅ Split 13–10
▶️ Abyss 9–6 (oynanıyor)
🔗 Maç sayfası
🕐 12:42 itibarıyla
Architecture
One Python process inside Docker. The scraper sits behind an interface, so another data source can be plugged in. The decision logic (the tracker) knows nothing about Telegram and is built from pure functions, which keeps it easy to test.
- vlr.ggHTML + ICS
- ScraperMatchSource
- Trackerupcoming → live → completed
- SQLitematches, notification flags, health
- Notifier
- Telegram
JobQueue smart polling · daily digest
Engineering highlights
Reliable data without an official API
A custom scraper for vlr.gg. If the page layout changes, tests written against saved real pages catch it, and in production the bot warns its owner. To stay light on the site it waits at least 1 second between requests, backs off further on errors and identifies itself with its own User-Agent.
The time-zone trap
The match page's data-utc-ts field isn't UTC despite its name; it's New York time, shifting with daylight saving. The list page prints times by the visitor's location, so when the server moved to the US the times drifted to Chicago. The calendar feed (ICS), which gives true UTC, became the source of truth; the finding was confirmed by three independent sources and pinned with tests.
No notification is ever sent twice
Each notification type has a flag in the database, set only after Telegram confirms delivery. During outages, retries back off from 60 seconds to 15 minutes; if the bot is down at digest time, the digest is caught up on restart. Server restart tests produced no duplicates.
Zero-cost hosting
The pitfalls of Google Cloud's free tier were handled one by one: a paid default disk, a misleading price estimate, a budget alert that never fires during the trial because it counts trial credits. With no match near, vlr.gg is checked every 30 minutes; near or during a match, every 1–2 minutes. Result: a net ~₺0.02 over 11 days.
By the numbers
An unofficial hobby project, not affiliated with vlr.gg or Riot Games. Valorant is a trademark of Riot Games, Inc. The bot is personal and only replies to its owner; the source code is not public.
Need a bot or automation built around your work?
Let's automate the repetitive checking, notifying or data gathering together.