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,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Online party games you play with your friends in one browser tab.
One room, one link, a dozen games, and voice chat that doesn't drop when you
switch between them.
Live at https://games.safariyat.live
The brand name lives in one file — see docs/BRANDING.md,
which argues for renaming and was not acted on.檢視完整 README ↗Online party games you play with your friends in one browser tab. One room, one link, a dozen games, and voice chat that doesn't drop when you switch between them.
Live at https://games.safariyat.live The brand name lives in one file — see docs/BRANDING.md, which argues for renaming and was not acted on.
A room is not a game. A room is a group of people, and the game is a slot inside it that anyone can swap at any time. Finish domino, switch to Codenames, and the room code, the roster, the chat, the voice call and the night's scoreboard all stay exactly where they were. Nobody re-sends a link. That is the entire product thesis, and everything else follows from it.
server/ Node + Express + Socket.IO game server (TypeScript)
web/ React + Vite + Tailwind client
docs/ Architecture, branding, design system, voice, roadmaps
deploy/ coturn (TURN relay) config for voice
Requires Node 20+.
Terminal 1 — server
cd server
npm install
cp .env.example .env
npm run dev # http://localhost:3001
Terminal 2 — web
cd web
npm install
cp .env.example .env
npm run dev # http://localhost:5173
Open http://localhost:5173, start a party, and share the six-digit code — or open a second browser tab and join with it. You can fill empty seats with bots.
To play from another device on your LAN, set VITE_BACKEND_URL in web/.env to
your machine's LAN IP, and add that origin to ALLOWED_ORIGINS in server/.env.
Both, or the socket handshake is rejected and every client sits on
"connecting" forever.
| Where | Command | What it does |
|---|---|---|
server/ | npm run dev | Dev server, auto-reload |
server/ | npm test | Offline suite: build, type-contract check, engine contracts, domino rules, 60-match sim |
server/ | npm run test:live | Everything that needs a running server (see below) |
server/ | npm run test:engines | Contracts all 13 engines must satisfy |
server/ | npm run test:domino | 30 rule checks, no network |
server/ | npm run test:domino-sim | 60 full matches + the disconnect regression |
server/ | npm run test:lifecycle | Refresh, second tab, host leaves, latecomer |
server/ | npm run test:party | Create, join, switch game, rematch, leave |
server/ | npm run types:sync | Regenerate the client's copy of the wire contract |
server/ | npm run typecheck | Type-check without emitting |
web/ | npm run dev | Vite dev server with HMR |
web/ | npm run build | Production build |
web/ | npm run brand:sync | Regenerate index.html, sitemap, robots, manifest from brand.ts |
web/ | npm run lint | ESLint |
npm test needs nothing running. npm run test:live drives real socket
clients against a live server, so start one first:
cd server && npm run dev # terminal 1
cd server && npm run test:live # terminal 2
node test/seat-bots.mjs <ROOM_CODE> fills a room with scripted players. Six
of the games deliberately have no bots — Spyfall, Chameleon, Taboo, Bluff,
Would You Rather and Codenames, all of which are conversation first — which
otherwise makes them impossible to look at in a browser on your own. Every
other game seats real bots, and npm run test:bot-games checks they play.
| File | Key | Notes |
|---|---|---|
server/.env | PORT | Default 3001 |
ALLOWED_ORIGINS | Comma-separated. Unset = allow any (fine locally, not in production) | |
web/.env | VITE_BACKEND_URL | Where the socket connects |
VITE_TURN_URL / _USERNAME / _CREDENTIAL | Voice relay. Without it, voice only works between players on the same network | |
VITE_FIREBASE_* | Optional, for Google sign-in |
| Document | What's in it |
|---|---|
| ARCHITECTURE.md | How it fits together, every technology choice and what it was chosen instead of, scaling, and what I'd build next |
| BRANDING.md | Why the current name doesn't work, the recommended one, a ranked domain shortlist, and how to switch |
| DESIGN_SYSTEM.md | Tokens, the WCAG contrast table, and the reasoning behind each decision |
| VOICE.md | How WebRTC voice works here, how to diagnose "voice is broken", and how to grow it |
| MATCHMAKING.md | Persistent parties, presence, and matchmaking — designed, not built, in build order |
| IMAGE_BRIEFS.md | Every raster asset with an exact prompt and output path |
| CONTENT_STRATEGY.md | TikTok plan, six formats, 90 days of video ideas |
| DEPLOY.md | Deployment |
| VOICE_TURN_SETUP.md | coturn setup on the VM |
| Game | Players | Notes |
|---|---|---|
| Domino | 2–4 | Egyptian street rules: partners, all 28 tiles dealt, knock when stuck, race to 101 |
| Spyfall — برا اللعبة | 3–10 | Everyone knows the place except the spy. 30 locations, pure conversation |
| Chameleon — الحرباية | 3–10 | One word each. 12 topic grids. Ninety-second rounds |
| Would You Rather — لو خيّروك | 3–10 | Not what you'd pick — what your friends think you'd pick |
| Bluff — بلوف | 3–10 | Invent the missing word, then spot the real one. 38 prompts, both languages |
| Taboo — تابو | 4–12 | Describe the word without saying the four under it. 40 cards a side, voice-first |
| Liar's Bar | 2–6 | Bluffing card game. Cards or dominoes variant |
| Codenames | 4–10 | Fully bilingual — the whole board plays in Arabic or English |
| Higher or Lower | 2–6 | Fast number-guessing race |
| Rento | 2–6 | Property trading, on a turn timer |
| Arcade | 1–10 | Tetris, Snake, Tic-Tac-Toe, Memory, Space Invaders, Fighter, Snakes & Ladders |
Every one of them is reachable from inside a party without a new link.
Adding one: ARCHITECTURE.md §8.