Underground 2 Revived
Chrome과 Firefox에서 Need for Speed Underground 2를 WebGPU로 두고 팬 프로젝트입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
KVIZY: a Danish pass-the-device quiz game for one shared screen. Offline-first PWA built with Next.js and TypeScript.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗KVIZY is a mobile-first quiz in Danish for friends, families, parties, classrooms and pub quizzes. Hand the phone around, or open a room on a laptop or TV and let everyone join with a four-letter code or QR code and answer on their own phone. There is no login, no download and no AI key needed, and the core game keeps working without a connection.
Next.js 16 App Router, React 19 and strict TypeScript. Tailwind CSS 4, shadcn/ui and Motion for the interface. Drizzle with optional Neon PostgreSQL for the admin side, a Vercel AI SDK generator with Zod-validated output, and Vitest plus Playwright (mobile and desktop) for tests.
KVIK, KVIKKERE, KVIZY. KVIZY er et komplet dansk, mobil-first quizspil til venner, familier, fester, undervisning og pubquiz. Første version er lokal multiplayer på én enhed og virker uden login, database eller AI-nøgle.
generateText + Output.object() + Zod til validerede AI-batchesKrav: Node.js 20.9+ og npm.
npm install
cp .env.example .env.local
npm run dev
Appen virker uden værdier i .env.local. Åbn http://localhost:3000.
| Variabel | Påkrævet | Formål |
|---|---|---|
DATABASE_URL | Nej | Neon/PostgreSQL til central spørgsmålsadministration |
ADMIN_SECRET | Ja for admin | Lang tilfældig hemmelighed; kontrolleres server-side |
VERCEL_OIDC_TOKEN | Automatisk på Vercel | AI Gateway-godkendelse |
AI_GATEWAY_API_KEY | Alternativ | Lokal AI Gateway-adgang |
AI_MODEL | Nej | Standard: openai/gpt-5.4-mini |
npm run db:generate
npm run db:migrate
npm run db:seed
Drizzle-skemaet modellerer kategorier, spørgsmål, spil, runder, spillere, hold, svar, plays, rapporter, generationsbatches og indstillinger. Klienten oprettes først ved faktisk brug, så build og kernespil aldrig afhænger af DATABASE_URL.
Seedbanken kombinerer håndskrevne spørgsmål med lokale snapshots fra Wikidata CC0. Distraktorer vælges inden for samme faktatype: eksempelvis hovedstæder mod hovedstæder, skuespillere mod skuespillere og sportsgrene mod sportsgrene. Alle 65 kategorier har mindst 30 semantisk relevante spørgsmål, og udvælgeren kan også bruge relevante sekundære kategorier. Nye kategorier tilføjes i src/lib/categories.ts.
Wikidata-importerne er langsomme, genoptagelige og gemmer efter hver relation. --missing springer allerede hentede relationer over:
npm run questions:update-wikidata
npm run questions:update-culture
npm run questions:update-thin -- --missing
npm run questions:export -- eksport.json
npm run questions:import -- eksport.json
Importkommandoen Zod-validerer hele filen og afviser dublerede fingerprints. Den ikke-linkede adminside på /admin kan søge, filtrere, redigere, aktivere/deaktivere, eksportere, previewe AI-batches, se kvalitetsadvarsler, privat aggregeret statistik og centralt synkroniserede spillerrapporter. Spørgsmålsbanken hentes serverfiltreret efter de valgte kategorier og gemmes som offline-fallback på enheden. AI vises som utilgængelig, hvis credentials mangler.
Efter hvert svar kan spilleren rapportere forkert svar, uklar formulering, forkert niveau, dårlige svarmuligheder eller forældet information. Rapporten gemmes først lokalt og synkroniseres derefter via POST /api/reports, når en database er tilgængelig. Ved tre rapporter sættes spørgsmålet automatisk i karantæne, indtil det gennemgås i admin. Generiske faktafelter skjules automatisk i spillet.
Den redaktionelle kvalitetspakke kontrollerer hvert aktivt spørgsmål for kunstigt maskinsprog, gentagelser, svarlæk, forkerte svartypekombinationer, dubletter og længdebias. Ens skabeloner og identiske svarpuljer begrænses i selve udvælgelsen og huskes på tværs af spil. Importerede Wikidata-spørgsmål kræver en eksplicit redaktionel godkendelse, før de kommer med i den aktive bank.
I Indstillinger kan spilleren oprette en etårig backupkode til set-historik og seneste opsætning. Koden gør det muligt at bevare anti-repeat efter geninstallation. Brugsstatistik gemmes kun som samlede dagstællere for startede/gennemførte spil, rapporter og valgte kategorier; der bruges ingen tracking-cookie eller enhedsprofil.
POST /api/admin/generate er beskyttet af HttpOnly-admincookie og en enkel IP-rate-limit. Generatoren modtager kategori, sekundær kategori, niveau, antal og type. Output skal bestå schema-, sprog-, options-, banned phrase-, kilde- og nær-dubletkontrol. Godkendte spørgsmål lander som draft; de aktiveres ikke automatisk.
Udvælgeren kombinerer stabil normalisering/hash, tokenbaseret Jaccard-similaritet, core-fact fingerprint, spillerens set-historik, seneste dato, antal visninger, sværhedsafstand, kategorifavoritter og type-/kategorisekvenser. Et spørgsmål eller en nær-dublet kan aldrig vælges to gange i samme spil.
npm run typecheck
npm run lint
npm test
npm run test:e2e
npm run build
npm run check
E2E-flowet dækker nyt spil, spillernavn, kategorier, niveau/længde, svar, spillerskift, refresh/fortsæt, afslutning, resultat, revanche, tomt udvalg, adminbeskyttelse samt mobil og desktop.
vercel link
vercel env add ADMIN_SECRET production
vercel env add DATABASE_URL production # valgfri
vercel --prod
Kør migration og seed mod produktions-DATABASE_URL før adminaktivering. Uden en produktionsdatabase bliver rapporter på spillerens enhed og forsøges synkroniseret igen senere. AI Gateway kan bruge Vercel OIDC; uden AI-adgang fungerer alle 2.316 seedspørgsmål stadig.
Manifest, service worker, safe areas og standalone/fullscreen-visning er inkluderet. På understøttede Android-browsere vises en native “Installér KVIZY”-knap nederst i “Sådan spiller I”. På iPhone vises Safari-trinene “Del → Føj til hjemmeskærm”. Installationssektionen vises kun på mobil og skjules, når appen allerede kører installeret.
src/components/game-shell.tsx – samlet gæstespil og lokale flowssrc/lib/engine.ts – point, sværhedsgrad, shuffle, fingerprints og udvalgsrc/data/ – kategoridrevet seedbanksrc/lib/ai/ – struktureret generation og kvalitetskontrolsrc/lib/db/ + drizzle/ – typesikkert skema og migrationsrc/app/admin + src/app/api/admin – beskyttet admin og generatore2e/ og src/lib/*.test.ts – browser- og enhedstestsDen lokale Game-model og deterministiske PlayerAnswer-events kan flyttes til server-authoritative rooms. Tilføj rumkode, WebSocket/Realtime-transport og optimistic event reconciliation, mens den nuværende lokale reducer bevares som offline fallback. Login og profiler kan lægges ovenpå uden at ændre spørgsmålsbanken.
Rum bruger WebRTC via den gratis PeerJS-mødeserver (0.peerjs.com), Googles STUN-servere og en åben TURN-relæ som sidste udvej. Vil du være uafhængig af dem, kan du sætte egne servere med miljøvariablerne NEXT_PUBLIC_PEER_HOST, NEXT_PUBLIC_PEER_PORT, NEXT_PUBLIC_PEER_PATH (egen PeerJS-server) og NEXT_PUBLIC_TURN_URL, NEXT_PUBLIC_TURN_USER, NEXT_PUBLIC_TURN_CREDENTIAL (egen TURN-server; flere adresser adskilles med komma). Værten kan genindlæse siden og få samme rumkode igen.