A movie and TV discovery app for web, Android, and iOS.
Powered by TMDB API with optional Rotten Tomatoes scores via OMDb.
- Browse trending and popular movies & TV shows
- English and French interfaces at
/enand/fr, with localized TMDB metadata - Dedicated
/moviesand/tv-showsbrowse pages - Detailed movie and TV show pages (ratings, cast, seasons, similar, recommendations)
- Search with fuzzy matching, year-aware ranking, and live navbar suggestions
- Watch pages with Videasy VO, optional VF, subtitles, and manual HLS quality selection
- TV episode scroller with edge fade and arrow controls, episode overlay preview cards
- "Continue Watching" row backed by local play history
- Hero with auto-rotating featured titles, two-line expandable overview, and TMDB/Rotten Tomatoes ratings
- Lazy-loaded carousels and loading skeletons
- Cookie consent banner that gates play-history writes, with a
/privacypolicy page - Per-page SEO metadata via
generateMetadata - Image optimization (AVIF/WebP, TMDB-aligned responsive sizes, 30-day cache TTL)
- TMDB logos on watch pages
- Responsive dark theme (Tailwind v4, shadcn tokens, red accent)
- Expo SDK 57 mobile client with native navigation, local watchlist/history, and HLS playback
- Framework: Next.js 16 (Turbopack, App Router)
- UI: React 19, Tailwind CSS 4, shadcn tokens, Lucide icons
- Styling: clsx, tailwind-merge
- Data: TMDB (movies/TV), OMDb (optional Rotten Tomatoes scores)
- Player: hls.js with Videasy Yoru HQ/Neon fallback through enc-dec.app and
/api/hls - Language: TypeScript
- Testing: Bun test
- Mobile: Expo Router, React Native, expo-video, TanStack Query, AsyncStorage
- Bun
- A TMDB API key (set in
.env.local) - An optional OMDb API key (
OMDB_API_KEY) for Rotten Tomatoes scores
Without OMDB_API_KEY, detail pages continue showing TMDB ratings only. OMDb content is
licensed for non-commercial use; commercial deployments should use a licensed ratings
provider.
bun installbun devOpen http://localhost:3000 to view the app.
Unprefixed URLs redirect to /en or /fr from the browser language; use the
navbar language switch to change locale while keeping the current page.
Stream resolution uses the same-origin /api/resolve backend in development and production.
cp apps/mobile/.env.example apps/mobile/.env
bun run mobile:startThe Expo application uses the Next.js deployment as its backend. See
apps/mobile/README.md for development-build and EAS instructions.
app/ # Next.js App Router pages and layouts
[locale]/ # English/French pages
api/ # Server routes (search, stream resolution, HLS, episodes)
movie/[id]/ # Movie detail page
movies/ # Browse all movies
search/ # Search results
tv/[id]/ # TV show detail page
tv-shows/ # Browse all TV shows
watch/[id]/ # Movie watch page
watch/tv/[id] # TV episode watch page
privacy/ # Privacy policy
components/ # Reusable web UI components (Hero, Carousel, Player, etc.)
apps/mobile/ # Expo Router application for Android and iOS
lib/ # Utilities and TMDB API client
types/ # TypeScript type definitions
public/ # Static assets
tests/ # Playwright tests
b!nje uses your browser's localStorage to remember your watch history. No tracking, no
analytics, no third-party cookies. You can re-open the consent banner at any time from
the "Cookies" link in the footer. See /privacy for details.
MIT