← Racket Social

Changelog

Every release of Racket Social, newest first. Generated from CHANGELOG.json at deploy time.

  1. v2.3.1-dev

    No notes recorded.

  2. v2.3.0
    • New "Rank|Games" player-chip display mode: chips can now show the player's current session-leaderboard rank and games-played count (e.g. 1|5) instead of the play-rate stats — ideal for competitive sessions where the top ranks should finish on the same number of games. Includes a "?" glossary explaining all chip display options (#793).
    • Fix player stats (games played, win %, last played, rating) showing "No matches yet" on every device except the one that recorded the sessions. Headline stats are now computed server-side and shipped with the club roster, so all devices in a club see the same numbers (#768).
    • Fix the "On Player Chips Show" toggle overflowing narrow phone screens: the four options now wrap onto two rows on small screens via a new wrap-safe toggle element (#796).
    • Lead-based leaderboard scoring: two new leaderboard columns — Lead Points (total winning margin across fully-scored games) and Relative Lead (margin as a share of points played) — plus a Games Played column, and a "?" glossary on the leaderboard settings explaining every available metric (#787).
    • Durable session sync: sessions are no longer silently lost when a push to the server fails. Session changes are queued in the persistent sync queue, retried until they succeed, pushed on club switch, and a session that never reached the server is created on the next sync instead of erroring (#697).
    • Fix the live court score card overflowing narrow phone screens: the two teams now stack vertically instead of being clipped off the right edge with long player names (#785).
    • Mark the Tournaments menu entry as Beta while the feature awaits a larger overhaul; the label is now translated in all 23 locales (#754).
  3. v2.2.0
    • Per-session score logging: each session can now record scores in one of three modes — Off, Winner only, or Full scores. Full mode adds a numeric score-entry UI (steppers with a live derived result and clear) on live courts, the round Scores screen, and match history; recorded scores persist to the server so members and the shared viewer see them (#770).
    • Condensed live score-entry cards: live courts use a tighter grid layout with the Win action in the middle, and winner-only mode gets its own compact card, so logging results during play costs less screen space (#781).
    • Configurable session leaderboard: pick which of six metrics (games, wins, win %, points, average points, ELO change) appear as leaderboard columns and star one as the default sort. The configuration syncs to the server so the shared session viewer respects it, and the session-setup Scoring section is refined with explainers and the leaderboard control folded in (#771).
    • Close the sole-member club trap: club owners can hand the club to another member via a new 'Make owner' action (atomic ownership transfer), and the only member of a club can now delete it from the Leave flow instead of being stuck as its last owner (#748).
    • Fix sessions missing their start time: session.startedAt is now stamped by the reducer on every path that starts a session, and legacy sessions stuck with a null startedAt are healed from createdAt whenever they enter local state (#765).
    • Fix the Edit Session modal's nested scrolling: the sheet now owns a single scroll area with a pinned header and no horizontal overflow (#755).
    • Internal: regression tests pinning singles matches in the statistics rebuild and interaction matrix (singles record opposition without pairings), plus investigation notes on the algorithm root cause (#750).
    • Show live session statistics during an active session. A new collapsible "Session statistics" card sits between the Roster and the Match History on the active session screen, surfacing Win %, Session ELO, Total ELO, and ELO change for in-flight rounds (it was previously only visible once the session ended). Collapsed by default; tap the header to expand (#745).
    • Fix tournament standings ignoring drawn matches. A match recorded as a draw was treated as unplayed, leaving both participants showing P=0 / D=0 with no points; draws now count as played and award the draw points to both rows (#752).
    • Fix the round Scores screen pre-highlighting "A Win" on every court, which risked saving an unreviewed result. Each court now defaults to an explicit "Not Scored" pill, so Save stays gated until you deliberately rate every played court (#757).
  4. v2.1.2
    • Fix the Edit Session sheet (and every other bottom-sheet modal) closing itself mid-scroll. The swipe-to-dismiss gesture is now scoped to the sheet's grabber handle instead of the whole sheet, so scrolling tall content inside the sheet no longer triggers a dismiss (#751).
    • Fix the Scores screen showing a useless A / Draw / B toggle for empty courts and disabling Save until you rated them. Empty courts (no players assigned by the round generator) are now hidden from the Scores view, persisted with no result, and ignored by the Save gate (#758, #747).
  5. v2.1.1
    • Fix club-mode data loss where a member's roster, sessions, and leaderboard could vanish after login ("your club is empty" with the players briefly flashing on refresh). An empty server roster is now treated as a sync gap rather than a mass deletion, so it no longer reaps local rows or blanks the visible roster; the legacy roster rehome survives a transient per-player push failure and retries the stragglers; and a club switch restores its pre-switch snapshot if the new roster fails to load.
  6. v2.1.0
    • Disable email/password auth and rewrite demo sign-in via magic-link to close the cross-provider account-linking takeover documented in #724. Block demo users from accepting club invites or claiming players via a new requireNonDemoUser middleware.
    • Rate-limit the public auth, invite-preview, shared-session, and admin invite-create endpoints (in-memory, per-IP/per-email/per-user) to blunt credential stuffing, magic-link spam, and share-code/invite-token enumeration (#727).
    • Add an unauthenticated GET /api/version endpoint returning the running version, commit, and environment for deploy verification.
    • Introduce the deterministic severity-driven version scheme: every Unreleased change is labelled patch|minor|major and the release auto-selects the largest.
    • Fix dark-mode contrast on the privacy-policy banner link; style the club overview, invite-accept, and claim-accept screens; let invite/claim sign-in use Google or email magic-link (#687).
    • Club roster /players now reflects the server live, supports Add and Remove (×) with confirm. New player.deleted_at column + erasePlayerForClub helper preserve the game_rating_snapshot ledger per ADR-0013. Legacy pre-clubs IDB players are rehomed to the user's default club on first init (ADR-0015).
    • Club switch no longer blocks on a stale 'open session' pref; sessions are pushed to the server unconditionally and re-pulled on switch; new manual Close action and 2-hour auto-close for forgotten active sessions on /sessions (#693).
    • Club switcher surfaces sync/offline state proactively via a 4-state cloud-glyph chip; new panels explain syncing, sync-failed (with discard escape), offline, and un-synced-offline states (#702).
    • Player overview redesign: rating, games, win % and last-played on the row; tap-to-open detail sheet with stats, relationships and admin actions; Retire/Restore (admin-only, reversible); search + sort + filter chips; offline-aware affordances (#700).
    • Club Member tier with invite links (single-use / open, selectable expiry), auto-membership on claim, new Assign claim policy, and member session access (#716).
    • Security: remove the hardcoded E2E test-user credentials and admin-email allowlist from source. E2E user is now seeded only outside production and only when `E2E_USER_EMAIL`/`E2E_USER_PASSWORD` are set; admin allowlist is driven by `ADMIN_EMAILS` (#722).
    • Security: add baseline security headers to all server responses — Strict-Transport-Security (HSTS), X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy, and a report-only Content-Security-Policy to gather violations before enforcing (#726).
    • Between-rounds session screen redesign: the post-round screen shows an inline Roster with Active and Unavailable sections, tap-to-toggle chips, an Add-player chip, and long-press to rename. A sticky action footer pins End session and Generate next round to the viewport bottom, with a 'N of M playing' summary on the generate button when not everyone fits on a court. SetupBar promotes the session date to an h1 above its action chip row. Backed by a unified PlayerChip visual used across the whole session (#737).
    • Fix: on long sessions the End Session / Generate Next Round action bar no longer overlaps the Match History — buttons live above the history in normal document flow, and the Start Session bar is pinned with position:fixed so it survives outer-document scroll. Round Preview chrome restored on Roster and Match History (#741).
  7. v2.0.0
    • Tournament mode — flip the new toggle in the top nav to run organised tournaments alongside social play. Round Robin singles (each player plays every other) and League Doubles (you pair players up, pairs play each other round robin) are fully supported.
    • Create a tournament with a name, courts, and format, then build the roster from your player chips. Players you select fill the pair grid for doubles — tap two players to swap their pair before generating fixtures.
    • Live preview shows total matches, time slots, and matches per player as you adjust the roster, courts, or match type.
    • Generate fixtures with a single tap. Engine respects court count: when there are more matches per round than courts, rounds split into multiple slots so players rotate properly.
    • Record results per match using the inline A / Draw / B picker — same UX as a social session. Walkovers are supported via the overflow menu when someone can't play.
    • Standings table updates live as results come in. Player ratings (Elo via openskill) update too, so tournament play counts toward the same leaderboard at /leaderboard.
    • Tournament locks the roster on the first result entered — the format and player list freeze so standings stay consistent. Made a mistake? Admin can Unlock to clear all results and start over.
    • Doubles support: League round robin with fixed pairs. Pair stays together for the whole tournament; pairs play every other pair once. Standings track wins per pair.
    • Internal: new schema columns for tournament_format, roster_locked_at, slot_number, match_size, result, walkover, and player_ids; new /api/tournaments router with writer-locked entries/matches/result/unlock endpoints; new client engine modules (scheduling, previewSchedule, formats/roundRobin, tournamentRatings); new components (MatchTypeToggle, ActivePlayerChips, PairGrid, SchedulePreview, FixtureList, StandingsTable, MatchResultPicker, UnlockButton, Toast); writer-lock auth + COALESCE lock idempotency.
    • Tournament mode is gated by the TOURNAMENT_MODE_ENABLED server env var. Staging has been on since D3a; this release flips it on in production.
  8. v1.12.2
    • Fix: accepting a club invite no longer reverts to your personal/own club after a page reload. The active club selection is now restored from preferences on app launch, so admins joining via an invite link stay in the new club.
  9. v1.12.1
    • Fix: club invite links (`/invite/<jwt>`) returned 404 because the SPA fallback treated the JWT signature segment as a file extension. Asset-extension check now uses an allowlist.
  10. v1.12.0
    • Club Mode (preview): clubs are now first-class. Sign-in provisions a default club, and you can manage roster, settings, and members from a club-scoped UI.
    • Owners can invite admins via shareable invite links (signed JWT, with preview surface) and revoke them. Per-club quotas enforced for players and admins, with a usage strip so you can see how close to the limit you are.
    • Owners can rename their club inline from settings. The 'Leave this club' button is hidden for the only owner, with a hint pointing to a future promote-member flow.
    • Tournament mode foundations: ADRs published for tournament-as-session-mode, pairing engine, anonymous signup, and roster-lock state machine (no UI yet).
    • Internal: club quota schema, club_mode feature flag retired, default-club backfill migration, session-ownership transfer on user delete, sole-owner protection on club leave.
    • Internal: documented CLUB_INVITE_JWT_SECRET env var (required for invite issuance).
  11. v1.11.8
    • Refreshed marketing site (racketsocial.app): new hero, six feature cards covering leaderboard, shared sessions, PWA + offline, multi-session, skill-balanced courts and multi-language; six recaptured screenshots from the current app.
    • New public changelog page at racketsocial.app/changelog/, regenerated from CHANGELOG.json on every push to main so every release is visible.
    • FAQ: added 'Is Racket Social actively developed?' linking to the new changelog page.
    • Site: removed stale screenshots and the dead 'Recently Shipped' section; sitemap updated.
  12. v1.11.7
    • Translations: significantly improved coverage and accuracy across all 23 supported languages. ~86 missing keys filled in per language, with glossary enforcement so sport-specific terms (court, session, match, etc.) translate consistently.
    • Translations: fixed wrong-meaning words in three languages — German now uses 'Spielrunde' instead of 'Sitzung', Arabic 'ملعب' instead of 'محكمة' (which means 'tribunal'), and Tagalog 'Court' instead of 'Korte'.
    • Internal: glossary is now injected into both build-time bulk translation and runtime on-the-fly translation paths, so terminology stays consistent regardless of how a string is translated.
    • Internal: added an apply-translations helper script for the translations workflow.
  13. v1.11.6
    • Fix: light and dark theme now apply consistently across the app, including the public shared session viewer (/shared/...) which previously inherited whatever theme the last logged-in user had set.
    • Fix: the session title in the shared session header is now legible in both themes (it was barely visible in light mode and tinted incorrectly in dark mode).
    • Fix: the Sessions home screen no longer has fragments stuck in dark mode when the rest of the page is light — the last-session card, collapsed rows, swipe rename action, section headers, and expanded card text now follow the active theme.
    • Fix: the resume and delete confirmation sheets on Sessions now follow the active theme instead of always rendering dark.
    • Internal: standardised hardcoded colours throughout the client CSS to use semantic theme tokens, with a brief contributor reference at the top of index.css.
  14. v1.11.5
    • Home screen tidy-up: /welcome and /sessions are now a single home screen at /sessions. Old /welcome links keep working via redirect, but everything lives in one place now.
    • Fix: the 'Players' label in the setup dropdown was showing a raw translation key in English in some cases — now displays correctly.
  15. v1.11.4
    • Session settings redesigned: Edit Session is now organised as Name → Courts → Players → Share → Advanced, with a featured Share card (148px QR, save-as-PNG, WhatsApp share) and a collapsible Advanced section for matchmaking, chip display, and the new auto-rotate sitting-out option.
    • Players section visual refresh: clearer active/sitting-out chips, legend, and count status.
    • New auto-rotate sitting-out option: when enabled, the matchmaking algorithm prefers rotating the bench so the same players don't keep sitting out.
    • Inline confirmation prompt when changing courts or format mid-round, so accidental taps no longer disrupt a live game.
    • Fix: starting a game now cancels any in-progress player switch, so the live match no longer shows stale green/highlight chips from an incomplete swap.
    • Fix: filled in missing English translation strings that were leaving raw keys visible in places.
  16. v1.11.3
    • Internal: disabled the auto-trigger on the Play Store deploy workflow. AABs are being built manually until the CI flow is reliable; merges to main no longer produce red checks.
  17. v1.11.2
    • Internal: Play Store deploy workflow now bypasses an interactive Bubblewrap prompt that was preventing CI from building the AAB. No user-facing changes.
  18. v1.11.1
    • Refreshed branding: new logo across the PWA, marketing site, browser favicon, Apple touch icon, and the Android splash screen. Canonical SVG now lives in the repo so future updates regenerate every asset from one source.
    • Play Store assets ready: high-res icon and 1024x500 feature graphic produced for the upcoming store listing.
  19. v1.11.0
    • One-tap demo sign-in: typing demo@racketsocial.app on the magic-link form signs you in immediately without an email. Each IP gets its own isolated account, auto-populated with 20 sample players (Alice through Tom). Demo accounts reset every 14 days.
    • New /data-deletion guide at racketsocial.app/data-deletion explaining how to delete your account or any subset of your data, with a matching FAQ entry on the landing page.
    • Fix: privacy policy, terms, cookies and the account-deletion page now load without signing in — required for Play Store compliance and for users discovering legal pages from external links.
    • Fix: client-side routes such as /delete-account now respond correctly to URL checkers and link previews (no more 404s for non-browser clients).
    • Privacy policy updated to describe the demo account flow and the IP-derived user identifier.
  20. v1.10.0
    • Home screen redesigned as a session index — see all your sessions at a glance, with a clear warning when one has gone stale.
    • Stale sessions are now detected and auto-bounced — no more zombie sessions hanging around in the background.
    • Public account-deletion page at /delete-account — sign in and remove your account in two clicks, or contact support if you've lost access.
    • Fix: the player-chips visibility toggle now updates instantly when you tap it.
    • FAQ section added to racketsocial.app to help new users (and AI search) find common answers.
  21. v1.9.0
    • Multi-language support with translations for 22 languages.
    • Legal pages (privacy, terms, cookies) now translated to all supported languages.
    • Globe indicator on Settings when a custom language is active.
    • Simplified Chinese translation improvements based on native speaker feedback.
    • Default player names now use the selected language.
    • Sitting Out widget header and match status badge now translated in all languages.
  22. v1.8.1
    • Session statistics panel accessible during active sessions.
    • Session configuration moved to a dedicated view within the session screen.
    • Fix: iOS PWA header and menu now display correctly below the notch/status bar.
    • Fix: player names in shared session viewer now resolve correctly.
    • Fix: inactive players are no longer included when creating new sessions.
    • Fix: new sessions now default to the configuration view.
    • Fix: removed broken mixed court mode option from session setup.
    • Fix: toggle button clicks no longer swallowed by input blur.
  23. v1.8.0
    • Google Play Store support via Trusted Web Activity (TWA) with adaptive icons, splash screen, and CI/CD pipeline.
    • Per-session leaderboard with sortable columns.
    • Delete individual sessions from the sessions list.
    • Fix: statistics view now sources matches from sessions instead of empty legacy array.
    • Fix: "Delete All" in settings now correctly deletes all sessions.
    • Fix: properly-sized PNG icons and manifest for Play Store compatibility.
  24. v1.7.0
    • Magic link login: sign in with just your email — no password or signup form needed.
    • Skill-balanced matchmaking: opt-in toggle to factor player ratings into court assignments.
    • Sentry error tracking for client and server.
    • Fix: server-side account deletion now works for GDPR compliance.
    • Fix: shared session link no longer crashes when skill rating columns are missing.
  25. v1.6.0
    • Elo ratings: TrueSkill-based player ratings displayed on chips, leaderboard, and shared session stats.
    • Shared session viewer: player names and Elo ratings now display correctly.
    • Share panel moved into Settings section of setup dropdown with compact QR code.
    • Player chip display toggle (Nothing / Session Statistics / Player Rating) with default set to Rating.
    • Fix: stale session banner now disappears when clicking Continue or New Session.
    • Fix: smart launch redirect works reliably after OAuth login.
  26. v1.5.3
    • Add GDPR-compliant privacy policy, terms of service, and cookie policy pages.
    • Add data export (JSON download) and account deletion in Settings.
    • Production cutover runbook for Fly.io migration.
  27. v1.5.2
    • Fix: /players page no longer redirects to active session on reload.
    • New player dialog defaults to 'Player N' name.
    • Updated player management help text for session-based workflow.
  28. v1.5.1
    • Update GitHub Actions to Node.js 24-compatible versions (checkout v6, setup-node v6).
    • Replace Pendo analytics with Amplitude.
  29. v1.5.0
    • Single-screen session experience: manage setup, rounds, scores, and history on one scrollable screen.
    • Match lifecycle as expandable cards: generate round, start game, log scores — all inline.
    • Post-session stats: see rounds played, matches won, and win rate per player after ending a session.
    • Retroactive score logging: add scores to past rounds from the match history.
    • Context-aware end session: end a session from any state with appropriate prompts.
    • Previous sessions accessible via Sessions menu item.
    • Removed bottom navigation bar and old multi-screen session flow.
  30. v1.4.1
    • Update Supabase configuration for Vercel integration with automatic branching.
    • Staging and PR preview deployments now use Supabase branching for isolated environments.
  31. v1.4.0
    • Every game state now has its own URL for deep-linking and browser navigation.
    • Session URLs: /sessions/:id/setup, /play, /play/preview, /play/live, /play/scores, /summary.
    • Legacy /matches route redirects to /sessions.
  32. v1.3.0
    • Migrate player IDs from sequential numbers to UUIDs for session sharing.
    • Add displayOrder field for UI badge display ordering.
  33. v1.2.4
    • Fix players disappearing when marking them away during game editing.
    • Game editing now uses session-scoped state instead of global player availability.
    • Fix high severity tar dependency vulnerability.
  34. v1.2.3
    • Fix match generation stalling when players fewer than total court capacity.
    • Add ESLint and Prettier for consistent code style.
    • Add automated GitHub releases on merge to main.
    • Add project milestones and versioning strategy.
  35. v1.2.2
    • Fix player rename in session edit view.
  36. v1.2.1
    • Bug fix for player duplication in session.
  37. v1.2.0
    • Introducing session mode as a basis for scoring, leaderboards and sharing.
  38. v1.1.4
    • Debugging only update. No user-facing changes.
  39. v1.1.3
    • Players can be moved to sit out without a replacement player being selected.
  40. v1.1.2
    • Fix overscroll bug when dragging down screen on mobile.
  41. v1.1.1
    • Add statistics view on Player chip in matches list.
    • Fix algorithm bug causing uneven distribution of sit-outs.
  42. v1.1.0
    • Login with Google account is requried as we start data syncing.
    • Bug fixes to avoid identical match id.
  43. v1.0.8
    • Improved game generation algorithm and UI flow.
  44. v1.0.7
    • Improved UI for sitting out.
  45. v1.0.6
    • Moved Configuration data to cloud storage.
    • Added Supabase integration for cloud storage.
  46. v1.0.5
    • Added data version management and migrations.
  47. v1.0.4
    • Add analytics consent banner on first load.
    • Store analytics consent in local storage.
    • Update config view to allow toggling analytics consent.
    • Clear analytics data when user withdraws consent.
  48. v1.0.3
    • Simplify manifest.json version to incorrect update alerts.
    • Add script to build process to ensure single canonical version source.
  49. v1.0.2
    • Add Tracking and Analytics Consent Banner
    • Tidy up About page.
  50. v1.0.1
    • Themeing cleanup and mobile view improvementns.
    • Algorithm improvements to reduce consecutive sit-outs for players.
    • Alogrithm improvemetns to balance sitout rate over count of matches played.
    • Version information now sourced from package.json
  51. v1.0.0
    • Initial release
    • Player management system
    • Court assignment optimization
    • Match scheduling with simulated annealing algorithm
    • Statistics and analytics
    • PWA support with offline functionality