DownVid
This supports 1000+ websites, with a clean interface, across macOS / Windows / Linux.
AI translation
Discover, rate, and decide what to watch.
Translation pending
MediaTypeScript · PLpgSQLGitHub @gabepmalik27-aiOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A movie recommender web app
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗A movie discovery and recommendation web app built for CSC 371 at Wake Forest. WatchNow helps you discover, rate, and decide what to watch — you don't watch movies inside the app itself.
All five routes read a real movie catalog: a Supabase movies table
(supabase/migrations/0001_movies.sql) seeded from TMDB by
npm run seed (scripts/seed-movies.ts). Pages query it only through
lib/catalog.ts; posters load from TMDB's image CDN. Ratings, watched
state and the watchlist are still in-memory session state
(lib/user-state.tsx, no persistence — a refresh resets it).
There is intentionally no authentication and no real recommendation logic
yet. See CLAUDE.md for the full list of what's in and out of scope for
this phase, plus the design tokens and hard rules the UI follows.
CLAUDE.md — project guardrails: scope, design tokens, responsive
rules, accessibility requirements.docs/design-spec.pdf — the visual design specification (page-by-page
mockups for every view).Requires Node 20+.
git clone https://github.com/gabepmalik27-ai/watchNow.git
cd watchNow
npm install
cp .env.example .env.local # then fill in the four values
npm run check-env # verifies names/format and connectivity
npm run dev
First-time database setup:
supabase/migrations/0001_movies.sql into the Supabase SQL editor
and run it.npm run seed -- --limit 100 for a quick test, then npm run seed for
the full ~5,000-movie catalog. Reruns are safe (rows are upserted by id).Open http://localhost:3000. The app is localhost-only for this phase — there's no deployment or CI yet.
All matching and ranking is one Postgres function, search_catalog (supabase/migrations/0005_search.sql, reading normalized columns precomputed by 0006_search_precompute.sql), called through supabase.rpc by lib/catalog.ts. Titles, directors and cast are normalized (lowercase, accents and punctuation dropped, so "amelie" finds Amélie and "spider man" finds Spider-Man). A movie takes its best tier: exact title, title prefix, title word-start, title contains (3+ characters only), director word-start, cast word-start. Ties break on vote count. People searches return their movies with a "Directed by" / "Stars" hint. Only when nothing matches does a trigram-similarity fallback (threshold 0.3) offer close matches for typos.
npm run check-search runs the acceptance cases against the live catalog with the anon key. Run migrations 0005 and 0006 in the Supabase SQL editor before deploying, or search will fail (0006 keeps it under the anon statement timeout at catalog sizes past ~5,000).
If a search of 3+ characters finds nothing, or only typo guesses, /api/search asks TMDB (lib/catalog-admin.ts), saves up to 5 films with 20+ votes to public.movies permanently, and returns them in the same response. It has a 4 second budget and never fails the search. A query that imports nothing is remembered for 10 minutes, and identical concurrent requests share one TMDB call; both caches are per serverless instance and best-effort. Responses where an import was attempted are no-store and carry x-watchnow-imported: <n>. This is the only app code that uses SUPABASE_SERVICE_ROLE_KEY, so Vercel needs both SUPABASE_SERVICE_ROLE_KEY and TMDB_READ_TOKEN as server-only environment variables (Production and Preview).
localStoragemain is always working code. Nobody pushes to it directly.git checkout -b your-name/what-youre-doingmain before starting anything new: git checkout main && git pullNever commit API keys. Put them in a .env file (already gitignored) and
add the variable names to .env.example so everyone knows what they need.