City events guide: events, cinema and leisure · Polotsk and Novopolotsk
Good Day Afisha
An events guide that gathers events on its own and queues them for review
The task
The goal was a shared events guide for Polotsk and Novopolotsk that collects events on its own from Telegram channels and websites. Visitors get current dates, cinema schedules, posters, venues and ticket links. The owner and manager get an admin panel to review publications and keep the automation in check.
Problems we solved
Announcements are scattered across different Telegram channels and websites — there is no single place that shows everything.
Collection from connected sources — public Telegram channels, websites and HUBL — into a single events catalogue; Schema.org JSON-LD markup on source sites is parsed directly.
An announcement is free text: the title, date, venue and price still have to be pulled out of it.
AI parsing of each post into structured JSON: title, date, time, city, venue, price and other fields, with the response structure validated. The parser version, source quotes and token usage are stored alongside.
General news, duplicates of the same event and wrong dates were slipping into the guide.
Duplicate detection that links several sources to one event, selection and auto-publish rules, a manual moderation queue, and year normalisation based on the publication or collection date.
Films with several showtimes landed in the wrong day-by-day listings.
Showtimes are stored and synced separately from the film, and filtering and publishing take the schedule into account.
Posters got cropped, disappeared after updates or failed to load at all.
Image proportions are preserved and posters are loaded into persistent storage — including images from HUBL, Telegram and TMDB.
The owner needs to see how the guide is filling up and what the audience cares about.
Admin sections with the processing history, an error log and token usage, plus counters for card views, "share" actions and click-throughs to tickets.
What we did
- Automatic collection from public Telegram channels and websites, with AI turning announcements into structured cards
- A site with a city switcher, search and filters by category, date and free events
- A secure admin panel: events, sources, venues, organisers, moderation and automation controls
- Event cards with a poster, description, venue, local time, age rating and price where the data exists
- Duplicate detection, several sources linked to one event, auto-publish rules and manual moderation
- An hourly collection-and-processing cycle, automatic closing of past events, and curated selections
- Ticket and map links, add-to-Google-Calendar, an .ics file for Apple Calendar and Outlook, sharing to Telegram and VK
- SEO: metadata, sitemap, robots.txt, Event and BreadcrumbList markup; web analytics and in-house action stats
- Next.js 16, PostgreSQL 17 and Prisma in Docker on a VPS; daily encrypted backups of the database and media to Google Drive
How it looks

