DownVid
1000개 이상의 사이트를 지원하고, 인터페이스가 간결하며 macOS·Windows·Linux에서 모두 사용 가능
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A movie and TV series suggestion site. Choose movies or series, a mood, genres, era, length and minimum rating, and it rolls a shortlist for tonight. Reroll and it won't repeat itself. Also: a cinematic trending hero, browse tabs for trending, popular, new and top-rated, live search across movies and series, detail pages (where to watch, ratings gauge, cast, trailer, seasons, similar titles), optional accounts with multiple profiles and Google sign-in, and a watchlist plus watched list per profile.
Built with Next.js 16 (App Router), Tailwind CSS 4, Motion and lucide icons. Data from TMDB.
bun install
echo "TMDB_API_KEY=your_key_here" > .env.local
bun dev
Get a free key at https://www.themoviedb.org/settings/api. Either TMDB_API_KEY (v3 key) or TMDB_ACCESS_TOKEN (v4 read token) works.
Without a key the site runs on a bundled demo catalogue of 48 films and 22 series with generated poster art, so everything still works offline. A footer badge shows when demo data is in use.
Sign-in is optional. An account holds up to 5 profiles ("Who's watching?"), each with its own name, colour, default picker mode and watchlist. Passwords are hashed with scrypt; sessions are random tokens in an httpOnly cookie, stored hashed.
Data lives in a SQLite database through Prisma 7 (prisma/schema.prisma): users, profiles, sessions and watchlist items.
You don't need a database URL to run locally: the default is the file prisma/dev.db (git-ignored), created on first bun dev. To use a different database, set DATABASE_URL in .env.local. Both the app and the Prisma commands read it. It accepts a SQLite file (file:./prisma/other.db) or a hosted libsql database such as Turso (libsql://<db>-<org>.turso.io?authToken=<token>).
bun install generates the Prisma client (generated/prisma, git-ignored).bun dev / bun start apply pending migrations first (scripts/migrate.mjs), so a fresh database gets its tables on first run. For a local file this runs prisma migrate deploy; Prisma's migration engine doesn't accept Turso URLs, so for those the script applies prisma/migrations/*/migration.sql itself and records them in the same _prisma_migrations table. bun run db:deploy runs it on its own.bun run db:migrate creates a new migration after you change the schema. It always works against the local file; the next bun dev applies it to Turso.bun run db:studio opens Prisma Studio for a local file. Studio can't open Turso; use the Turso dashboard or turso db shell <db> instead.Signed-in profiles keep their watchlist in the database, so it follows the account across browsers. Signed-out visitors keep a list in browser storage; it moves into the profile the first time they sign in.
Set these in Vercel → Project → Settings → Environment Variables, then redeploy:
DATABASE_URL: your Turso URL including the token (libsql://<db>-<org>.turso.io?authToken=<token>). Or use Turso's pair TURSO_DATABASE_URL + TURSO_AUTH_TOKEN, which the Vercel–Turso integration sets for you. Required: Vercel's filesystem can't hold a SQLite file, so the build stops with an explanation if no database is set. A 401 in the build log means the token is missing or invalid; the log says which.TMDB_API_KEY (or TMDB_ACCESS_TOKEN): without it the site shows the demo catalogue, and "Where to watch" stays empty.build applies pending migrations to the database before next build, so schema changes reach Turso on each deploy. Posters load straight from TMDB's CDN (images.unoptimized), so they don't count against Vercel's image optimisation quota.
| Variable | What it turns on |
|---|---|
RESEND_API_KEY | Password-reset emails, sent through Resend. Without it, bun dev prints the reset link in the terminal and production logs an error instead of sending. |
EMAIL_FROM | Sender, e.g. Reelpick <[email protected]>. Needs a domain verified in Resend. Defaults to [email protected], which Resend only delivers to your own Resend account's address. |
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET | "Continue with Google" on the sign-in and sign-up pages. Hidden until both are set. |
APP_URL | The site's public address (e.g. https://reelpick.vercel.app) for links in emails. On Vercel it defaults to the production domain. |
CONTACT_EMAIL | Shown on the privacy page as who to ask about data. |
Google sign-in setup: in Google Cloud Console, create an OAuth client ID of type Web application and add these authorized redirect URIs: https://<your-domain>/auth/google/callback and, for local testing, http://localhost:3000/auth/google/callback. Copy the client ID and secret into the variables above. Preview deployments use their own domain, so Google sign-in only works on domains you've added there.
RateLimitHit), since serverless instances don't share memory; rows older than a day are pruned.GitHub Actions (.github/workflows/ci.yml) runs lint, type-check and a full build on every push to main and on pull requests, with no secrets needed.
lib/catalog.ts – all TMDB calls (server only), each with an automatic fallback to lib/fallback.tsapp/api/{pick,browse,search} – JSON endpoints used by the client componentscomponents/Picker.tsx – the "pick for me" flowlib/watchlist.ts – watchlist and watched-list hooks: database-backed for profiles, browser storage for signed-out visitorsprisma/schema.prisma, lib/db.ts – database schema and Prisma clientlib/auth.ts, app/actions/account.ts, app/actions/watchlist.ts – sessions, sign-in/profile/reset/delete actions and list writeslib/rate-limit.ts, lib/email.ts, app/auth/google/ – attempt limits, Resend emails, Google sign-inapp/globals.css – design tokens and the animated gradient background