Changelog
New features, security improvements, and bug fixes for TableTop Prime.
August 2026
Player Statistics page
Dedicated /stats page showing global tournament statistics: total events, wins, average placement, and win rate donut chart. Stats grouped by board game. Removed the inline stats from the Account page for a cleaner, dedicated experience.
Event filters on My Events
Filter events by role (Organizer, Judge, Player) and status (Active, Draft, Finished). Client-side filtering with toggle button groups.
BGG search improvements
Search results increased from 20 to 50. Results now sorted by relevance (exact match first, then starts-with, then by year). Selecting a game now auto-fills the min/max players per table.
Companion table selection fix
The Player Companion now correctly shows the player's assigned table instead of defaulting to table 1. When the organizer regenerates a round or reassigns a player, the companion automatically switches to the new table.
BGG search switched to local dataset
Replaced the live BGG XML API (which was returning 502 errors due to rate-limiting) with a local JSON dataset of 47,844 games. Search is now instant (< 5ms) with no external dependencies.
Standardized share buttons
Share dropdown now consistently shows: Share link, Show QR code, Copy standings text, Copy pairings text — in the same order everywhere.
Google AdSense integrated
Google AdSense auto-ads are now live. The script loads only after the user accepts "all cookies" in the consent banner — no ad cookies before consent. Privacy Policy, Terms of Service, and Cookie Policy updated with advertising sections including opt-out links.
BoardGameGeek integration
Organizers can now search the BoardGameGeek database directly from the event creation and edit dialogs. A "Search BGG" button opens a dialog where you type a game name, search, and select from results. The selected game name auto-fills the form. Uses a server-side proxy with 24h caching to avoid BGG rate limits.
Cookie consent banner
Added a GDPR/LGPD-compliant cookie consent banner. Users can choose "Accept all" (enables analytics + future advertising) or "Essential only" (auth + theme only). Vercel Analytics is now gated behind consent — no tracking cookies before the user agrees. A consent manager on the /cookies page lets users change their choice at any time.
Critical security fixes
Fixed role-escalation vulnerability where any user could set themselves as ORGANIZER. Removed cross-event IDOR on player and judge-call routes — all updates now scoped by (id, eventId). Added status whitelist and numeric range checks on PATCH event.
Strengthened event codes
Event codes now use crypto.getRandomValues() with an 8-char suffix (~40 bits of entropy, ~1 trillion combinations) instead of the previous 3-char Math.random() suffix (~20 bits).
CSV formula injection prevention
CSV export now neutralizes cells starting with =, +, -, @ by prepending a single quote — prevents spreadsheet formula execution from player names.
Security headers + error boundaries
Added HSTS, X-Content-Type-Options, X-Frame-Options, Referrer-Policy, and Permissions-Policy headers. Added error.tsx, global-error.tsx, and not-found.tsx so uncaught errors show a recovery UI instead of a white screen.
Procedural event banners
Every event now has a unique, procedurally generated SVG banner derived from (eventId + seedOffset). 12 curated palettes × 6 pattern families (mesh, topographic, bokeh, geometric, waves, stipple). Organizers can reroll with one click.
Event description + multi-date schedule
Organizers can add a plain-text description and multi-date schedule to each event. Displayed on the dashboard, My Events cards, and the public share page.
Bonus round improvements
Bonus rounds now use the 1001+ numbering range (no collision with regular rounds). Added parentRound association, delete capability, and organizer UI for creating bonus rounds tied to a specific regular round.
Full internationalization (en + es)
All ~700 user-visible strings internationalized. Browser language auto-detection on first visit. Dynamic <html lang> attribute. CSV headers translated. 705 keys in each language, verified by i18n-check script.
OG image + PWA manifest + JSON-LD
Social share cards now show an OG image. Per-event generateMetadata on share pages. manifest.json for Add to Home Screen. Organization + WebSite structured data for Google rich results.
Dropped/re-added player bug
Fixed bug where players dropped from a previous round and re-added would be dropped again on the next round. The previouslyDropped computation now checks only the latest round instead of unioning all rounds.
Score permission model
Players can now only score their own table. Self-confirm is blocked — another player or organizer must confirm. Organizers can lock scores directly via Quick Score.
Ready for Next Round implemented
The Ready toggle now persists server-side via PATCH /api/events/[eventId]/players/[playerId] with { ready: boolean }. Previously was a local-only no-op.
Share page table redesign
Share page tables now show players as a vertical list. Locked tables get a faint green background + placement badges (gold/silver/bronze).
Warm color scheme
Replaced pure white backgrounds with warm off-white (oklch 0.985 0.002 75). Darkened muted-foreground for WCAG AA contrast. Fixed amber-600 text to amber-700 on light backgrounds.
Mobile overflow + WCAG fixes
Fixed tiebreaker row overflow on 375px screens. Bumped icon-only buttons to 36px minimum touch targets. Added aria-labels to all icon-only buttons. Fixed password show/hide toggle accessibility.
July 2026
Initial production release
TableTop Prime launched with tournament management, dual-score verification, judge dispatch, CSV export, event templates, Supabase Auth (Google OAuth + email/password), and real-time judge call queue.
© 2026 TableTop Prime. All rights reserved.