En lille web-app der tester din viden om kunstig intelligens — med gamification, humor og masser af øjenguf. Bygget på http-nu (en Nushell-scriptbar HTTP-server) som backend.
- Udskiftelige spørgsmålssæt i YAML — 12 AI-spørgsmål følger med, og egne sæt vælges pr. link med
?set=<id>(se Spørgsmålssæt) - Jokes i både de forkerte svar og feedback-linjerne
- Gamification: tids-bonus, combo-multiplikator, streaks og sjove rang-titler (fra 🦜 Stokastisk Papegøje til 🤖 AGI-Overherre)
- Øjenguf: kortet pumper ved rigtige svar, ryster ved forkerte, og danser med en eskalerende glød på streaks
- Stress-timer: en nedtællingslinje der slår som et hjerte og accelererer mod nul (grøn → rød)
- Lyd (Web Audio, ingen lydfiler): glad blip ved rigtigt svar, womp ved forkert, tikkende ur under panik, "nah-nah-naaaaah" trombone ved timeout, og en triumf-fanfare ved perfekt score
- Personligt kursus: efter quizzen samles et lille kursusmateriale af præcis de emner du svarede forkert på
- Før/efter: tag et nyt forsøg efter kurset og se sort på hvidt hvilke svage emner du har rettet
- Login + leaderboard: opret en bruger, og dine bedste scores ryger på en vedvarende topliste
- Live admin-dashboard: følg folk spille i realtid via server-sent events
- Tastatur-styring (1-4 / A-D) og
prefers-reduced-motion-support
Hvert spørgsmål bærer et lille topic + learn-felt (en kort, korrekt mini-lektion). Frontend'en husker præcis hvilke spørgsmål deltageren svarede forkert på (eller løb tør for tid på) og samler bagefter et personligt kursusmateriale af netop de emner — med spørgsmålet, det rigtige svar og forklaringen. Får man alt rigtigt, er der intet at repetere.
Efter kurset kan deltageren tage et nyt forsøg, og resultatskærmen viser så en før/efter-sammenligning mod det første forsøg (baseline): score- og rigtige-udvikling, plus hvilke af de svage emner der nu er rettet (✓) eller stadig driller (⚠). Forbedringen gemmes også server-side, så admin kan se den samlede effekt (se Live admin-dashboard).
Et bevidst simpelt login: vælg brugernavn + kode, så huskes du via en session-cookie. Data persisteres server-side i http-nu's indbyggede cross.stream-store (--store) — ingen ekstern database. Koder gemmes som SHA-256-hash, og leaderboardet viser den bedste score pr. bruger.
API-endpoints (alle JSON):
| Metode | Sti | Funktion |
|---|---|---|
GET |
/api/questions |
Spørgsmål + rang-titler (?set=<id> vælger sæt) |
GET |
/api/sets |
Tilgængelige spørgsmålssæt |
POST |
/api/sets |
Upload et nyt sæt som YAML (kræver login) |
POST |
/api/register |
Opret bruger (sætter session-cookie) |
POST |
/api/login |
Log ind |
POST |
/api/logout |
Log ud |
GET |
/api/me |
Hvem er logget ind |
POST |
/api/score |
Indsend score (kræver login) |
GET |
/api/leaderboard |
Top 15, bedste score pr. bruger |
POST |
/api/event |
Live-event fra en spiller (fire-and-forget) |
GET |
/api/admin/stream |
SSE-stream af alle events (kun admin) |
GET |
/api/admin/misses |
Svageste emner, aggregeret (kun admin) |
GET |
/api/admin/improvement |
Effekt af kurset: forbedring over forsøg (kun admin) |
GET |
/admin |
Live-dashboardet (kun admin) |
Som admin kan du følge folk spille i realtid på /admin: aktive spillere med live score/streak/progress, og et rullende live-feed. Det er drevet af http-nu's cross.stream + server-sent events (.cat --follow → to sse) — ingen polling, ingen WebSocket.
Dashboardet samler også svageste emner — en rangliste over hvad folk oftest svarer forkert på (gemt i et misses-topic ved hver finish), så du kan se hvor undervisningen skal sætte ind:
Og fordi hvert score-forsøg gemmes med et attempt-nummer, kan dashboardet vise effekten af kurset — den gennemsnitlige forbedring fra deltagernes første til seneste forsøg, så du har sort på hvidt på om undervisningen rykker:
De to historiske paneler (svageste emner + effekt) har et tidsfilter — Seneste time / I dag / 7 dage / Alt — så du kan måle ét bestemt kursus-hold. Filteret sendes som ?range= til endpointsne, der filtrerer på at-tidsstemplet server-side.
Adgang styres ved at whiteliste et brugernavn via miljøvariablen AIIQ_ADMINS (komma-separeret; default er admin). Log ind som den bruger, og /admin + streamen åbner sig — alle andre får 403.
Kræver http-nu (brew install cablehead/tap/http-nu).
# AIIQ_ADMINS vælger hvilke(t) brugernavn(e) der kan se admin-dashboardet
AIIQ_ADMINS=ditbrugernavn http-nu :3001 --store ./store --dev -w app.nuÅbn så http://localhost:3001 i en browser.
--store ./storeaktiverer cross.stream-storen (brugere, sessioner, scores og events gemmes her)--devdropperSecure-flaget på cookies, så login virker overhttp://localhost-waktiverer hot-reload, så ændringer iapp.nuslår igennem automatiskAIIQ_ADMINS— komma-separeret liste af admin-brugernavne (defaultadmin)AIIQ_SET— id på default-spørgsmålssættet (defaultai-basics)
Spørgsmål, svar og de uddybende mini-lektioner bor i udskiftelige YAML-filer i sets/. Hver fil er ét sæt; filnavnet uden .yaml er sættets id:
title: 'Mit kursus'
ui: # valgfrit: tilpas quizzens tekster til emnet
title: 'Mit Kursus-IQ 🎓' # forside-overskrift + browser-titel
tagline: 'Underteksten på forsiden'
courseTitle: '📚 Dit personlige kursus'
footer: 'Den lille linje i bunden af forsiden'
questions:
- q: 'Selve spørgsmålet?'
options: ['Rigtigt svar', 'Forkert', 'Også forkert', 'Joke-svar']
answer: 0 # index på det rigtige svar (frontend'en blander selv)
right: 'Feedback ved rigtigt svar'
wrong: 'Feedback ved forkert svar'
topic: 'Kort emne-navn' # bruges i kurset og admin-statistikken
learn: 'Mini-lektionen der vises i det personlige kursus efter forkerte svar'Valgfrit kan et sæt have sin egen ranks:-liste; ellers bruges standard-rang-titlerne. Alle sæt indlæses (og JSON-serialiseres) én gang ved opstart — med -w genindlæses de automatisk, når en YAML-fil ændres.
Vælg sæt med ?set=<id> på quizzens URL, fx http://localhost:3001/?set=prompt-teknik — det er hele delingen: ét link pr. kursushold/sæt. Uden parameter bruges AIIQ_SET (default ai-basics). sets/prompt-teknik.yaml er et lille kommenteret demo-sæt, der kan bruges som skabelon.
På /create.html kan alle med et login lave et nyt sæt uden at røre serveren: siden har en copy-paste-klar prompt (med hele YAML-formatet og et eksempel indbygget), man giver sin egen AI sammen med et emne — og en formular, hvor den AI-skabte YAML pastes ind. Serveren validerer sættet (struktur, felter, answer-indeks m.m.) med konkrete fejlbeskeder pr. spørgsmål, gemmer det i sets/ og svarer med et delbart link som /?set=90er-hits. Nye sæt virker med det samme — også uden -w.
app.nu— http-nu-handler. Brugerrouter-modulet til at dispatche endpoints og serverer alt andet statisk frapublic/. Data lever i cross.stream-topics (users,sessions,scores,events,misses).sets/*.yaml— udskiftelige spørgsmålssæt (spørgsmål + svar + mini-lektioner).public/index.html— selve quiz-appen (self-contained HTML/CSS/JS, ingen build-step).public/admin.html— live admin-dashboardet (lytter på SSE-streamen).
MIT © Lennart Kiil









