2026-04-26chore: bootstrap monorepo (pnpm workspace, tsconfig base, gitignore)
2026-04-26chore: tighten tsconfig + pin pnpm via packageManager
2026-04-26feat(web): scaffold SvelteKit app with Cloudflare adapter
2026-04-26fix(web): address Task 2 code review follow-ups
2026-04-26feat(web): add Tailwind v4 + theme tokens (dark default)
2026-04-26feat(web): add Paraglide i18n with PL+EN and locale-prefixed routes
2026-04-26feat(partykit): scaffold hello echo room with unit tests
2026-04-26feat(shared-types): add v0 WS protocol types
2026-04-26feat(web): add WS client + connect to hello echo room
2026-04-26feat(infra): add D1 schema, migrations, wrangler config
2026-04-26docs: add Cloudflare deployment instructions
2026-04-26test(web): add Playwright smoke E2E (locale + WS echo)
2026-04-26chore: add ESLint flat config + Prettier
2026-04-26ci: add GitHub Actions workflow (typecheck, lint, unit, e2e)
2026-04-26fix: typecheck across workspace + skip vitest in apps/web until tests exist
2026-04-26feat(web): add nick validation (pure + tested)
2026-04-26feat(web): add guest user store (UUID + nick, localStorage-backed) + vitest config
2026-04-26feat(web): add sound mute preference store
2026-04-26docs: add Phase 2 implementation plan (onboarding + main menu)
2026-04-26feat(web/i18n): add onboarding + menu + how-to-play strings (PL/EN)
2026-04-26feat(web): self-host Geist Sans + Space Grotesk variable fonts
2026-04-26feat(web/ui): add PrimaryButton, BrandLogo, Modal primitives
2026-04-26feat(web/ui): add NavHeader with locale + mute + nick badge
2026-04-26feat(web/ui): add MenuCard primitive (gradient + accent variants)
2026-04-26feat(web): replace WS smoke test with landing + nick entry + menu + how-to-play
2026-04-26test(web): cover onboarding + menu flow with Playwright
2026-04-26fix(web): suppress 3 lint warnings (intentional control-char regex, Svelte 5 $derived, rest props)
2026-04-26docs: add Phase 3 implementation plan (game engine + single-player)
2026-04-26feat(game-engine): bootstrap package + types (GameModule contract)
2026-04-26feat(game-engine): scoring rules (+2 first correct, +1 second, 0 wrong/timeout)
2026-04-26feat(game-engine): seedable PRNG (mulberry32) + pickN helper
2026-04-26feat(game-engine): higher-or-lower module + composeRound + sudden death
2026-04-26feat(game-engine): match runner orchestrator (lifecycle + subscribe)
2026-04-26feat(game-engine): bot opponent (75% accuracy default, 1.5-4s delay)
2026-04-26feat(categories): add pl-youtubers (~40 channels, subscriber counts)
2026-04-26feat(web/i18n): add gameplay + result strings (PL/EN)
2026-04-26feat(web/game): per-nick stats (matches/wins/losses/streak) in localStorage
2026-04-26feat(web/game): match controller + sound/haptic stubs (vs bot mode)
2026-04-26feat(web/ui): add game UI components (Avatar, RoundCard, HigherLowerButtons, ScoreTracker, Countdown, OpponentAnswered, Confetti)
2026-04-26feat(web): add /play (vs bot) + /play/result routes; menu Quick Match wires up
2026-04-26test(web): cover vs-bot match flow + Play again with Playwright
2026-04-26fix(web): result page persistence + valid Geist font
2026-04-26docs(spec): add Phase 7 polish backlog items found during live testing
2026-04-26docs: add Phase 4 implementation plan (real multiplayer via DOs)
2026-04-26feat(game-engine): PublicRoundData + toPublicRound() (anti-cheat helper)
2026-04-26feat(shared-types): WS protocol v1 (lobby + match) + JWT claims
2026-04-26chore(web): remove dead ws-client.ts (replaced by RemoteMatchController in Phase 4)
2026-04-26feat(partykit/auth): JWT sign/verify (HS256 via jose)
2026-04-26feat(partykit/lobby): FIFO queue with category pools (TDD)
2026-04-26feat(partykit/match): server-side round flow (anti-cheat: publicRound, server timing)
2026-04-26feat(partykit/lobby): WS room with FIFO matchmaking + auth gate + /issue-token endpoint
2026-04-26feat(partykit/match): match room (server-auth gameplay, reconnect, rematch, forfeit)
2026-04-26refactor(web/game): extract MatchController interface; rename Bot impl
2026-04-26feat(web/game): RemoteMatchController (WS-backed via PartyKit)
2026-04-26feat(web/i18n): lobby + disconnect + forfeit strings (PL/EN)
2026-04-26feat(web): lobby UI + /play branching (online vs bot mode)
2026-04-26test(web): two-tab Playwright E2E for online match + cancel
2026-04-26fix(web/game): drop unused Answer import in bot-controller
2026-04-26fix(web): properly unsubscribe controller state on cleanup
2026-04-26docs(spec): document Phase 4.1 hardening items (prod multiplayer verification, match-token, DO storage)
2026-04-26docs: add Phase 5 plan (friend invite + rematch)
2026-04-26feat(web/game): rematch support — extend controller interface, wire up remote rematch flow
2026-04-26feat(web/i18n): friend invite + rematch strings (PL/EN)
2026-04-26feat(web/i18n): friend invite + rematch strings (PL — second pass)
2026-04-26feat(web/ui): FriendInviteModal + ResultOverlay components
2026-04-26feat(web): friend invite flow + inline result overlay + rematch wired up
2026-04-26test(web): Playwright E2E for friend invite flow
2026-04-26fix(web/menu): wire 'Play with friend' to /play?mode=friend (Task 7 step missed in Phase 5 commit)
2026-04-26docs: add Phase 6 plan (categories #2 + #3 + picker)
2026-04-26feat(categories): add top-athletes (~76 athletes, IG followers)
2026-04-26feat(categories): add tech (~57 items: LLMs, dev tools, frameworks, multi-attr)
2026-04-26feat(server+web): wire 3 categories to match DO via WS query + lobby pass categoryId in match_found
2026-04-26feat(web): category picker + /play passes selected category to controllers/lobby
2026-04-26docs: add Phase 7 plan (polish + soft launch prep)
2026-04-26feat(web): Phase 7 polish — round timer, sudden death badge, loss animation, WebAudio SFX (8 sounds)
2026-04-26docs: README v1.0 deployment runbook + soft launch checklist
2026-04-26security: HIGH+MEDIUM hardening (auth-001, config-001, config-002, exposure-001, rate-limit-001, business-logic-001/002)
2026-04-26feat(web): UX overhaul — explicit round question, KNOWN/GUESS cards, contextual buttons, result feedback, stats, tutorial
2026-04-26feat(web): Stadium System redesign — sports-broadcast HUD, safety orange, industrial mono
2026-04-26ux(web): readability pass — bigger type, isolated question block, real 4 s countdown
2026-04-26ux(web): bigger landing stats, live wall clock, full-width KNOWN/GUESS header, redesigned how-to-play
2026-04-26ux(web): epic /play/result — hero plate + headline stats + mini receipt + locale-aware sizing
2026-04-26feat(web): ShareSheet, privacy page, bug-report header link — pre-launch polish
2026-04-26docs(scheduler): seed handoff + per-run prompt for autonomous Phase 7.1 + post-MVP work
2026-04-26auto(7.1.A): add MatchSnapshot serialize/fromSnapshot on ServerMatch
2026-04-26auto(7.1.A): wire DO storage rehydration for MatchRoom
2026-04-26auto(7.1.A+7.1.B): close 7.1.A docs flip, scaffold validated /og endpoint
2026-04-27auto(7.1.B): render real Stadium-styled OG SVG body
2026-04-27auto(7.1.B): wire live /og share URL into share text on last line
2026-04-27auto(7.1.B): add OG / Twitter meta tags to app.html
2026-04-27auto(7.1.C): add test:e2e:preview infra for production-bundle Playwright
2026-04-27auto(7.1.C): close 7.1.C with preview-build spec + production-verification doc
2026-04-27auto(PMVP.A): add youtubeChannelId field to pl-youtubers items
2026-04-27auto(PMVP.A): add fetch-yt-avatars script + operator README
2026-04-27auto(PMVP.B): add openskill rating helpers + tests
2026-04-27auto(PMVP.B): add rating field + lazy migration to guest-user store
2026-04-27auto(PMVP.B): wire applyMatch + setRating into online/friend match end
2026-04-27auto(PMVP.B): render rating chip in NavHeader + delta on result hero
2026-04-27auto(follow-on): fix app-html strict-null + add rating-chip preview e2e
2026-04-27chore: ignore .claude/ local config dir
2026-05-01feat(solo): add singleplayer streak mode + global leaderboard (#1)
2026-05-01fix(solo): rename party `solo-leaderboard` → `solo` (PartyKit bundler can't import a hyphenated identifier)
2026-05-02feat(account): phase 1 — D1 + Better Auth scaffold (#2)
2026-05-02ci: drop hardcoded pnpm version
2026-05-02fix(security): pre-launch hardening + unblock prod build (#3)
2026-05-03build: migrate to Workers Builds format (wrangler deploy + assets binding) (#4)
2026-05-03fix(auth): unblock Better Auth on Cloudflare Workers (#5)
2026-05-03fix(web): security headers via SvelteKit hook (Workers Builds compat) (#6)
2026-05-03fix(web): absolute asset paths + allow Google Fonts in CSP (#7)
2026-05-03fix(csp): use SvelteKit kit.csp so inline hydration script is allowed (#8)
2026-05-03docs(devops): add Cloudflare deploy & DevOps guide (#9)
2026-05-04fix(ux): bug-report link, /account explainer, honest landing stats (#10)
2026-05-04fix: prod default for PUBLIC_PARTYKIT_HOST + drop double locale prefix (#11)
2026-05-04fix(menu): Quick Match chip — honest copy, no fake counts (#12)
2026-05-04fix: roadmap snapshot + bug batch (B1, B5, B6, B7) (#13)
2026-05-04fix(nav): nick chip → /account; nick page pre-fills current nick (#14)
2026-05-04feat(account): phase 2 — server-stored profile + JWT bridge (#15)
2026-05-04feat(account): phase 3 — match + solo persistence in D1 (#16)
2026-05-04feat(mvp): cleanup + Glicko ELO + /history page + passkey support (#17)
2026-05-04fix(partykit): friend-invite log surface jose error message (#18)
2026-05-04fix(invite): preserve deep-link query params across nick redirect (#19)
2026-05-04docs: spec for multi-choice quiz game mode + roadmap entry (#20)
2026-05-04feat: multi-choice game mode (Drupal/PHP quiz) (#21)
2026-05-04fix(partykit): add drupal-php and drupal to KNOWN_CATEGORY_IDS (#22)
2026-05-04feat: in-app feedback forms (general + per-question) with Resend (#23)
2026-05-04fix(solo): use SoloRoundLog.category.id instead of fragile qid prefix derive (#24)
2026-05-04feat: user nationality + per-quiz skill scores (#25)
2026-05-04debug(solo): instrument skill upsert with stage tracking + try/catch (#26)
2026-05-04fix(solo): accept multi-choice numeric answers in submit-run validation (#27)
2026-05-04fix(csp): add worker-src 'self' blob: to allow canvas-confetti web worker (#28)
2026-05-04fix(quickmatch): filter CategoryPicker to HL-only categories (#29)
2026-05-04feat(ui): widen desktop layout + responsive fonts + MC question polish (#30)
2026-05-04feat(history): load-more buttons for matches + solo runs (#31)
2026-05-04feat(brand): rebrand DUELS → FASTDUELS + bump BrandLogo sizes (#32)
2026-05-04feat(i18n): migrate hardcoded locale ternaries to paraglide keys (#33)
2026-05-04feat(i18n): EN as default locale (no URL prefix) (#34)
2026-05-04fix(i18n): translate 10 PL keys that still showed English (#35)
2026-05-05docs(devops): CLI runbook for prod ops without CF dashboard (#36)
2026-05-05fix(ux): remove distracting stripes + fastduels CORS + mobile dvh (#37)
2026-05-05feat(multiplayer): enable multi-choice categories (Drupal, Drupal-PHP) (#38)
2026-05-05feat(domain): fastduels.com becomes PRIMARY, duelack.com → 301 (#39)
2026-05-05fix(mc): align option display-order with correctAnswer in pickers (#40)
2026-05-05ci: fix sqlite tests + auto-deploy web/partykit on push to main (#41)
2026-05-06feat(ux): sticky Play CTA on category picker + side-by-side red/green HL buttons (#43)
2026-05-06feat(ux): sticky game buttons during play + 2-row mobile header (#44)
2026-05-06feat(leaderboard): cross-pool global XP ranking + empty-state CTAs (#45)
2026-05-06feat(homepage): live stats — dueling now + today/all-time/countries/top category (#46)