Skip to content
What's new

Changelog

Every shipped round. Newest first. No marketing copy — just what actually changed.

Docs + transparency polish

r43

Public stats, expanded FAQ, searchable + deep-linkable API reference.

  • /stats public transparency dashboard — DB size, share activity, per-sport accuracy + OG image
  • Expanded /about FAQ with JSON-LD FAQPage schema (10 entries)
  • Searchable /api-docs with auth grouping + per-endpoint deep-link anchors
  • Homepage social-proof band links to /stats
  • Privacy + Terms pages refreshed to cover auth, cloud sync, share tokens, digest
docstransparency

Data portability + deletion

r42

Full user rights: export everything, delete everything, from /settings.

  • GET /api/user/picks/export — one-click CSV download of cloud-synced picks
  • GET /api/user/watchlist/export — JSON envelope for watchlist backup/restore
  • DELETE /api/user/account — self-serve account deletion, cascades every user_* row
  • Settings → Danger zone UI with type-to-confirm + native confirm double-check
  • Cloud export pill buttons added to the sync panel for one-click access
  • /privacy + /terms refreshed to document the new data-rights flow
privacyauth

Deploy-ready polish

r41

README rewrite, homepage social proof, community-activity counters, parlay parity.

  • Homepage share-counter band (renders only when totalShares > 0)
  • Parity pass on /pp/[token]: OG image, copy-as-markdown, Twitter card
  • README rewritten with env quick-start, endpoint list, architecture highlights
  • 530 passing tests across 76 files — every pure helper and route handler unit-tested
uxdocs

Ops surface + monitoring

r40

Public health, version, and aggregate counts endpoints + commit badge on /admin.

  • /api/status — cheap ok/integrations check, opt-in ?include=shares,db for rich data
  • /api/version — commit SHA + deployment id from Vercel env vars
  • /api/counts — aggregate DB + share counters with CDN caching, for external dashboards
  • Privacy-preserving share_counters table + atomic increment RPC + /admin panel
  • In-memory per-IP rate limiter on share endpoints with Retry-After header
apiopsmonitoring

Discoverability + polish

r39

Chord navigation, loading skeletons everywhere, robots + sitemap hardening.

  • Gmail-style g+letter chord nav (g p, g e, g b, g a, g r, g s, g c, g h)
  • Route-level loading skeletons for /brief, /edge, /accuracy, /ratings, /picks, /settings
  • RSS auto-discovery <link rel=alternate> on every page
  • robots.txt hardened: /p/, /pp/, /auth/, /signin, /admin, /offline disallowed + sitemap lockdown tests
  • Homepage social proof tile (renders only when shares > 0)
uxseo

Share system expansion

r38

Parlay share links + copy-as-markdown + public JSON APIs for integrators.

  • /pp/[token] signed 2–6 leg parlay shares with their own OG image and copy buttons
  • Copy-as-URL / Markdown / Plain-text on /p/[token] and /pp/[token]
  • GET /api/picks/shared/[token] + /api/parlays/shared/[token] for bot/dashboard integrators
  • Route-handler tests confirming 429 wiring + Retry-After header + per-IP isolation
shareabilityapi

Viral-ready shares

r37

Signed stateless URLs for picks and parlays, with previews that render everywhere.

  • /p/[token] signed single-pick links with HMAC-SHA256 (no database — the token IS the pick)
  • /pp/[token] multi-leg parlay links (2–6 legs) with joint/combined/edge frozen at share time
  • Branded 1200×630 OG images for both — Twitter, iMessage, Slack, Discord, WhatsApp all preview correctly
  • Copy as URL / Markdown / Plain text buttons on every shared page
  • Public JSON API: GET /api/picks/shared/[token] + /api/parlays/shared/[token]
  • PICK_SHARE_SECRET rotation revokes every outstanding link instantly
shareabilityapi

Picks page overhaul

r36

Four-dimensional filtering, sortable columns, mobile card layout, personal notes and tags.

  • Result × sport × tag × text search — all composable, with a single-click reset
  • Sortable headers on every column (client state on desktop, URL params on server views)
  • Mobile: dedicated card layout replacing the cramped table
  • Free-form note + custom tags per pick, cloud-synced independently so tag edits don't clobber graded results
  • Loading skeleton matching the real layout, not 'Loading…' text
  • Empty state when filters return 0 matches, with Clear-all CTA
picksux

Auth + cloud sync

r35

Optional sign-in keeps picks, watchlist, and preferences in sync across devices.

  • Magic-link sign-in + Google / GitHub OAuth providers
  • RLS-gated tables for picks, watchlist, prefs, profile — service role bypassed nowhere
  • Offline-first: localStorage stays the source of truth, cloud mirrors it
  • Merge semantics: newest savedAt + grade-aware tie-break; notes and tags reconcile independently
  • Post-sign-in redirect with safe-path validator (no open-redirect surface)
  • User menu in header, anon sign-in CTA on every picks-relevant surface
authpersonalization

PWA, digest emails, service worker

r34

Installable app with offline fallback, opt-in weekly email recap.

  • Service worker: shell precache + network-first navigation + stale-while-revalidate static assets
  • /offline fallback page for failed navigations
  • Push + notificationclick handlers scaffolded (no-op until VAPID lands)
  • Weekly digest via Resend — accuracy per sport, top edges, watchlist highlights
  • Vercel Cron config: outcomes every 3h, digest Monday 09:00 UTC
  • Opt-in toggle in Settings gated on auth + RESEND env
pwaemail

SEO + accessibility + discoverability polish

r33

