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,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Live 1v1 Italian trivia for learners. Real-time matchmaking, speed scoring, and mistake review — practice that feels like a game, not homework.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Italiarena is a live 1v1 Italian trivia game.
I moved to Turin as an international student and Italian was the hardest part — every app I tried felt like homework, so I stopped using them. Italiarena is the practice I actually wanted: quick, competitive matches instead of flashcards. It's for anyone landing in Italy and needing to pick up the language fast.
Italiarena is open source because learning tools are better when people can inspect the product, fix rough edges, and improve the experience together. Contributions are welcome.檢視完整 README ↗Italiarena is a live 1v1 Italian trivia game.
I moved to Turin as an international student and Italian was the hardest part — every app I tried felt like homework, so I stopped using them. Italiarena is the practice I actually wanted: quick, competitive matches instead of flashcards. It's for anyone landing in Italy and needing to pick up the language fast.
Italiarena is open source because learning tools are better when people can inspect the product, fix rough edges, and improve the experience together. Contributions are welcome.
The project is licensed under MIT. If you want to contribute, start with CONTRIBUTING.md, open an issue, or send a focused pull request.
The hosted backend and question database are not part of this repository. That keeps the live game fair and protects the content behind the product. You can still contribute meaningfully to the app layer — UI, accessibility, match flow, settings, statistics, and client-side behavior.
| Idea | How it shows up in the app |
|---|---|
| Short, focused matches | Ten timed questions per round — grammar, vocabulary, fill-in-the-blank, and idioms |
| Real opponents | Matchmaking pairs players by Italian level (CEFR A1–C1) |
| No dead waiting | Play vs bot for an instant ghost match, or search for a human opponent |
| Speed matters | Faster correct answers score more; a tie after 10 questions goes to one sudden-death round |
| Learn from mistakes | Post-match review, targeted mistake practice, and optional AI-generated explanations (Groq) |
| Community quality control | Players can report bad questions; admins review a flagged/submission queue |
| Push reminders | Opt-in web push nudges players back for a daily match (Vercel Cron + service worker) |
| Works like an app on your phone | Add to home screen on iOS and Android for a full-screen experience |
Supported language: Italian.
Next.js (App Router) on Vercel, backed by Supabase (Postgres + Auth + Realtime). No separate game server — a game_sessions row is the match state, and both players' browsers just stay in sync with that row.
app/ Routes, layouts, server actions — auth, matchmaking, admin
components/ UI by feature: match, matchmaking, dashboard, statistics, admin, settings
hooks/ useGameLoop (pacing) + useServerMatchSync (staying in sync)
lib/ Scoring, bot simulation, match-sync protocol, AI explanations, auth
store/ Zustand store — all in-match state
utils/ Supabase clients (browser, server, middleware)
public/ Static assets, PWA icons, sound effects
Schema and migrations live outside this repo (supabase/README.md); the sync protocol that talks to them is fully readable in lib/match-sync-client.ts and hooks/useServerMatchSync.ts.
How a match stays in sync, briefly:
git clone https://github.com/armanalis/italiarena.git
cd italiarena
npm install
Create .env.local from the example:
cp .env.example .env.local
Fill in the Supabase values for a project you are authorized to use. For most contributions, pointing at the hosted demo backend is enough to work on UI and client behavior — ask in an issue if you are unsure.
npm run dev
Open http://localhost:3000.
npm run build # production build (runs test:unit first; a failing test stops the deploy)
npm run lint # ESLint
npm run audit:questions # sanity-check the question bank for data issues
npm test # every test: scripts/test-*.ts, then the SQL suite
npm run test:sql # SQL suite only (needs the private supabase/*.sql files)
| Layer | Choice |
|---|---|
| Framework | Next.js (App Router, Server Actions) |
| Backend | Supabase — Postgres, Auth, Realtime, RPC functions |
| Client state | Zustand |
| UI | Tailwind CSS + shadcn/ui on Radix primitives |
| AI explanations | Groq (Llama 3.1 8B) for optional post-match answer explanations |
| Push notifications | Web Push (web-push) + a Vercel Cron job for the daily reminder |
| Hosting | Vercel |
The app is deployed on Vercel at italiarena.com. Set NEXT_PUBLIC_SITE_URL to https://italiarena.com, plus NEXT_PUBLIC_SUPABASE_URL and NEXT_PUBLIC_SUPABASE_ANON_KEY in the project environment. In Supabase → Authentication → URL configuration, set Site URL to https://italiarena.com, add https://italiarena.com/auth/callback, https://italiarena.com/auth/confirm, https://italiarena.com/auth/confirm/pending, and https://italiarena.com/onboarding to Redirect URLs (or use https://italiarena.com/**), and remove any old language-quiz-one.vercel.app entries.
For local development, set NEXT_PUBLIC_SITE_URL=http://localhost:3000 in .env.local and add these to Supabase Redirect URLs as well: http://localhost:3000/** (or at minimum http://localhost:3000/auth/callback, http://localhost:3000/auth/confirm, and http://localhost:3000/auth/confirm/pending).
The default Supabase OAuth hop uses a random project host (https://<project-ref>.supabase.co/auth/v1/authorize). Google then shows that URL as “Continue to …supabase.co”, which looks untrusted.
What the app does: If NEXT_PUBLIC_GOOGLE_CLIENT_ID is set, login uses Google Identity Services on italiarena.com. Google’s popup stays associated with this site; the ID token is sent to Supabase in the background. Users never see the random *.supabase.co URL.
NEXT_PUBLIC_GOOGLE_CLIENT_ID in .env.local and in Vercel.https://italiarena.comhttps://www.italiarena.comhttp://localhost:3000https://<project-ref>.supabase.co/auth/v1/callback as a fallback. After a vanity/custom domain is live, add that host’s /auth/v1/callback too.https://italiarena.com/privacy), and terms. Verify the domain in Search Console so Google shows the brand instead of an unverified warning.Branded Supabase API host (optional, dashboard/CLI — not app code):
italiarena.supabase.co. Activate with the Supabase CLI, then set NEXT_PUBLIC_SUPABASE_URL=https://italiarena.supabase.co.auth.italiarena.com or api.italiarena.com via a CNAME. Google then shows “Continue to auth.italiarena.com”. See Custom Domains.You can use either a vanity subdomain or a custom domain, not both. The original *.supabase.co project URL keeps working after you activate one.
Supabase’s built-in mailer sends from “Supabase Auth” and is rate-limited. For production, configure your own provider:
[email protected]Italiarenaitaliarena.com in your provider’s DNS settings so messages land in the inbox.supabase/email-templates/ (copy each file into the matching Supabase template). Suggested subjects:
Confirm your Italiarena account → confirm-signup.htmlYou're invited to Italiarena → invite-user.htmlSign in to Italiarena → magic-link.htmlConfirm your new Italiarena email → change-email.htmlReset your Italiarena password → reset-password.htmlYour Italiarena verification code → reauthentication.html
Link-based templates should point to {{ .RedirectTo }}auth/confirm/pending?token_hash={{ .TokenHash }}&type=…&next=/onboarding (use signup for Confirm signup; for recovery use {{ .SiteURL }}/auth/confirm?token_hash={{ .TokenHash }}&type=recovery&next=/login/reset-password). RedirectTo is the signup origin (http://localhost:3000/ locally or https://italiarena.com/ in production). Inbox scanners are redirected to a confirmation button page before the one-time token is used.[email protected] and links open /auth/confirm/pending (then continue via the button).3600 seconds (1 hour), and to at least . The app also refreshes the recovery session while the user is on so they have at least ~5 minutes to submit a new password.Optional features (for example Ask AI) may require additional keys configured only on the hosted instance.
Contributions are welcome. Please read CONTRIBUTING.md before opening a pull request.
Good first areas: mobile layout, accessibility, copy, match UX, statistics views, and bug fixes in the client.
See LICENSE.
3600/login/reset-password