Docs + transparency polish
r43Public 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
r42Full 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
r41README 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
r40Public 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
r39Chord 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
r38Parlay 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
r37Signed 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
r36Four-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
r35Optional 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
r34Installable 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
r33Full 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
r32Accuracy 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
r29Privacy, 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
r28Open 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
r27Line-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
r26Tracking 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
r25Quality 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
r23OG 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
r21Personalised 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
r20Real 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
r19Drill 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
r18Per-team / per-league accuracy.
- League breakdown on /accuracy/[sport]
- /team/[sport]/[id] dossier page
accuracy
Operational dashboards
r17Health, 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
r16One-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
r15Nightly 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
r14Side-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
r13How 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
r12Shareable 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
r11Every 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