A modern Progressive Web App for exploring the 17th Bengaluru International Film Festival (January 30 β February 6, 2026).
π Live: biffes26.vercel.app
- Browse by Category β 13 categories including Asian Cinema, World Cinema, Indian Panorama, Kannada Cinema, Critics' Week, Bio-Pics, Documentaries, and more
- Award Winners β Films grouped by prestigious festivals (Cannes, Venice, Berlin, Sundance, Toronto, Locarno, San SebastiΓ‘n, Karlovy Vary, National Film Awards India)
- A-Z Film List β Alphabetically sorted complete film catalog with letter quick-jump
- Smart Search β Instant search across titles, directors, countries, and languages with debounced dropdown results
- Rating Filters β Filter films by minimum IMDb, RT, or Letterboxd scores
- 8-Day Schedule β Complete festival timetable (Jan 30 β Feb 6) across all venues
- Multi-Venue Support β Cinepolis LULU Mall (5 screens), Rajkumar Bhavana, Suchitra Cinema, Open Air
- Live "Now Showing" β Real-time indicator for currently playing films (IST timezone aware)
- Today Auto-Select β Schedule automatically opens to current festival day
- View Modes β Toggle between compact timeline and detailed card views
- Venue Filtering β Filter schedule by specific cinema or screen
- Personal Watchlist β Build your must-watch list with one-tap add/remove
- Local-First Storage β Works offline with localStorage, syncs to cloud when online
- Share Codes β Generate 6-character codes to share your watchlist with friends
- Import Lists β Import shared watchlists via URL parameter (
?import=ABC123) - Schedule Integration β See your watchlist films mapped to screening times
- Conflict Detection β Visual warnings when watchlist films overlap in schedule
- Daily Picks β Films ranked by highest ratings for each festival day
- Multi-Source Scoring β Aggregates IMDb, RT, Metacritic, Letterboxd ratings with award bonuses
- Conflict-Free Planning β Greedy algorithm ensures no overlapping screenings
- Alternative Showings β Suggests other days/times if a recommended film conflicts
- Shareable β Share your daily picks via Web Share API or clipboard
- Bulk Add β One-click "Add All to Watchlist" for quick planning
- Festival Statistics β Total films, countries, languages, runtime analytics
- Geographic Distribution β Films by country/language bar charts
- Schedule Analytics β Screenings by venue, by day, peak hours
- Platform Stats β Active sync codes, watchlists, data sizes
- Category Breakdown β Film counts per category
- Multi-Platform Ratings β IMDb, Rotten Tomatoes, Metacritic, Letterboxd scores
- Clickable Links β Direct links to external rating pages
- Awards Display β Festival selections and prizes prominently shown
- Premiere Badges β World/Asia/India premiere indicators
- Full Details β Synopsis, cast, crew, runtime, language, country for every film
- Installable β Add to home screen on mobile/desktop
- Offline Support β Service worker caches essential assets and posters
- Fast Loading β Static site generation with incremental data updates
- Responsive Design β Mobile-first, works beautifully on all screen sizes
- Skip Navigation β Skip-to-content link for screen readers
- ARIA Labels β Proper labeling throughout the UI
- Keyboard Navigation β Full keyboard support including focus trapping in modals
- Reduced Motion β Respects
prefers-reduced-motionsetting
| Technology | Version | Purpose |
|---|---|---|
| Next.js | 16.1.6 | React framework with App Router, SSG |
| React | 19.x | UI library with Server Components |
| TypeScript | 5.x | Type safety |
| Tailwind CSS | 4.x | Utility-first styling |
| Framer Motion | 12.x | Smooth animations |
| @tanstack/react-virtual | 3.x | Virtualized lists for performance |
| @upstash/redis | 1.x | Serverless Redis for watchlist sync |
| Cheerio | 1.x | HTML parsing for web scraping |
| Sharp | 0.34 | Image optimization |
| Lucide React | 0.561 | Icon library |
git clone https://github.com/psam21/biffes26.git
cd biffes26
npm install
npm run devOpen http://localhost:3000 to view the app.
src/
βββ app/ # Next.js App Router
β βββ page.tsx # Home - categories & award winners
β βββ films/ # A-Z alphabetical film listing
β βββ schedule/ # 8-day festival schedule
β βββ recommendations/ # Top-rated daily picks
β βββ watchlist/ # Personal watchlist with schedule view
β βββ data/ # Festival statistics dashboard
β βββ category/[slug]/ # Dynamic category pages (13 categories)
β βββ film/[id]/ # Individual film detail pages (200+ films)
β βββ api/ # API routes
β βββ watchlist/ # Watchlist CRUD + sync codes
β βββ status/ # Health check endpoint
β βββ cron/refresh/ # Daily data refresh
βββ components/ # Reusable UI components
β βββ FilmDrawer.tsx # Full-screen film details panel
β βββ FilmCard.tsx # Film card with poster & ratings
β βββ VirtualizedFilmGrid.tsx # Performance-optimized grid
β βββ WatchlistButton.tsx # Add/remove watchlist button
β βββ ShareWatchlist.tsx # Movie ticket-styled share modal
β βββ RatingBadges.tsx # Compact multi-platform ratings
β βββ SiteHeader.tsx # Sticky header with festival info
β βββ SiteNav.tsx # Navigation pills
β βββ ... # 15+ components total
βββ data/ # Static JSON data
β βββ biffes_data.json # Festival info, categories, films
β βββ schedule_data.json # 8-day venue/screen schedule
βββ lib/ # Utilities & context
β βββ watchlist-context.tsx # React Context for watchlist state
β βββ recommendations.ts # Scoring algorithm
β βββ utils.ts # Helpers (cn, formatDuration, etc.)
β βββ upstash.ts # Redis client
βββ types/
βββ index.ts # TypeScript interfaces
scripts/ # Data pipeline tooling
βββ pipeline.ts # Main scraping orchestrator
βββ scrape-films.ts # biffes.org film scraper
βββ download-posters.ts # Poster image downloader
βββ optimize-images.ts # AVIF conversion
βββ ...
public/
βββ posters/ # Film poster images
βββ manifest.json # PWA manifest
βββ sw.js # Service worker
# Full pipeline (scrape + ratings + posters)
npm run pipeline
# Quick update (skip scraping, ratings only)
npm run pipeline:quick
# Individual steps
npm run download-posters # Download missing poster images
npm run optimize-images # Convert to AVIF format
npm run schedule:generate # Generate schedule from extracted data
npm run schedule:validate # Validate schedule consistency# Required for ratings
OMDB_API_KEY=your_key_here
# Required for cloud sync
UPSTASH_REDIS_REST_URL=https://xxx.upstash.io
UPSTASH_REDIS_REST_TOKEN=AXxx...
# Required for cron refresh
CRON_SECRET=your_secret_hereβββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β User Browser ββββββΆβ Vercel Edge ββββββΆβ Upstash Redis β
β (localStorage)βββββββ API Routes βββββββ (Serverless) β
βββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ
β β
β β Daily Cron
β βΌ
β ββββββββββββββββββββ
ββββββββββββββββΆβ biffes.org β
(fallback) β (Source) β
ββββββββββββββββββββ
- Local-first: Works offline, syncs when online
- Rate limiting: 60 requests/min per IP
- TTL: 30-day expiration for inactive watchlists
- Share codes: 6-character alphanumeric (32^6 = 1B+ combinations)
| Endpoint | Method | Description |
|---|---|---|
/api/watchlist |
GET/POST/DELETE | Watchlist CRUD operations |
/api/watchlist/sync |
POST | Create/retrieve share codes |
/api/status |
GET | Health check + stats |
/api/cron/refresh |
GET | Daily data refresh (cron) |
| Source | Data Provided |
|---|---|
| biffes.org | Films, categories, crew, synopses, awards |
| OMDb API | IMDb, Rotten Tomatoes, Metacritic ratings |
| Letterboxd | Community ratings (manual enrichment) |
| Official Schedule PDF | Venue, screen, and timing data |
- Dark Theme β Easy on the eyes for cinema lovers
- Amber Accents β Festival branding color (#eab308)
- Smooth Animations β Framer Motion page transitions
- Movie Ticket UI β Share modal styled like a film ticket
- Category Gradients β Unique color gradients per category
- Glass Morphism β Subtle backdrop blur effects
- Manifest: App name, icons, theme color, standalone display
- Service Worker:
- Static assets cached on install
- Posters: cache-first with background revalidation
- Navigation: network-first with cache fallback
- API: stale-while-revalidate
Deployed on Vercel with automatic deployments on push to main.
npm run build # Production build
npm run start # Start production serverMIT β Feel free to fork for your own film festival!
Built with β€οΈ for cinema lovers attending BIFFes 2026
Venues: LULU Mall Cinepolis β’ Rajkumar Bhavana β’ Suchitra Cinema