Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证A live, multiplayer, AI-hosted Family Feud party game: TV screen + phones as controllers. Next.js, Vercel AI SDK + AI Gateway, Supabase.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗A live, multiplayer Family Feud party game with an AI host. The show runs on a TV or laptop, and everyone plays from their phone: scan the QR code, pick a team, buzz in, type answers, and steal. Every screen stays in sync in real time.
It deploys for free in about two minutes, with no AI costs. When you want more, turn on the AI host: it writes a new survey for every game (on any topic you type), judges answers like a real Feud judge, and talks back in character with its own voice.
Live demo · Deploy free · Level up with AI · Make your own pack · Security
Built by Logan Dziuk.
Fan-made party game. Not affiliated with or endorsed by Family Feud / Fremantle, J.K. Rowling, Warner Bros. or Wizarding World. The packs contain no official art, music or logos. All visuals and music are generated in code.
Family Feud Live is played the Jackbox way: one shared screen, and a phone for every player. No app to install and no accounts to make.
It ships with three packs:
| The lobby: scan to join | The face-off | The Classic pack |
|---|---|---|
/play and types the 4-letter room code), enters a name and lands on a team. Up to 16 players.Difficulty sets both the questions and the judging:
One click, no credit card, and nothing to configure by hand:
scripts/migrate.mjs), so there's no SQL to paste.There's no AI key to add, and that's what keeps it free: without one, the game never calls an AI model.
Open your new site on a TV or laptop and create a game. The footer of the home page shows "Sync: Supabase Realtime" when everything is connected.
| Service | Plan | Cost |
|---|---|---|
| Vercel (hosting) | Hobby | $0 |
| Supabase (database + real-time) | Free | $0 |
| AI | Off (no API key) | $0 |
The whole game: the 3D stage, the flipping board, music and sound effects, real Feud rules, every difficulty, and real-time sync for up to 16 players a room. The host reads hand-written lines in your browser's built-in voice, and the questions come from each pack's built-in surveys. Any Topic falls back to classic questions until you turn AI on.
One thing to know: free Supabase projects pause after a week without use. Un-pause yours from the Supabase dashboard before game night.
Set these on your Vercel project (Production and Preview), then redeploy:
| Variable | Where to find it (Supabase dashboard) |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Project Settings → API → Project URL |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | Project Settings → API Keys → publishable (or legacy anon) key |
SUPABASE_SECRET_KEY | Project Settings → API Keys → secret (or legacy service_role) key. Copy it from the dashboard: the Supabase CLI shows new-style secret keys masked. |
POSTGRES_URL_NON_POOLING | Connect → Session pooler connection string (used only to run migrations at build time) |
SESSION_SECRET (optional) | Any long random string, e.g. openssl rand -base64 32. It defaults to the Supabase secret key. |
AI_GATEWAY_API_KEY (optional) | Turns the AI host on. See Level up. Leave it unset for a free deployment. |
Without POSTGRES_URL_NON_POOLING, run the files in supabase/migrations in order in the SQL editor instead, or run pnpm db:migrate from your machine.
Without a database, a deployment falls back to in-memory games. That only works inside one server process, so the home page shows a warning until Supabase is connected.
The game needs a database and real-time push to every phone. Supabase's free plan has both: Postgres, plus Realtime with up to 200 concurrent connections. It's also on the Vercel Marketplace, so the Deploy button can set it up for you. Free Postgres hosts like Neon or Turso would need a second service for real-time (Pusher, Ably, Liveblocks), or every phone polling the server.
No accounts or keys needed:
pnpm install
pnpm dev
Open http://localhost:3000 and click Create game. With no environment variables, games are kept in memory and use the built-in questions. Everything works, including real-time sync (over Server-Sent Events).
To play with real phones on your Wi-Fi, run a production build on your network and open the TV screen at your computer's address, so the QR code points somewhere phones can reach. (Use pnpm start, not pnpm dev: the dev server only serves its scripts to localhost.)
pnpm build && pnpm start -H 0.0.0.0
# then open http://<your-computer's-LAN-IP>:3000 on the TV
Start free, then turn things on as you go. Each step is an environment variable, so you can move up or back down at any time.
| Level | What to set | What you get | AI cost |
|---|---|---|---|
| 1. Free | Nothing (no API key) | Built-in surveys, hand-written host lines, the browser's voice | $0 |
| 2. AI writer | AI_GATEWAY_API_KEY and AI_VOICE_DISABLED=1 | A new survey every game, Any Topic, AI answer judging, and host lines written live for each moment of the game. The browser still does the voice. | Low |
| 3. Full show | AI_GATEWAY_API_KEY | Everything above, plus a real performed voice for the host (Fish Audio drama-3), a sentence at a time with synced captions | Higher (text-to-speech is most of the cost) |
| 4. Make it yours | Model, voice and pack settings below | Pick the models, cast a voice for each pack, build your own packs | You choose |
All AI runs on a single AI Gateway API key. AI is on only when the key is set, so the key's budget is the most the game can ever spend.
Create a key with a budget. In the Vercel dashboard, go to AI Gateway → API Keys, create a key, and give it a spend limit (for example $10 a month). Or use the CLI:
vercel ai-gateway api-keys create --name family-feud --limit 10 --refresh-period monthly
The key is shown once. Copy it straight into the next step, not into a file in this repo.
Add it to your project. Open Settings → Environment Variables, add AI_GATEWAY_API_KEY, mark it Sensitive, and pick the environments that should have AI (Production, and Preview if you want AI in preview deployments).
Redeploy (Deployments → ⋯ → Redeploy). The home page footer shows "AI host: on".
When the key hits its limit, model calls are refused and the game carries on with its free fallbacks until the budget resets. Change the limit at any time in the dashboard, or with vercel ai-gateway budgets set api-key family-feud --limit 20.
Locally: use the same kind of key in .env.local, which git ignores:
cp .env.example .env.local
# then set AI_GATEWAY_API_KEY=... in .env.local
The key only ever lives in your Vercel project settings or your own .env.local. It's never in the code, the repo or the browser.
AI_DISABLED=1 to turn the AI off without deleting the key.AI_VOICE_DISABLED=1. Text-to-speech is billed per sentence and is most of what a game spends.AI_MODEL=anthropic/claude-haiku-5.5 for survey writing.Where the usage goes, per game: one survey-writing call on AI_MODEL; one call per round on AI_MODEL to write that round's reactions ahead; one short AI_FAST_MODEL call per live host line; one AI_JUDGE_MODEL call per guess the local matcher can't decide; and, at level 3, one AI_TTS_MODEL call per spoken sentence (a round's likely reactions are voiced ahead, which adds a few hundred characters of speech per round).
Any provider/model the AI Gateway supports works. Each job has its own setting:
| Variable | Default | Job |
|---|---|---|
AI_MODEL | openai/gpt-6.1-sol (medium reasoning) | Writes the survey and each round's reactions ahead. One big, quality-sensitive call per game, made while players join. |
AI_FAST_MODEL | anthropic/claude-haiku-5.5 (reasoning off) | Writes live host lines. Short and many, so it has to be quick. |
AI_JUDGE_MODEL | typesafe-ai/jev | A decision model that picks which board answer a guess matches. Quick and cheap: it chooses from a list instead of writing text. |
AI_TTS_MODEL | fish-audio/drama-3 | The host's voice. |
AI_TTS_VOICE_<PACK_ID>, e.g. AI_TTS_VOICE_HARRY_POTTER=<id> (a Fish Audio voice id is the last part of a fish.audio/m/<id> link). AI_TTS_VOICE sets one voice for every pack.[smug, theatrical British showman], plus any [scoffs] the host writes), which are stripped from the on-screen captions.AI_TTS_NATIVE_SPEED=0 to always do it in the browser.A pack is two files: a theme (name, colors, fonts, 3D scene, music mood, host name and voice, team names) that's safe to send to browsers, and a server-only content file (host persona, AI guidance, topic angles, fallback surveys and canned lines). Write a few fallback surveys and your pack works on the free setup too. See docs/creating-a-pack.md.
Ideas: your family's inside jokes, a company offsite pack, a pack for your favorite show, a holiday pack.
The project is built to be safe to fork and host publicly. The short version:
.env* files are git-ignored, and .env.example only lists variable names..env.local, and it carries its own spend limit.Details, the cost guardrails for public deployments, and how to report a vulnerability are in SECURITY.md.
Phones (/play/ABCD) TV (/host/ABCD)
│ POST /action │ POST /action {tick} when a timer ends
▼ ▼
Route handlers ──► game-service ──► engine (pure rules) ──► store.mutate (compare-and-swap on version)
│ │
└─ AI Gateway: write survey / judge / recap │
▼
Supabase `games` row ──Realtime──► every screen
(memory + SSE in local dev)
games.state is the public state (players, board, scores, turn, host line). Every screen subscribes to that row with Supabase Realtime postgres_changes, and also re-fetches on focus and every few seconds, so a dropped socket never leaves a phone stuck.game_secrets, and the host's lines written ahead (which name the answers) in game_line_banks, one row per round. Only the server's secret key can read them. A tile's answer is copied into public state only when it's revealed.read → apply pure rule → update … where version = n, retried on conflict, so two buzzes in the same millisecond resolve cleanly.deadline. The TV asks the server to tick when it passes, and phones do the same a little later as a backup. The server checks the deadline itself, so these calls are idempotent.line_done when its voice finishes, and a speech-length estimate opens it anyway if the TV doesn't. Each round's question stays hidden until the face-off opens, so nobody gets a head start.delete_stale_games, run every five minutes by pg_cron where available and whenever a game is created.localStorage and sent as a Bearer header.Next.js 16 (App Router) · React 19 · TypeScript · Tailwind CSS 4 · React Three Fiber / three.js · Motion · Vercel AI SDK + AI Gateway · Supabase (Postgres, Realtime, Row Level Security) · Zod · Vitest
src/
app/ routes: / (home), /host/[code] (TV), /play/[code] (phone), /api/games/...
components/host/ TV stage, board, 3D scene, CSS fallback backdrop
components/play/ phone controller
lib/engine.ts all game rules as pure functions (unit-tested)
lib/game-service.ts orchestrates store + engine + AI
lib/ai.ts survey writer, answer judge, host lines, recap, host voice (AI SDK + Gateway)
lib/match.ts fast local answer matching (aliases, plurals, typos), by difficulty
lib/difficulty.ts what each difficulty accepts
lib/auth.ts signed seat tokens
lib/store/ memory (dev) and Supabase stores
lib/client/ realtime hook, API client, synthesized audio, speech
packs/ question packs: theme (client) + content (server)
supabase/migrations/ database schema
| Command | What it does |
|---|---|
pnpm dev | Start the dev server |
pnpm test | Run the engine, matcher, captions and AI unit tests (Vitest) |
pnpm typecheck | TypeScript check |
pnpm lint | ESLint |
pnpm build | Apply database migrations (if a database URL is set), then a production build |
pnpm db:migrate | Apply supabase/migrations/*.sql to the database in POSTGRES_URL_NON_POOLING / DATABASE_URL |
MIT. Pack content is fan-made and provided for non-commercial fun.