Case Study · Side Project · iOS & Android
Večeras
Noćas u gradu
An entertainment guide for Banja Luka. The app automatically pulls cinema repertoire from two multiplex cinemas, theater programs from two stages, and music event listings — enriched with global movie data and served to a React Native mobile app.
Overview
The Problem
Finding out what's on tonight in Banja Luka requires checking multiple separate websites — two cinema chains, two theater venues, and scattered music event listings — each with different formats and update cycles. There was no single place to see everything.
The Solution
A backend that runs on autopilot — scraping, enriching, and storing the data — paired with a polished mobile app that surfaces it all in one place. The system handles data freshness automatically; the app works offline after the first load.
Built AI-first
The entire mobile app was developed with agentic coding tools — AI writing the implementation while I drove the architecture, reviewed every change, and shipped it to production. The backend core was hand-built before these tools existed; most of what came after — scrapers, enrichment, admin, email reporting — was developed the same AI-first way. This project doubles as a live demonstration of how I work with AI day to day.
Product Demo
22 second walkthrough
A short promo showing the mobile experience and backend-driven content flow: cinema repertoire, theater schedules, music events, localized UI, and offline-friendly browsing.
Mobile App
Built with Expo SDK 54 and React Native. File-based routing via Expo Router v6, React Navigation Drawer for the tab structure, and React Native Paper for Material Design 3 components.
Cinema
Ongoing and upcoming movies for both Cineplexx and Cinestar, switchable by tap. Shows poster, genre, duration, 3rd party rating, and showtimes.
Theater
Full program for Narodno Pozorište RS and Jazavac Banja Luka. Schedule updated automatically via scraper and manual .docx import.
Music
Upcoming music events grouped by date, with venue detail pages including contact info, address, and Instagram links.
Favorites
Movies saved locally to device via MMKV — fast synchronous reads, no network required. Persists across app restarts.
Offline-first
React Query data persisted to MMKV (24 h cache). expo-image handles disk-level image caching. A network banner shows when offline.
Multi-language
Three locales: English, Serbian Latin, Serbian Cyrillic. Language, theme, and accent colour saved to device storage.
Backend & Architecture
NestJS 11 with a modular architecture. Each domain (cinema, theater, music, email) lives in its own module. Cinema data is scraped on a recurring schedule, enriched with metadata from external sources, and stored in PostgreSQL via a single atomic transaction. AdminJS provides backoffice management; Resend handles automated email reporting.
Cinema Module
Manages movies, showtimes, and crawl history for both Cineplexx and Cinestar. Exposes REST endpoints consumed by the mobile app.
Theater Module
Handles program schedules for Narodno Pozorište RS and Jazavac. Supports both automated scraping and manual .docx imports.
Music Module
Manages music events with venue detail pages. Events grouped by date with contact info, address, and social links.
Enrichment Module
Enriches each movie with metadata from TMDB and third-party rating sources. Images are uploaded to Cloudinary for CDN delivery.
Admin Module
AdminJS panel for managing movies, locking manually curated entries, and triggering data refreshes without touching the database directly.
Email Module
HTML reports dispatched after every scheduled run — success or failure — with diff highlights showing exactly what changed.
Want the full technical breakdown?
The detailed case study covers the 8-step crawl pipeline, third party web sites scraping strategy, hash-based change detection, concurrency control, and infrastructure setup.
Request the PDFTech Stack
Mobile (cinemaAI)
Backend (repertoar-server)
External APIs
Infrastructure

