Your personal movie, TV & book canon — ranked, journaled, and shared.
Search any title. Rank it S through D with head-to-head comparisons.
Write journal entries. Follow friends. See who agrees with you (and who doesn't).
- Tier-based ranking — S/A/B/C/D tiers with drag-and-drop. An adaptive comparison engine places new items via head-to-head matchups, not guesswork.
- Movies, TV & Books — Search TMDB for movies and TV seasons, Open Library for books. One unified search bar, three media types.
- Journal — Write entries about anything you've watched or read. Mood/vibe tags, cast mentions, friend tags, photo grids.
- Social feed — Follow friends, see their ranking activity, react, comment, and discover what your circle is watching.
- Taste DNA — Genre radar charts, tier distribution stats, and taste compatibility scores with friends.
- Groups & polls — Group rankings, watch parties, collaborative watchlists with voting, and movie polls.
- Smart suggestions — 5-pool system: similar titles, taste-based, trending, variety picks, and friend-influenced recommendations.
- Letterboxd import — Bring your existing rankings over from CSV.
- i18n — English and Chinese.
git clone https://github.com/BIBOYANG425/Movie_List.git
cd Movie_List
npm install
npm run devCreate a .env.local in the root:
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key
VITE_TMDB_API_KEY=your-tmdb-keyOpen localhost:5173 and start ranking.
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite |
| Styling | Tailwind CSS v4 with CSS custom properties |
| Database | Supabase (PostgreSQL + Row Level Security) |
| Auth | Supabase Auth (Google OAuth) |
| APIs | TMDB (movies & TV), Open Library (books) |
| Charts | Recharts |
| Icons | Lucide React |
| Fonts | Cormorant Garamond + Source Sans 3 |
| Testing | Vitest |
| Deployment | Vercel + Supabase Edge Functions |
pages/ # Route-level components
RankingAppPage.tsx # Main ranking board + all views
ProfilePage.tsx # User profile, journal, activity
LandingPage.tsx # Marketing landing page
components/
feed/ # Social feed cards, reactions, comments
journal/ # Journal editor, entries, mood selectors
layout/ # AppLayout, SpoolLogo
media/ # Add/detail modals, watchlist, ranking flow
ranking/ # TierRow, stats, genre radar
shared/ # Universal search, tier picker, toast, skeleton
social/ # Friends, discover, groups, polls, notifications
services/
tmdbService.ts # TMDB search & metadata
openLibraryService.ts # Open Library book search
spoolRankingEngine.ts # Adaptive head-to-head comparison engine
rankingAlgorithm.ts # Score computation, bracket classification
feedService.ts # Activity feed with engagement data
tasteService.ts # Taste compatibility, recommendations
journalService.ts # Journal CRUD
fuzzySearch.ts # Typo-tolerant search ("Incpetion" → "Inception")
supabase/migrations/ # SQL schema files (run in order)
i18n/ # en.ts, zh.ts
styles/ # Theme CSS variables
Run the migrations in supabase/migrations/ in order against your Supabase project:
supabase_schema.sql— Core tables (profiles, rankings, watchlist, follows)supabase_phase1_profile_patch.sql— Profile fields & avatar storagesupabase_phase2_activity_patch.sql— Activity eventssupabase_phase3_groups.sql— Group rankings, watch partiessupabase_phase4_engagement.sql— Notifications, lists, achievementssupabase_phase5_social_feed.sql— Feed mutessupabase_journal_entries.sql— Journal entries with FTSsupabase_fix_missing_tables.sql— review_likes, shared_watchlist_votessupabase_fix_critical_rls.sql— RLS policy tighteningsupabase_smart_suggestions.sql— Taste profiles, credits cachesupabase_emotional_data.sql— Agent sessionssupabase_spool_ranking.sql— Comparison logssupabase_spool_genre_ranking.sql— Genre ranking helperssupabase_tv_rankings.sql— TV show/season supportsupabase_watched_with.sql— "Watched with" friend taggingsupabase_book_rankings.sql— Book rankings & watchlist
- Create an OAuth client in Google Cloud Console (Web application type)
- Set redirect URI:
https://<your-supabase-ref>.supabase.co/auth/v1/callback - In Supabase Dashboard → Auth → Providers, enable Google with your client ID & secret
- Add allowed redirect URLs:
http://localhost:5173/auth/callbackand your production domain
npm test # run all tests
npm run test:watch # watch modenpm run build # outputs to dist/
npm run start # serves dist/ via Express on port 8080Spool uses a dark-first design with CSS custom properties:
- Background:
#0F1419— deep charcoal - Gold accent:
#D4C5B0— warm muted gold - Cool accent:
#8BA8BA— steel blue - Tier colors: Vibrant yellow (S), green (A), blue (B), zinc (C), red (D)
- Typography: Cormorant Garamond for headings, Source Sans 3 for body
Found a bug or have a feature idea? Open an issue or submit a PR.
Built with care by @BIBOYANG425