尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證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.