Components
Pages
Vue pages in app/pages/:
index.vue
Home recommendation feed. Features:
- Recommendation cards from
GET /api/recommend - Recommendation quota reads from
GET /api/recommend/quota refreshandgetNewrecommendation modes- Detail hydration through
GET /api/movies/:id - Auth-gated watched and My List actions
search.vue
Search and browse page. Features:
- Debounced title search via
GET /api/movies/search - Client-side genre, rating, sort, watched, and My List filters
- Movie details modal
- Add/remove watched and My List actions with auth prompt fallback
watched.vue
Watched history with filtering tools. Features:
- Search, genre, and runtime filters
- Multiple sort modes
- Remove watched movies (
DELETE /api/watched) - Metadata backfill for old entries missing genres/runtime
mylist.vue
Saved movie list page. Features:
- Reads from
GET /api/mylist - Removes items through
DELETE /api/mylist - Opens cached movie details
profile.vue
Profile/auth page. Displays:
AuthFormfor unauthenticated usersUserProfileHeaderfor authenticated usersWatchedMoviesGridwith modal details
reset-password.vue
Password reset flow page for Supabase password recovery links.
Components
Reusable Vue components in app/components/:
AuthForm.vue- Login/signup/reset entry UI with hCaptcha and server-backed signup through/api/auth/signupMovieCard.vue- Swipe-style recommendation cardMovieSearchCard.vue- Search result cardMovieDetails.vue- Modal with enriched movie metadataWatchedMoviesGrid.vue- Profile watched gridLoginPromptModal.vue- Auth-required prompt when trying to save while logged outBottomNav.vue- Main bottom navigationUserProfileHeader.vue- Profile header summary- Skeleton components for loading states (
SkeletonMovieCard,SkeletonSearchCard,SkeletonWatchedGrid)
Composables
Shared logic in app/composables/:
useAuth.ts
Session and authentication lifecycle:
- login/signup/logout
- signup posts to
/api/auth/signupinstead of calling Supabase signup directly from the browser - Google OAuth sign-in
- reset/update password
- existing-email signup responses switch the UI back to login while preserving the email field
- watched-state sync after auth state changes
useWatchedMovies.ts
Watched movie state management:
- local watched state
- pending watched queue in
localStorage - sync/add/remove through
/api/watched
useMyList.ts
My List state management:
- load current saved list from
/api/mylist - add and remove TMDB IDs through
/api/mylist
useRecommendationQuota.ts
Recommendation quota helper:
- load the current per-user daily quota from
/api/recommend/quota - reset to the default limit while signed out
useWatchedFilters.ts
Filtering and sorting logic for the watched page:
- title search
- genre filters
- runtime buckets
- sort options
- metadata enrichment for missing genres/runtime
useMovieDetails.ts
Movie data helper:
- cached movie detail fetch (
/api/movies/:id)
useSupabase.ts
Typed accessor for the Supabase client injected by the Nuxt plugin.
Layout
default.vue
Main app shell with bottom navigation and page slot.
Types
TypeScript definitions in app/types/:
movie.ts- TMDB response models, app movie models, watched/pending movie typesyoutube.ts- YouTube-related response typing used by the UI
App Entry
app.vue initializes auth and watched synchronization at application startup.