An AI-powered film recommendation platform built around a user's Letterboxd history.
Users can import their viewing data through either manual Letterboxd CSV upload or Letterboxd RSS sync. The system builds a personalized taste profile, generates weekly and all-time viewing insights, and powers a chat-based recommender that suggests films based on both user taste and a broader movie corpus.
- AI film recommendation chat interface
- Letterboxd manual CSV import
- Letterboxd RSS sync for recurring updates
- Personalized taste profile generation
- Film Bank to store recommended films
- User feedback on recommendations
- Weekly stats report
- All-time stats report
- TMDB enrichment for metadata such as posters, overviews, cast, directors, keywords, and more
- React
- React Router
- Custom chat interface
- Local storage chat persistence
- Django
- Django REST Framework
- SimpleJWT authentication
- PostgreSQL
- OpenAI Responses API + file search / vector stores
- TMDB integration
- A user signs up and authenticates.
- The user imports Letterboxd data through:
- manual CSV upload
- or RSS sync
- Imported watch history is normalized into:
MovieUserWatchEvent
- Movies missing metadata are queued for TMDB enrichment.
- A user taste profile is built and indexed into a vector store.
- The user chats with the recommender.
- Recommendations are filtered against already watched and already recommended films.
- Recommended films are stored in the Film Bank.
- Feedback from the Film Bank can later influence future taste updates.
The chat recommender uses OpenAI with retrieval over:
- a global movie corpus
- an optional user taste vector store
The backend validates recommendation candidates against the local movie database before returning them to the frontend.
Users can bring in their Letterboxd history in two ways:
Supports:
- watched
- reviews
- watchlist
- likes / films
Users can link their Letterboxd username or profile URL. The app builds the RSS URL automatically and syncs recent public activity.
The Film Bank stores recommended movies for the user and allows:
- viewing previously recommended films
- dismissing a recommendation
- rating recommendation quality
- marking whether the user watched it
- adding optional written feedback
The app generates:
- weekly stats
- all-time stats
These use normalized watch data and include:
- recent watches
- top genres
- top actors
- top directors
- watch counts
- decade breakdowns
- total runtime watched
UserMovieMovieUserWatchEventFilmBankImportBatchGenrePersonMovieGenreMovieCastMovieCrew
Stores the central movie corpus and enriched metadata.
Stores user-specific state for a movie:
- rating
- review
- watch status
- watchlist state
- liked state
- watched date
- rewatch flag
Stores normalized watch events, especially useful for stats and repeated watch logging.
Stores recommendations shown to a user, plus user feedback.
server/
api/
management/
services/
tasks/
views/
serializer.py
models.py
client/
src/
components/
pages/
api/
context/