Full JSON-LD schema graph, mobile bottom nav, keyboard cheatsheet overlay, cross-sport palette search.

  • JSON-LD: WebSite + Organization on home, SportsEvent on matches, SportsTeam on team pages, SportsOrganization on leagues, BreadcrumbList everywhere nested, FAQPage on /about
  • Mobile bottom nav (Brief / +EV / Picks / Accuracy / Settings) with iOS safe-area
  • ? hotkey toggles floating shortcuts overlay; input-aware so typing ? doesn't hijack
  • Command palette now fetches cross-sport team/league matches live with exact/startsWith ranking
  • Toast system replaces alert() across settings + picks flows
  • Sort-aware /edge with ?sort=, ?dir=, ?sport=, ?min= — every combination shareable
seoa11yux

Model transparency refinements

r32

Accuracy page gains trend + recent predictions + sport filter; bankroll becomes a real preference.

  • Rolling 30-match Brier/accuracy trend chart on /accuracy landing
  • Recent graded predictions table with hit/miss chips
  • /accuracy?sport=football|nba|tennis filter chips with live counts
  • Bankroll + Kelly fraction added to NotificationPrefs; /settings exposes both; KellyWidget hydrates + debounce-saves
accuracyprefs

Ship-readiness polish

r29

Privacy, terms, 404/error UX, enriched sitemap, footer nav.

  • Privacy + Terms pages
  • Stylish 404 with recovery chips
  • Polished error boundary with 3 recovery CTAs
  • Sitemap expanded from 9 to 22+ priority-ranked URLs
  • Footer reorganised with legal + help links
uxlegal

Public API + confidence badge + dev docs

r28

Open the platform to third parties; show model self-assessment on every match.

  • /api/analyses/[sport]/[matchId] — full analysis + line history + retrospective JSON
  • Confidence badge (high / moderate / low) on every match page
  • /api-docs reference page documenting all 8 public endpoints
apitransparency

Market transparency + syndication

r27

Line-movement charts and RSS feed.

  • Line movement chart on match page, driven by odds_snapshots
  • /api/feed.xml — RSS 2.0 feed of current +EV edges
transparencyapi

Pick self-analysis + personalised recs

r26

Tracking insights for bettors; watchlist-driven home.

  • Pick breakdown on /picks — by sport / market / odds range
  • Homepage 'Because you watch X' recommendations
pickspersonalization

Playwright, mobile nav, shortcuts

r25

Quality gate + better mobile experience.

  • Playwright smoke suite covering 10 critical click-paths in demo mode
  • Mobile nav drawer for narrow screens
  • /shortcuts reference page
uxinfrastructure

Per-sport briefs + live edge badge

r24

/brief/football, /brief/nba, /brief/tennis + header pill.

  • Sport-specific daily briefs
  • Live +EV count pill in the header
  • /api/brief?sport=X filter
brief

Shareability + contextual navigation

r23

OG cards everywhere, related matches, copy-to-clipboard share.

  • League OG images
  • Related-matches widget on match page
  • Share button with pre-formatted match summary
shareability

Command palette + team picker

r22

⌘K for navigation, autocomplete for team comparison.

  • Sitewide command palette (⌘K / /)
  • /api/teams/search endpoint
  • Team picker autocomplete on /compare/teams
ux

Watchlist-aware brief + team H2H

r21

Personalised brief block; side-by-side team comparison.

  • Watchlist block at top of /brief
  • /compare/teams side-by-side view with neutral-matchup preview
personalization

Gemini news cache + watchlist + methodology

r20

Real cost savings; follow teams; transparent model docs.

  • Persistent news_cache with kickoff-aware TTL
  • Watchlist for teams + leagues, localStorage-backed
  • /about methodology page
  • Fun stats on /picks (longest streaks, best/worst picks)
costpersonalizationtransparency

League pages + team OG + calibrator history

r19

Drill into any league; auditable model evolution.

  • /league/[sport]/[leagueId] landing pages
  • Team OG images
  • calibrator_history table + /accuracy/history timeline
accuracyshareability

Team & league drill-downs

r18

Per-team / per-league accuracy.

  • League breakdown on /accuracy/[sport]
  • /team/[sport]/[id] dossier page
accuracy

Operational dashboards

r17

Health, trend, JSON feed for operators.

  • /admin system health page
  • 30-match rolling Brier + accuracy trend chart
  • /api/brief JSON endpoint
opsaccuracy

Daily brief + backtester + prefs

r16

One-scan daily view, scoring harness, user settings.

  • /brief curated daily view
  • scripts/backtest.ts — replay through current calibrator
  • /settings notification preferences
briefopsux

The model starts learning

r15

Nightly Platt calibration; bankroll curve; hot-streak badge.

  • Platt calibration with nightly fit + apply-at-predict
  • Bankroll cumulative curve with max-drawdown on /picks
  • Hot / cold streak pill on /accuracy/[sport]
modelpicks

Compare + per-sport deep accuracy

r14

Side-by-side matches + sport drill-down.

  • /accuracy/[sport] drill-down with league breakdown
  • /compare?ids= side-by-side match view
  • Top edges widget on homepage
uxaccuracy

Retrospective + feature breakdown

r13

How the model did; why the model leaned that way.

  • 'How the model did' retrospective panel on finished matches
  • 'Why this prediction?' feature breakdown
  • Recently graded calls on home
transparency

OG images, parlay, CSV, match search

r12

Shareable links, parlay math, history export.

  • Match OG images via Next ImageResponse
  • Parlay builder with correlation warnings
  • CSV export of picks
  • Client-side match search on sport pages
shareabilitypicks

Universal prop grading

r11

Every market grades through one deterministic resolver.

  • Asian handicap quarter-line half-win/half-push math
  • API-Football fixture stats → corners + cards facts
  • Tennis set counts ingested
  • Save-pick buttons wired on every prop UI
picksgrading
New rounds keep shipping. Subscribe to the RSS feed for live edge pings.