CineCircle is a community-oriented mobile application designed for Indian cinema fans to discover, discuss, and celebrate movies across Tollywood (Telugu), Kollywood (Tamil), Mollywood (Malayalam), Sandalwood (Kannada), and Bollywood (Hindi). The platform creates a centralized social hub for reviews, ratings, newsfeeds, and discussion threads, bringing together scattered conversations from Reddit, Letterboxd, and Instagram into one cohesive, engaging, and culturally-rooted experience.
Developed by Generate:
- Project Lead: Kaamil Thobani
- Technical Leads: Alison Ryan, Dylan Anctil
- Design Lead: Katherine Zhang
Tech Stack:
- Frontend: React Native (Expo) with TypeScript
- Backend: Node.js + Express + TypeScript
- Database: PostgreSQL (via Supabase)
- Authentication: Supabase Auth (JWT-based)
- File Storage: AWS S3
- Development: Docker + Docker Compose
- Movie Data: The Movie Database (TMDB) API
- Supabase-based authentication (email/password, OAuth)
- User profile management (username, bio, profile picture, display name)
- Onboarding flow for new users
- Language preferences (primary and secondary languages)
- Privacy settings (private accounts, spoiler warnings)
- Favorite genres and movies tracking
- Integration with TMDB API for movie data
- Movie search functionality (by title, language, genre)
- Movie details (title, description, ratings, release year, director)
- Local ratings vs. IMDB ratings
- Movie posters and images
- Language filtering (Telugu, Tamil, Malayalam, Kannada, Hindi)
- Posts: Create short-form and long-form posts about movies
- Image uploads (multiple images per post)
- Spoiler tags
- Custom tags
- Reposting functionality
- Comments: Nested comment threads on posts
- Reactions: Four reaction types (SPICY, STAR_STUDDED, THOUGHT_PROVOKING, BLOCKBUSTER)
- Comment Likes: Like individual comments
- User Following: Follow/unfollow other users
- Activity Feed: Personalized feed of posts from followed users
- Star ratings (1-5 stars) for movies
- Written reviews with tags
- Rating aggregation and vote counts
- Personal rating history
- Create and discover local cinema events
- Event details (title, time, description, genre, cost, occasion)
- Location-based events (latitude/longitude)
- RSVP system (attending/interested/not attending)
- Event images
- Saved events and attended events tracking
- "To Watch" bookmarks
- "Watched" bookmarks
- Personal movie lists
- OpenAI-powered translation for user-generated content
- Support for multiple South Indian languages
- Unified search across movies, users, and posts
- Filter by content type
- Language-specific search
- Backend types automatically generated to frontend
- OpenAPI 3.0 specification generation
- Type-safe API contracts
- Eliminates manual type duplication
- Containerized backend with hot reload
- Local PostgreSQL database
- Production sync capability (optional)
- Consistent development environment
- Sync production schema and data to local development
- One-command database replication
- Prisma-based schema management
- AWS S3 integration with organized folder structure
- Base64 image upload support
- Multiple image uploads per post
- Profile picture uploads
- Event image uploads
- Jest test suite
- Unit tests for services
- API integration tests
- Test coverage reporting
- Scalar API documentation (auto-generated)
- Available at
/api/docswhen backend is running
The original charter outlined a vision for CineCircle as a fan-first, celebration-driven platform for Indian cinema. Here's how the implementation compares to the charter's vision:
1. Regional Language Support
- Charter specified: Telugu, Tamil, Malayalam, Kannada, and Hindi tabs
- Implementation: Language filtering and preferences for all five languages
- Users can set primary and secondary language preferences
2. Personalized Newsfeed ("CineFeed")
- Charter specified: Reviews, ratings, and trending updates
- Implementation: Activity feed with posts from followed users, ratings, and reviews
- Chronological feed of content from user's network
3. Ratings & Reviews
- Charter specified: User ratings and reviews
- Implementation: Star ratings (1-5), written reviews with tags, vote counts
- Dual rating system (local community + IMDB)
4. Friends & Social Features
- Charter specified: Friends-only feeds and customizable profiles
- Implementation: Follow system, user profiles with bios, profile pictures, privacy settings
- Private account options
5. Cultural Authenticity
- Charter specified: Reactions like "Claps," "Star Power," "Encore," and "Masala"
- Implementation: Four reaction types: SPICY, STAR_STUDDED, THOUGHT_PROVOKING, BLOCKBUSTER
- Custom reactions that reflect cinema fan culture
1. Forum-Style Discussion Threads
- Charter specified: Forum threads with moderation
- Implementation: Post-based discussions with nested comments (modified approach)
- Difference: Uses a social media post model rather than traditional forums
- Rationale: More engaging and familiar UX for mobile users
2. News & Updates Integration
- Charter specified: Curated industry news, trailers, box office updates
- Implementation: Not implemented
- Difference: Focus on user-generated content only
- Rationale: Scope prioritized social features; news integration would require content curation team
3. Music Integration
- Charter specified: Music features (mentioned in charter)
- Implementation: Not implemented
- Rationale: Prioritized core social and discovery features first
4. Gamification (Achievements, Challenges, Leaderboards)
- Charter specified: Achievements, challenges, leaderboards
- Implementation: Not implemented
- Rationale: MVP focused on core social features; gamification is V2 feature
5. Content Moderation
- Charter specified: Moderation to reduce spam and hate speech
- Implementation: Basic structure in place, but no active moderation tools
- Difference: No automated moderation, reporting system, or admin tools
- Rationale: Requires additional infrastructure; planned for post-launch
1. Local Events System
- Not in charter: Full event discovery and RSVP system
- Implementation: Create events, RSVP (attending/interested), location-based discovery
- Rationale: Extends community engagement beyond digital discussions
2. Bookmarks & Watchlists
- Not in charter: "To Watch" and "Watched" bookmarks
- Implementation: Personal movie lists for tracking viewing
- Rationale: Common user need for movie discovery apps
3. Auto-Generated Type System
- Not in charter: Automated backend-to-frontend type generation
- Implementation: OpenAPI-based type generation pipeline
- Rationale: Technical excellence and maintainability
4. Docker Development Environment
- Not in charter: Containerized development with production sync
- Implementation: Full Docker setup with hot reload and database sync
- Rationale: Team consistency and onboarding efficiency
5. Translation Service
- Not in charter: AI-powered translation
- Implementation: OpenAI integration for translating user content
- Rationale: Supports cross-language community engagement
6. Reposting
- Not in charter: Repost functionality
- Implementation: Users can repost others' content (like Twitter/X)
- Rationale: Amplifies content discovery and engagement
| Charter Feature | Status | Notes |
|---|---|---|
| Regional language tabs | Implemented | All 5 languages supported |
| Personalized feed | Implemented | Activity feed from followed users |
| Ratings & reviews | Implemented | Star ratings + written reviews |
| Friends/social features | Implemented | Follow system + profiles |
| Cultural reactions | Implemented | 4 custom reaction types |
| Forum discussions | Modified | Post-based instead of forum threads |
| News integration | Not implemented | User content only |
| Music features | Not implemented | Scope prioritization |
| Gamification | Not implemented | |
| Content moderation | Partial | Structure only, no active tools |
| Local events | Bonus feature | Full RSVP system |
| Bookmarks/watchlists | Bonus feature | Personal movie tracking |
| Translation | Bonus feature | AI-powered |
Database Choice: Supabase (PostgreSQL)
- Provides authentication and database capabilities
- Multi-schema approach (
auth+public) - Scalable and production-ready
Image Storage: AWS S3
- Organized folder structure (posts/, profiles/, movies/, events/)
- Base64 upload support for React Native
- Scalable and cost-effective
Movie Data: TMDB API
- Comprehensive movie information
- Dual rating system (community/CineCircle + IMDB)
- Regular data updates
Development: Docker-First
- Consistent development environment
- Production database sync capability
- JWT tokens issued by Supabase
- Token verification happens in
backend/src/middleware/auth.ts - Frontend stores tokens via Supabase client
- User ID extracted from JWT and attached to requests
Important: Prisma database types don't always match API types. Controllers must transform data:
// Example from backend/src/controllers/tmdb.ts
export function mapMovieDbToApi(dbMovie: Prisma.movieGetPayload<{}>): Movie {
return {
movieId: dbMovie.movieId,
title: dbMovie.title,
imdbRating: dbMovie.imdbRating != null ? Number(dbMovie.imdbRating) : null,
languages: dbMovie.languages ? (dbMovie.languages as string[]) : null,
// ... more transformations
};
}When you modify backend types:
- Edit
backend/src/types/models.tsorapiTypes.ts - Run
npm run backend:typesfrom project root - Frontend types automatically update in
frontend/types/api-generated.ts - No manual copying required!
- Frontend converts image to base64
- Sends to backend with
{ base64, name, fileType } - Backend uploads to S3 using
sendFilesToS3() - Returns public S3 URL
- URL stored in database
- Local development uses PostgreSQL in Docker
- Production sync (optional) copies schema + data from Supabase
- Controlled by
SYNC_FROM_PRODUCTIONenv variable - Sync happens automatically on container startup if enabled
The feed is currently a simple chronological feed of posts from followed users. Located in backend/src/controllers/feed.ts.
- Movie data fetched from TMDB API
- Cached in local database (
movietable) - Import script available:
npm run import:tmdb(inside container) - TMDB IDs stored for reference
- Service: https://supabase.com
- What it provides: PostgreSQL database, authentication, real-time subscriptions
- Keys needed:
SUPABASE_URL- Your project URLSUPABASE_ANON_KEY- Public anonymous keySUPABASE_JWT_SECRET- JWT signing secretSUPABASE_SERVICE_ROLE_KEY- Admin key (backend only)DATABASE_URL- Connection string (pooler)DIRECT_URL- Direct connection string
- Service: https://aws.amazon.com/s3/
- What it provides: Image and file storage
- Keys needed:
AWS_ACCESS_KEY_ID- IAM user access keyAWS_SECRET_ACCESS_KEY- IAM user secret keyAWS_REGION- S3 bucket region (e.g.,us-east-1)AWS_BUCKET_NAME- Your S3 bucket name
- Service: https://www.themoviedb.org/settings/api
- What it provides: Movie information, posters, ratings
- Keys needed:
TMDB_API_TOKEN- API Read Access Token (v4 auth)
- Service: https://platform.openai.com/api-keys
- What it provides: AI-powered translation
- Keys needed:
OPENAI_API_KEY- API key
- Service: https://developers.facebook.com/docs/whatsapp
- What it provides: WhatsApp notifications (future feature)
- Keys needed:
WHATSAPP_ACCESS_TOKENWHATSAPP_PHONE_NUMBER_IDSYSTEM_USER_TOKEN
See .env.example files created below for complete reference.
- Go to https://supabase.com
- Create a new project
- Choose a region close to your users
- Save your database password
From your Supabase dashboard:
- Go to Settings → Database
- Copy the Connection Pooling URL (this is your
DATABASE_URL) - Copy the Direct Connection URL (this is your
DIRECT_URL) - Format:
postgresql://postgres.[project-ref]:[password]@[host]:[port]/postgres
From your Supabase dashboard:
- Go to Settings → API
- Copy
URL→ This is yourSUPABASE_URL - Copy
anon publickey → This is yourSUPABASE_ANON_KEY - Copy
service_rolekey → This is yourSUPABASE_SERVICE_ROLE_KEY - Go to Settings → API → JWT Settings
- Copy
JWT Secret→ This is yourSUPABASE_JWT_SECRET
From your project root:
# Start the backend container
npm run backend:start
# Get into the container shell
npm run backend:shell
# Push the Prisma schema to your Supabase database
npx prisma db push
# Generate Prisma client
npx prisma generateThis will create all tables, relationships, and enums in your Supabase database.
If you have seed data:
# Inside container shell
npm run db:seedThe database uses two schemas:
authschema: Managed by Supabase (users, sessions, tokens, etc.)publicschema: Your application data (posts, movies, events, etc.)
Key tables in public schema:
UserProfile- User profiles and preferencesPost- User posts about moviesComment- Comments on postsRating- Movie ratingsmovie- Movie information (from TMDB)local_event- Local cinema eventsevent_rsvp- Event attendanceUserFollow- Follow relationshipsPostReaction- Reactions to postsCommentLike- Likes on comments
- Prisma Studio: Run
npx prisma studioinside container (opens at http://localhost:5555) - Supabase Dashboard: Use the Table Editor in your Supabase project
- Docker Desktop installed and running
- Node.js 18+ (for root-level scripts)
- Git
git clone <your-repo-url>
cd cinecirclenpm installCreate .env in project root:
# Copy from .env.example
cp .env.example .envCreate backend/.env:
# Copy from backend/.env.example
cp backend/.env.example backend/.envCreate frontend/.env:
# Copy from frontend/.env.example
cp frontend/.env.example frontend/.envEdit the .env files with your actual API keys and credentials (see .env.example files for reference).
Critical variables to set:
- All Supabase credentials
- AWS S3 credentials
- TMDB API token
npm run backend:startThis will:
- Start PostgreSQL container
- Start backend API container
- Apply database schema (if first run)
- Start API server at http://localhost:3001
Verify backend is running:
curl http://localhost:3001/api/ping
# Should return: {"message":"pong"}npm run frontend:installnpm run frontend:startThis starts Expo dev server. You can then:
- Press
ifor iOS simulator - Press
afor Android emulator - Scan QR code with Expo Go app on physical device
# View logs
npm run backend:logs
# Get into container shell
npm run backend:shell
# Run tests
npm run backend:test
# Generate frontend types after backend changes
npm run backend:types
# Stop backend
npm run backend:stop
# Full cleanup (removes volumes)
npm run backend:clean# Start dev server
npm run frontend:start
# Run on iOS
npm run frontend:ios
# Run on Android
npm run frontend:android
# Clean rebuild
npm run frontend:clean# Get into container shell first
npm run backend:shell
# Inside container:
npx prisma studio # Open database GUI
npx prisma db push # Push schema changes
npx prisma generate # Regenerate client
npm run db:sync # Re-sync from production (if configured)- Solution: Check Docker Desktop is running
- Solution: Check port 3001 isn't already in use
- Solution: Run
npm run backend:cleanand try again
- Solution: Verify
DATABASE_URLandDIRECT_URLare correct - Solution: Check Supabase project is running
- Solution: Ensure database password is URL-encoded (use
%23for#, etc.)
- Solution: Check
API_BASE_URLinfrontend/.env - Solution: For physical devices, use your computer's local IP (not
localhost) - Solution: Ensure backend is running (
curl http://localhost:3001/api/ping)
- Solution: Run
npm run backend:typesto regenerate types - Solution: Restart TypeScript server in your IDE
- Solution: Verify AWS credentials are correct
- Solution: Check S3 bucket exists and has correct permissions
- Solution: Ensure bucket policy allows public read access for uploaded images
Project Lead
- Kaamil Thobani - thobani.k@northeastern.edu
Technical Leads
- Alison Ryan
- Dylan Anctil - anctil.d@northeastern.edu
Design Lead
- Katherine Zhang - zhang.kath@northeastern.edu