Jennie Score

JENNIE SCORE

v0.9.69

Smart Soccer Predictions

Release Notes

Track product updates, fixes, interface changes, and deployment milestones.

v0.9.69

Live preview score-source fix

Fixed

Live preview score-source fix

  • Fixed regulation-time preview logic so normal live matches no longer show ET/PEN unavailable state.
  • Preserved ET/AET/PEN safety by using regulation score for standard market previews.
  • Replaced the generic live dot with a pulsating `PEN` indicator during penalty shootouts.
v0.9.68

Match timeline event polish

Improved

Match timeline event polish

  • Polished missed penalty rows in MatchModal so the `missed PEN` label appears under the player name.
  • Kept missed penalties visible with the crossed-ball marker without advancing the running score.
  • Improved non-counted event handling for VAR/cancelled-goal timeline events where provider data is available.
v0.9.67

Missed penalty timeline display

Improved

Missed penalty timeline display

  • Added missed penalty events to MatchModal Goals & Cards timelines.
  • Displayed missed penalties with a compact crossed-ball marker without advancing the running score.
  • Preserved official fixture score consistency for match timelines.
v0.9.66

Match timeline score consistency fix

Fixed

Match timeline score consistency fix

  • Fixed MatchModal Goals & Cards timelines so event-derived running scores cannot contradict the official fixture score.
  • Improved handling for cancelled/disallowed goal events in match timelines.
  • Preserved official score display as the source of truth.
v0.9.65

Regulation-time preview fix

Fixed

Regulation-time preview fix

  • Fixed prediction preview so standard markets do not calculate extra-time or penalty goals.
  • Added safer handling for ET/PEN fixtures where regulation score is unavailable.
  • Preserved AET/PEN score display as match context only.
v0.9.64

Home settled score display polish

Improved

Home settled score display polish

  • Added AET/PEN-aware score display to Home Best Settled Predictions.
  • Improved team and score highlighting so winners are bright and losers are dimmed.
  • Reused existing match score/result formatting where possible.
v0.9.63

Compact Knockout Bracket Scroll Rail

Fixed

Compact Knockout Bracket Scroll Rail

  • Compactified the Knockout Bracket top horizontal scroll rail.
  • Preserved the dark/cyan themed rail and synchronized bracket scrolling.
  • Confirmed the rail is fully visible and unclipped on desktop and mobile.
  • No bracket data, connector, scoring, or standings behavior changed.
v0.9.62

Polished World Cup Knockout Bracket

Improved

Polished World Cup Knockout Bracket

  • Added the full World Cup knockout bracket scaffold from Round of 32 through Champion.
  • Added connector lines between knockout rounds on desktop.
  • Added a themed top horizontal scroll rail for wide bracket navigation.
  • Reduced excess blank space below the bracket by compacting later-round placeholder columns.
  • Applied winner/loser color styling to finished knockout matches, including score styling.
  • Made Knockout Bracket the default subtab in the Standings section.
  • Updated Overview Tournament Progress to include and activate Round of 32.
  • Group Stage and Qualified Teams tabs remain unchanged.
v0.9.61

World Cup Round of 32 Bracket

Fixed

World Cup Round of 32 Bracket

  • Added Round of 32 support to the World Cup Knockout Bracket renderer.
  • Existing World Cup Round of 32 fixtures now render in the Knockout Bracket tab.
  • The bracket no longer shows "Bracket data not yet available" when Round of 32 fixtures exist.
  • Group Stage and Qualified Teams tabs are unchanged.
v0.9.60

World Cup Standings Replacement Guard

Fixed

World Cup standings replacement guard

  • Added a World Cup standings replacement guard.
  • Incomplete API-Football standings responses can no longer overwrite complete World Cup 2026 group standings.
  • Restored World Cup 2026 standings to Groups A-L / 48 teams via one targeted refresh.
  • Confirmed parser was correct; the issue was unsafe replacement after a temporary partial provider response.
  • No broad sync, odds sync, or prediction job was run.
v0.9.59

Hardened Release Notes Guard

Improved

Release deployment checks now guard web builds and local commits

  • Release deployment guard is now enforced during web prebuild, and local commit hook support was added so version/release-note changes are checked before commit.
v0.9.58

Finished Match Market Card

Improved

Finished Match banners show the stored market

  • Finished Match banners now show the bet market card, using existing stored overlay market data.
v0.9.57

Finished Match Banner Refresh Policy

Fixed

Finished Match banner automation refreshes to the latest settled winner

  • Finished Match banner automation now refreshes to the latest qualifying winning settled match instead of being blocked by an existing active Finished Match banner.
v0.9.56

Hero Banner Market KPI Value Fix

Fixed

Hero banner Market KPI now requires a real market value

  • Fixed Market KPI value fallback showing "Market" when banner overlay data has no real market value.
  • Market KPI now shows only real market values or is hidden when unavailable, including aggregate fixture banners with many markets.
  • Protected market terms remain English; no admin changes; no DB changes.
v0.9.55

Banner KPI Card i18n Fix

Fixed

Homepage banner KPI/stat card labels now translate to Bahasa Indonesia

  • KPI labels PREDICTOR, SELECTION, CONFIDENCE, PREDICTIONS, PREDICTION, RESULT, BEST AI BET, GOALS, TEAM, LEAGUE now display in Indonesian: PREDIKTOR, PILIHAN, KEYAKINAN, PREDIKSI, HASIL, TARUHAN AI TERBAIK, GOL, TIM, LIGA.
  • Handles both UPPERCASE and Title Case label variants produced by the DB overlay pipeline.
  • Protected betting/stat terms remain English: MARKET, STAKE, PROFIT, WIN RATE, ROI, P/L, ODDS, AH, BTTS, O/U, WIN, LOSE, DRAW, PUSH, HALF_WIN, HALF_LOSS.
  • Stat values (predictor names, team names, odds, market values) are never translated — only label text.
  • English display is completely unchanged via early-return guard in localizeBannerStatLabel().
v0.9.54

Home Banner i18n + User Guide Update

New

Bahasa Indonesia support for homepage hero banner carousel

  • Banner CTA buttons now display in Bahasa Indonesia when site language is set to Indonesian: Lihat Prediksi, Buka Prediksi, Lihat Hasil, Lihat Top Skor, Lihat Prediktor.
  • Banner type / eyebrow labels translate to Indonesian: Laga Unggulan, Prediksi AI Unggulan, Laga Selesai, Top Skor Unggulan, Sorotan Leaderboard AI.
  • Overlay stat label "Predictions" displays as "Prediksi" in Indonesian; all betting/stat terms (WIN RATE, ROI, P/L, Stake, Profit, Odds, AH, BTTS, O/U) remain in English unchanged.
  • DB-generated titles, subtitles, team names, player names, predictor names, and market labels are not translated — only safe UI labels are localized.
  • English display is completely unchanged.
Improved

User Guide updated with hero banner explanation

  • Home page section in User Guide now explains the hero banner carousel, banner story types, live stats, CTA button destinations, AI-generated visuals with UI-rendered text/stats, and automatic banner updates.
  • Both English and Bahasa Indonesia User Guide content updated.
v0.9.53

Release Deployment Guard

Improved

Release verification script to prevent stale web builds

  • Added scripts/verify-release-deploy.mjs: checks that apps/web/package.json version, APP_VERSION constant, and releaseNotes.ts newest entry all match before any deploy.
  • Added check:release-deploy npm script in apps/web — run before every tag to catch version/release-note mismatches early.
  • Added docs/release-checklist.md documenting when web, admin, and API rebuilds and restarts are required, including the permanent PM2 delete+start rule for Next.js deploys.
  • Prevents recurrence of the v0.9.52 stale-build incident where web-layer files were updated in source but apps/web was never rebuilt or restarted.
v0.9.52

Targeted Banner Regeneration

Improved

Admin Regenerate now targets the exact selected banner

  • Admin Regenerate button now regenerates the exact selected banner by database ID, not the broad banner type evaluator.
  • Old banner remains ACTIVE/READY until the replacement image is generated, validated, and inserted — no carousel gap.
  • New banner inherits all logical context (type, entity, fixture, league, title, overlay data, priority, display order) from the source row.
  • New banner metadata includes manual_regenerate flag, source_banner_id, regenerated_at timestamp, and original image URL for full traceability.
  • API returns structured result: status (completed/failed), source_banner_id, and replacement_banner_id.
  • Per-banner lock file prevents duplicate concurrent regeneration runs.
  • Admin confirmation copy updated to clearly communicate the safety guarantee.
v0.9.51

Release Notes Sync Guard

Fixed

Release Notes always up to date

  • Backfilled missing release note entries for v0.9.46–v0.9.50.
  • Normalized version prefix inconsistencies (bare 0.9.x → v0.9.x) that prevented entries from rendering.
  • Added validation script (scripts/check-release-notes.mjs) that checks current version has a release note entry, validates entry shape, and verifies newest-first order.
  • Wired validation into prebuild so future releases cannot silently ship without a release note.
v0.9.50

Manual Banner Admin Controls

New

Admin banner controls

  • Added manual admin controls for reviewing and managing banner state.
  • Expanded banner admin details so operational banner decisions are easier to inspect.
  • Kept release notes in sync with the current web app version.
v0.9.49

Banner Cleanup Scheduler

New

Scheduled runtime banner image cleanup

  • New wrapper script: scripts/run-home-banner-cleanup.sh — lockfile-guarded, timestamped logging, dry-run by default
  • Real delete requires explicit ENABLE_BANNER_CLEANUP_DELETE=true — safe by default even if misconfigured
  • Cron installer: scripts/install-home-banner-cleanup-cron.sh — idempotent, 04:30 WIB daily, marked block
  • Cron uninstaller: scripts/uninstall-home-banner-cleanup-cron.sh — removes only marked block, preserves all other entries
  • Optional env passthrough: MAX_STORAGE_MB, INACTIVE_RETENTION_DAYS, FAILED_RETENTION_HOURS, REJECTED_RETENTION_DAYS, ORPHAN_RETENTION_HOURS, BANNER_IMAGE_DIR
  • Safety: ACTIVE/READY/GENERATING images never deleted; DB rows never touched; path guard inherited from cleanup script
  • Banner Health Dashboard: cleanup log now surfaced in Event/Evaluator Health section (exists, mtime, last 10 lines)
  • Docs: home-banner-event-lifecycle.md updated with Scheduled Runtime Image Cleanup section
  • Note: cron installer requires host-level crontab access; run scripts/install-home-banner-cleanup-cron.sh on host VPS
v0.9.48

Read-Only Banner Health Dashboard

New

Admin: Banner Health Dashboard

  • New read-only Banner Health Dashboard at /admin/banners in Jennie Score Admin
  • Health cards: Public Banners, Active Visible, Ready, Missing Images, Runtime Storage, Cleanup Eligible
  • Sections: Public Carousel Health, Image Health (with disk-existence check), Runtime Storage, Cleanup Preview (dry-run only), Event/Evaluator Health, All Banners by Status
  • Backend: GET /api/admin/banner-health — read-only FastAPI endpoint, no write operations
  • Cleanup preview mirrors cleanup script logic in dry-run mode — no files deleted
  • Green/amber/red health indicators; desktop-first admin layout
v0.9.47

Banner Runtime Storage Cleanup

New

Runtime banner image cleanup

  • Add: safe runtime banner image cleanup script (scripts/cleanup-home-banner-images.mjs)
  • Retention: INACTIVE 7d, FAILED 24h, REJECTED 7d, orphans 24h; ACTIVE/READY/GENERATING never deleted
  • Safety: path guard, only .jpg/.jpeg/.png/.webp, refuses repo root / public dir
  • Default dry-run mode; DELETE_FILES=true required for real deletion
v0.9.46

Banner Image Routing Fix

Fixed

Banner image serving and carousel limits

  • Fix: banner images now served via FastAPI runtime static route (/banner-images/) — no longer depends on Next.js build-time public assets
  • Fix: post-build generated banners now always return HTTP 200 (previously 404 for images written after build)
  • Enforce: public carousel capped at max 5 banners with type-mix limits (max 1 FINISHED_MATCH, 1 AI_LEADERBOARD_SPOTLIGHT, 1 FEATURED_TOP_SCORER)
  • Enforce: FINISHED_MATCH TTL reduced from 48h to 24h; evaluator skips new generation when one already active
v0.9.45

Upcoming Fixtures — Total Stake Alignment

Fixed

Desktop TOTAL stake alignment

  • Fix TOTAL stake alignment: moved TOTAL inline with team names row on desktop for guaranteed vertical alignment
v0.9.42

Upcoming Fixtures — Total Stake & Team Name Fix

Improved

Desktop: Total stake aligned with team names row

  • TOTAL stake now aligns with team names row (Row 2) using invisible spacer matching league name height
  • Team names row is now flex-nowrap with overflow-hidden — no more wrapping to second line
  • Long team names truncate with ellipsis on desktop only
  • Mobile layout completely unchanged
v0.9.41

Banner Image Availability Guard

Fixed

Public API now hides banners with missing images

  • GET /api/home-banners excludes any banner whose image file is missing or zero-size on disk
  • Prevents 404 background images from appearing on the homepage
  • Root cause: Next.js production does not serve files added to public/ after the last build
Fixed

Generator/evaluator image guard

  • generate-home-banners.mjs and evaluate-home-banner-events.mjs now verify image file exists and has non-zero size before activating a banner
  • Invalid banners are marked FAILED instead of ACTIVE/READY
  • Guard-failed rows are excluded from candidate planning so they don't block replacements
v0.9.40

Repo Hygiene & Event Hook Safety

Fixed

Wrapper hardening: stable node path

  • run-home-banner-event.sh now resolves NODE_BIN via which node at startup
  • NODE_BIN passed explicitly into nohup background subshell (was PATH-dependent before)
  • Ensures evaluator runs correctly when triggered from Python subprocess in cron environments
New

Environment diagnostic script

  • New: scripts/check-home-banner-event-env.sh
  • Reports node, wrapper, log dir, evaluator, DB config, Gemini key — PRESENT/MISSING only
  • Never prints secret values
  • DB detection: checks api/.env (pydantic-settings auto-load) + shell env fallback
Fixed

Repo hygiene

  • Deleted leftover test/spike scripts: test-banner-generation.mjs, test-banner-policy-v12.mjs, test-banner-policy-v13.mjs
  • Deleted .bak files: favicon.ico.bak, logo.png.bak
  • Updated .gitignore: logs/, *.log, apps/web/.next/, tsconfig.tsbuildinfo, generated-banners/, *.bak, .banner-evaluator.lock
  • Removed apps/web/tsconfig.tsbuildinfo from git tracking (now gitignored)
  • Prompt policy docs left untracked for manual review
v0.9.39

Banner Evaluator Event Hooks

New

Banner event wrapper script

  • New script: scripts/run-home-banner-event.sh
  • Accepts EVENT_TYPE as argument or env var; defaults to manual
  • Supports DRY_RUN=true and BACKGROUND=true (nohup detached)
  • Logs timestamped start/end to logs/home-banner-events.log
  • Always exits 0; evaluator failures are logged, never propagated to caller
New

Event hooks wired into data jobs

  • api/cron_sync.py: fires fixture_sync and top_scorer_sync after successful sync run
  • api/cron_predict_settle.py: fires prediction_run, settlement_run, leaderboard_rotation after respective steps succeed
  • Best-effort background trigger: never blocks or fails the parent job
  • Per-step success flags: each event only fires if its corresponding step completed successfully
  • Batch trigger: multiple events fired sequentially in one detached subprocess
v0.9.38

Banner Lifecycle Activation Safety

Fixed

Public API minimum 3 banner guarantee

  • Homepage API fallback now includes READY banners AND future-ACTIVE rows when visible count < 3
  • Fallback ordered by active_from ASC so soonest-to-open rows are shown first
  • Image URL guard: banners with missing image_url are never returned to clients
  • active_until uses strict > instead of >= to avoid serving banners at exact expiry
  • No DB mutations in the API fallback path
Improved

Evaluator: future-active ACTIVE row promotion

  • Evaluator re-counts visible banners after READY promotion before capacity planning
  • If visible count still below MIN_ACTIVE_BANNERS: opens future-ACTIVE rows by setting active_from = now
  • If still below minimum after all promotions: forces first generation candidate to ACTIVE directly
  • Summary now shows: Visible active before/after, READY promoted, Future-active rows opened, Generated ACTIVE/READY separately
Improved

Evaluator: insert guard for future-ACTIVE banners

  • insert_banner DB command now downgrades ACTIVE → READY if active_from is in the future
  • Prevents future-ACTIVE rows from being inserted with generation_status=ACTIVE
New

Filesystem lock to prevent concurrent evaluator runs

  • acquireLock() / releaseLock() using .banner-evaluator.lock PID file
  • Stale lock (dead process) is auto-removed on next run
  • Lock not acquired in DRY_RUN mode
  • GENERATING status treated as duplicate blocker in pickCandidates()
v0.9.37

Event-Driven Banner Lifecycle

New

Event-driven banner lifecycle evaluator

  • New script: scripts/evaluate-home-banner-events.mjs
  • Supports EVENT_TYPE: manual, fixture_sync, prediction_run, settlement_run, top_scorer_sync, leaderboard_rotation, health_check
  • READY banner state: pre-generates banners before they are needed, promotes to ACTIVE when active_from arrives
  • GENERATING state reserved for in-flight generation slots
  • Safe deactivation: never drops below MIN_ACTIVE_BANNERS=3
  • Overlay-only refresh: updates stats without regenerating image
  • DRY_RUN=false / FORCE_REGENERATE=false as safe defaults
  • Future active_from awareness: capacity planning excludes banners opening soon
  • Clear lifecycle summary with active/ready before-after counts
Improved

Homepage banner API

  • GET /api/home-banners now includes generation_status in response
  • Fallback: includes READY banners when active count < 3
  • ?status= query param for admin/debug: returns banners by status without window filter
  • UTC_TIMESTAMP() used consistently for active window checks
  • Priority sort: priority_score DESC, display_order ASC
New

Banner lifecycle states migration

  • MySQL migration: generation_status ENUM expanded to include READY and GENERATING
  • Migration file: api/alembic/versions/202606170620_add_banner_lifecycle_states.py
v0.9.36

Banner Lifecycle Automation

New

Banner lifecycle automation

  • Expiration rules per banner type (FEATURED_MATCH, FEATURED_AI_PREDICTION, FINISHED_MATCH, FEATURED_TOP_SCORER, AI_LEADERBOARD_SPOTLIGHT, fallback)
  • Overlay-only refresh: update stats/confidence/stake without regenerating image
  • Duplicate active banner detection and safe deactivation
  • Fallback protection: never deactivate if generation fails
  • DRY_RUN=true support for safe planning without DB writes or image generation
  • BANNER_TYPE single-type filter alongside BANNER_TYPES
  • Image integrity check: regenerate only on missing/corrupt image or entity/prompt change
  • Clear lifecycle summary output (active before/after, deactivated, refreshed, generated, skipped, failed)
v0.9.35

Mobile Banner Polish

Fixed

Mobile homepage banner

  • All stat cards now visible on mobile (previously capped at 3)
  • 4-card banners use clean 2x2 grid; 5-card banners show final card full-width
  • Reduced mobile banner height and compact stat card sizing
Improved

Predictions and Results layout

  • Predictions page: desktop layout now starts at 1024px (previously 1280px)
  • Results page: desktop layout now starts at 1024px (previously 1280px)
v0.9.34

UI Fixes

Fixed

Team name & score per-team color on win/lose/draw

  • Home & Results: winning team name+score brighter, losing team dimmer, draw both bright
  • Footer Release Notes link color changed to #CDD4E2
  • Release Notes page bullet text color updated to #CDD4E2
v0.9.29

UI Polish

Improved

Home and Results UI polish

  • UI polish: release notes footer color, hero padding, predictor badges with avatars, settled prediction team colors, prediction status subtitle cleanup
v0.9.28

Banner CTA Scroll Position Hotfix

Fixed

Predictions Page Scroll

  • fixture-only deep link now scrolls to the top/header of the fixture card with 120px header offset.
  • fixture+market deep link preserves existing market-level scroll behavior.
  • Added data-fixture-id attribute to fixture card wrapper for precise scroll targeting.
Fixed

Leagues Top Scorers Tab Scroll

  • ?tab=top-scorers now scrolls to the tab navigation row (not past it into the table).
  • Uses separate tabNavRef on the tab button container with 90px header offset.
  • Same fix applies to ?tab=standings.
v0.9.27

Banner CTA Routing Refinement

Fixed

CTA Href Refinements

  • Featured Match and AI Prediction: removed &market= param from CTA links.
  • Finished Match: CTA now links to /results?date=YYYY-MM-DD (date only, no fixture modal).
  • Top Scorer: CTA now links to /leagues?league={id}&tab=top-scorers.
  • AI Leaderboard Spotlight: CTA now links to /predictors (not individual predictor profile).
  • Label changed from View Predictor to View Predictors.
New

Leagues Tab Deep-Link

  • Leagues page now supports ?tab=top-scorers and ?tab=standings URL params.
  • Navigating with ?tab=top-scorers auto-selects the Top Scorers section and scrolls into view.
Improved

AI Leaderboard Rotation

  • Leaderboard Spotlight now picks from top 5 profitable predictors (positive profit, >=3 settled bets, last 30 days).
  • Daily rotation: selection index = day_of_month % eligible_count.
  • Avoids always featuring the same #1 predictor every day.
v0.9.26

Banner CTA Routing Hotfix

Fixed

CTA Buttons Now Navigate Correctly

  • Root cause: entire banner slide was wrapped in a single Link, with CTA as a non-navigable span.
  • Fix: removed outer slide Link, CTA is now its own <Link href={banner.cta_href}> with stopPropagation.
  • Card-wide click uses router.push(banner.cta_href) scoped per banner — no shared variable.
  • Inactive slides get pointer-events-none to prevent accidental clicks.
Improved

Labels & Links

  • All CTA labels updated to title case: View Predictions, Open Prediction, View Result, View Top Scorers, View Predictor.
  • AI Leaderboard Spotlight now links to predictor profile /predictors/7 (Qwen 3.5 122B).
  • Stat label changed from Picks to Predictions on AI Leaderboard Spotlight card.
v0.9.25

Banner CTA, Token Format, Color Coding & AI Leaderboard

Fixed

CTA Deep Links

  • All banner CTA buttons now correctly use stored cta_href from API (no type-based override).
  • Featured Match and AI Prediction link directly to exact fixture with date + fixture + market params.
  • Finished Match links to exact Results page with date + fixture params.
Improved

Token Formatting

  • Token values now formatted as 9,999t with comma separators.
  • Stake shown as 13,970t or 2,200t. Profit shown as +227t or -230t.
  • Stake cards colored amber, profit/win green, loss red, confidence cyan.
New

AI Leaderboard Spotlight Banner

  • New banner type AI_LEADERBOARD_SPOTLIGHT replaces generic League Fallback.
  • Shows current top AI predictor (Qwen 3.5 122B — 6 wins, +3,221t profit, 8 settled bets).
  • CTA links to Leaderboard page.
  • Fallback chain: AI Leaderboard → Upcoming Fixtures Radar → League Fallback.
Fixed

Top Scorer Image

  • Generator prompt now uses generic striker silhouette/back-view, no fake identifiable player face.
  • Image regenerated for Y. Ayari (World Cup 2026, 2 goals).
v0.9.24

Banner Data Accuracy & Deep Links

Fixed

CTA and Overlay Accuracy

  • Featured Match CTA now points to correct Predictions page with date, fixture, and market.
  • Featured AI Prediction stake now shows real bet stake from bets table, not prediction count.
  • Finished Match banner now requires WIN/HALF_WIN settlement; losing bets are never shown.
  • Top Scorer selector now filters to active leagues (±30 days fixtures), preferring World Cup 2026.
  • League Fallback now includes standings data: top 3 teams per group with rank, points, and goals_diff.
Improved

Frontend Overlay Styling

  • Settlement results (WIN, HALF_WIN) now color-coded green (WIN) or amber (HALF_WIN).
  • Profit/loss tokens now styled green for positive, neutral for zero.
  • Losing finished-match banners are filtered out on the frontend.
  • Stake display: real tokens from bets, shows 'Pending' when no stake exists (no fake numbers).
v0.9.23

Production Home Banner Carousel

New

Live Banner Carousel on Homepage

  • AI-generated hero banners now display on the homepage using real match data.
  • 5 banner types: Featured Match, Featured AI Prediction, Finished Match, Top Scorer, League Fallback.
  • Auto-slides every 7s desktop / 6s mobile. Pauses on hover and after manual interaction.
  • Respects prefers-reduced-motion and pauses when tab is hidden.
  • Graceful fallback to current homepage if no banners are available.
New

Home Banners API & DB

  • New home_banners MySQL table stores banner metadata, overlay data, and generation status.
  • GET /api/home-banners returns active banners ordered by priority.
  • Banner generator script (generate-home-banners.mjs) creates real banners from live DB data.
v0.9.22

Updated logo and favicon

Changed

New Jennie avatar design

  • Updated logo and favicon to new Jennie avatar design.
v0.9.21

Bahasa Indonesia i18n Phase 7 — Final ID-mode QA fixes

Fixed

Final source-only ID-mode copy sweep

  • Translated remaining normal UI copy in Predictions, Results, Leagues, Predictor Profile, MatchModal, and DatePicker while preserving intentional English betting terms, badges, provider values, and release note entry content.
  • No layout, breakpoint, API, settlement, ranking, odds, or prediction logic changed.
v0.9.20

Bahasa Indonesia i18n Phase 6 — User Guide full body + Release Notes shell

New

User Guide full body translated to Bahasa Indonesia

  • All User Guide paragraphs, bullet lists, table labels, callouts, helper text, Predictor Profile cards, and FAQ now switch to Bahasa Indonesia in ID mode.
  • EN mode remains exactly English. Betting terms, market abbreviations, AI model names, formulas, and code blocks preserved in both modes.
  • Implementation uses inline bilingual JSX branches (lang === 'id') and data-driven bilingual arrays for card/FAQ sections.
New

Release Notes page shell translated

  • Release Notes page title and subtitle now switch to Bahasa Indonesia in ID mode.
  • All release note entry content remains in English.
v0.9.19

Bahasa Indonesia i18n Phase 5 — Predictors + Predictor Profile

New

Predictors pages translated to Bahasa Indonesia

  • Predictors page subtitle, section headings, scope toggles, requested table headers, and empty states now switch to Bahasa Indonesia in ID mode.
  • Predictor Profile title, subtitle, section headings, Prediction Style labels, hero/provider labels, requested prediction table headers, and empty states now switch to Bahasa Indonesia in ID mode.
  • Predictor Profile Predictions section title now uses the existing i18n predictions_title key.
v0.9.18

Bahasa Indonesia i18n Phase 4 — Leagues page

New

Leagues page fully translated to Bahasa Indonesia

  • Leagues page subtitle, hero metric labels, tournament status values, section subtitles, sub-tabs, stage names, qualification status, top scorers section, and scorer column headers now switch to Bahasa Indonesia in ID mode.
  • ~33 new i18n keys added for Leagues page copy.
  • Existing inline ternaries centralized into i18n.ts for consistency.
v0.9.17

Bahasa Indonesia i18n Phase 3 — Predictions + Results

New

Predictions and Results pages translated to Bahasa Indonesia

  • Predictions page subtitle and league info link now switch to Bahasa Indonesia in ID mode.
  • Results page title now correctly uses the existing i18n key (bug fix). Results subtitle, empty state, and league info link also translated.
  • 4 new i18n keys added: predictions_subtitle, results_subtitle, results_no_prediction_targets, more_info.
v0.9.16

Bahasa Indonesia i18n Phase 2 — Home + User Guide headings

New

Home page fully translated to Bahasa Indonesia

  • All Home page section titles, subtitles, stat labels, empty states, status explanations, and button labels now switch to Bahasa Indonesia when language selector is set to ID.
  • 19 new i18n keys added for Home page copy.
New

User Guide page shell and section headings translated

  • User Guide banner, page title, TOC, and all 16 section headings now switch to Bahasa Indonesia in ID mode.
  • User Guide body content remains English for now.
v0.9.15

Navbar subtitle copy fix

Fixed

Navbar subtitle restored to original copy

  • Navbar subtitle reverted to 'Smart Soccer Predictions' (EN) and 'Prediksi Sepak Bola Cerdas' (ID) — the previous generic copy introduced in v0.9.14 has been replaced.
v0.9.14

Bahasa Indonesia i18n Phase 1 — shared components

New

Bahasa Indonesia translations for shared components

  • Navbar tagline, Footer Release Notes link, MatchModal tab labels, MatchModal Info row labels, and DatePicker month names now switch to Bahasa Indonesia when language is set to ID.
  • 7 new i18n keys added: nav_release_notes, match_modal_info_competition, match_modal_info_kickoff, match_modal_info_stadium, match_modal_info_round, match_modal_info_referee, match_modal_info_status.
v0.9.13

Subtitles, Leagues copy polish, and footer link

Improved

Subtitles added to all main pages and sections

  • Home page: Upcoming Fixtures, Best Settled Predictions, Top WC 2026 Predictors, and Top Lifetime Predictors sections now have descriptive subtitles.
  • Predictions, Leagues, Predictors, Predictor Profile, Results, and Release Notes pages each have a new page subtitle.
  • Leagues tab sections (Standings, Recent Results, Upcoming Fixtures) have inline subtitles.
Changed

Leagues navigation labels updated

  • 'Recent Matches' renamed to 'Recent Results' in tabs and section headings.
  • 'Upcoming Matches' renamed to 'Upcoming Fixtures' in tabs and section headings.
  • Removed the 'All →' navigation link from the Overview Recent Results section.
Improved

Footer Release Notes link is now more visible

  • Release Notes link color changed from muted gray to cyan for better discoverability.
v0.9.12

Predictor Profile early mobile breakpoint

Improved

Predictor Profile uses mobile/stacked layout up to 1279px

  • All mobile card lists and desktop tables on the profile page now switch at 1280px instead of 640px.
  • Hero section, filter bar, strengths, weaknesses, prediction history, and coaching tables all use stacked layout below 1280px.
  • Desktop layout at 1280px and above is unchanged.
v0.9.11

Predictions & Results early mobile breakpoint

Improved

Predictions and Results use mobile/card layout up to 1279px

  • Predictions page: mobile card layout now active from 0px to 1279px; desktop layout starts at 1280px.
  • Results page: mobile card layout now active from 0px to 1279px; desktop layout starts at 1280px.
  • No new compact-desktop layout introduced. Existing mobile and desktop designs unchanged.
v0.9.9

Site-wide compact desktop responsive layer

Improved

Compact desktop/tablet layout from 640px to 1279px

  • Added Tailwind sm:max-xl range classes for header, page cards, tables, fixture rows, chips, and guide content.
  • Desktop layouts at 1280px and wider remain unchanged.
  • Mobile layouts below 640px remain unchanged.
v0.9.8

Leagues Top Scorers — mobile card layout + medal badge both views

Improved

Top Scorers: card layout on mobile (Predictor Profile style)

  • Row 1: medal badge + photo + name/position + team logo+name.
  • Row 2: Matches · Goals · Assists (3-col, includes assists).
  • Background row tint for rank 1/2/3 preserved on mobile cards.
  • Desktop table unchanged.
Improved

Rank 1/2/3 medal badge in desktop table (both views)

  • 🥇🥈🥉 pill badge for top 3; plain number for rank 4+.
  • Same style as Predictors Rankings table.
v0.9.7

Leagues Standings — no-scroll nav, Qualified Teams status in row 2

Improved

Standings sub-nav: no scrollbar, tabs fit on one line (mobile)

  • Removed overflow-x-auto; buttons now flex-1 with text-[11px] px-2 py-1 on mobile, sm:text-sm sm:px-4 sm:py-1.5 on desktop.
Improved

Qualified Teams card: status badge moved to row 2 (mobile)

  • Row 1: team logo + name only.
  • Row 2: Group · Qualified As · Status badge (3-col grid).
v0.9.6

Leagues page — mobile Timeline 2x2, nav 1-line, Qualified cards

Improved

Timeline: 2×2 grid on mobile (was 1-col stacked)

  • Row 1: First Match + Next Match. Row 2: Latest Result + Tournament End.
Improved

Standings sub-nav stays on 1 line (mobile)

  • Replaced flex-wrap with overflow-x-auto + shrink-0 whitespace-nowrap on buttons.
Improved

Qualified Teams: card layout on mobile (Predictor Profile style)

  • Each row: team name + status badge on top, Group + Qualified As below in 2-col grid.
  • Desktop table unchanged.
v0.9.5

Leagues page — mobile hero redesign (Predictor Profile style)

Improved

Mobile hero now uses 2-col grid with logo spanning 4 rows

  • Col 1: league logo spanning 4 rows. Col 2: type badge / league name / location / date.
  • KPI cards: 2×2 grid (matches+teams / groups+status) replacing the 1-col stacked layout.
  • Desktop hero layout fully unchanged.
v0.9.4

Results page — smaller P/L font on mobile

Improved

Total profit/loss font size reduced on mobile

  • Mobile: text-lg (18px) → text-base (16px). Desktop unchanged at text-xl.
v0.9.3

Results page — smaller team name font on mobile

Improved

Team name font size reduced on mobile only

  • Mobile: text-base (16px) → text-sm (14px). Desktop unchanged at text-base.
v0.9.2

Results page — fix flag/team name vertical alignment

Fixed

Flag icon and team name now vertically centered in each row

  • Added items-center to the score/name grid so all cells center vertically within their row height.
  • Applies to both mobile and desktop.
v0.9.1

Results page — bigger team names, aligned with flags

Improved

Team name size and flag alignment on Results page

  • Team name font: text-sm (14px) → text-base (16px) with leading-none for clean vertical alignment.
  • Logo size: 20px → 22px to match the larger text baseline.
  • Grid row gap: 2px → 4px for better breathing room between home/away rows.
  • Applies to both mobile and desktop.
v0.9.0

Results page — smaller mobile icon buttons

Improved

Prediction & info buttons shrunk on mobile

  • Reduced mobile icon buttons from h-8 w-8 to h-6 w-6 and icons from w-4 h-4 to w-3 h-3.
  • Tightened column gap (gap-2 → gap-1.5) and left padding (pl-2 → pl-1.5).
  • Desktop buttons unchanged.
v0.8.99

Results page — fix prediction button scroll offset on mobile

Fixed

Prediction button scroll now lands at top of match card (mobile)

  • Changed scrollIntoView block from 'center' to 'start' so the card top aligns to viewport top.
  • Added scroll-mt-20 (mobile) / scroll-mt-4 (desktop) to account for fixed navbar height.
v0.8.98

Results page — separator spacing + mobile icon column

Fixed

Separator spacing on mobile

  • Match info block: py-3 → pt-3 pb-1 (tighter before separator). Bet panel: py-2 → pt-4 pb-2 (more room after separator). Desktop sm:py-3 unchanged.
New

Icon column visible on mobile (after score, before separator)

  • New mobile-only icon column (sm:hidden) inline inside match row. Sun icon (view predictions, only when bets exist) + info icon (match details). Desktop hidden sm:flex panel untouched.
v0.8.96

Predictor Profile — pagination full width on mobile

Fixed

Pagination nav stretches full width on mobile

  • New PaginationBarMobile: top row = Showing X-Y of Z + page size selector (space-between). Bottom row = nav buttons spread justify-between full width. Desktop PaginationBar unchanged (hidden sm:block).
v0.8.95

Predictor Profile — Predictions table mobile card layout

Fixed

Scheduled & Settled predictions wrap to 2nd row on mobile

  • Replaced scrollable table with card rows on mobile (sm:hidden). Scheduled: Row 1=Match, Row 2=Date/Market/Selection, Row 3=Odds/Stake/Confidence. Settled: Row 1=Match+ResultBadge, Row 2=Date/Market/Selection, Row 3=Odds/Profit. Desktop tables unchanged (hidden sm:block).
v0.8.94

Predictor Profile — gap-8 + Low Sample badge alignment

Fixed

Gap between sections: gap-8

  • Prediction Style · 14D Momentum gap changed to gap-8 (from gap-10). Desktop unchanged.
Fixed

Low Sample badge positioned next to market/league name

  • Changed flex-col to flex items-center gap-2 layout. Badge now inline with bet type.
v0.8.93

Predictor Profile — section gap + Strengths card layout on mobile

Fixed

Larger gap between Prediction Style and 14D Momentum sections

  • gap-6 → gap-10 on mobile. Desktop xl:grid-cols-2 unchanged.
Fixed

Best Markets and Best Leagues wrap to 2nd row on mobile

  • Replaced scrollable table with card list on mobile (sm:hidden). Each row: market/league name + Low Sample badge on top, then 3-col grid: ROI / Win Rate / Settled. Desktop StrengthTable unchanged (hidden sm:block).
v0.8.92

Predictor Profile — Prediction Style mobile grid final layout

Fixed

Prediction Style 4-row 2-col grid on mobile

  • Row 1: Personality + Selectivity. Row 2: Largest Win + Largest Loss. Row 3: Most Played Market + Avg Stake. Row 4: Active Since + Preferred League (text only, league logo hidden on mobile). Desktop unchanged.
v0.8.91

Predictor Profile — KPI swap + Prediction Style mobile grid

Fixed

KPI cards: Settled and Net Profit swapped

  • Row 2 now shows Settled (col 1) and Net Profit (col 2). Desktop order unchanged.
Fixed

Prediction Style — mobile 2-col grid with smaller fonts

  • Row 1: Personality + Selectivity. Row 2: Largest Win + Largest Loss. Row 3: Most Played Market (full width, abbreviated e.g. AH/O/U). Row 4: Active Since + Preferred League. Font reduced to text-xs/text-[9px] to fit. Desktop layout unchanged.
v0.8.90

Predictor Profile page mobile polish

Fixed

Reduced gap between scope filter and avatar section

  • pt-24 → pt-16 on mobile. Desktop unchanged.
Fixed

Avatar row restructured for mobile (2-col grid)

  • Col 1: avatar spanning 3 rows. Col 2 Row 1: name. Col 2 Row 2: Active badge (smaller). Col 2 Row 3: Provider & Model combined. Desktop layout unchanged.
Fixed

KPI cards 2×2 grid on mobile

  • Row 1: Rank + ROI. Row 2: Net Profit + Settled. Was single-column on mobile. Desktop unchanged.
v0.8.89

Predictors mobile — silver ribbon left, specialists title smaller

Fixed

Silver medal ribbon anchored to left on mobile

  • Rank 2 ribbon uses left-4 on mobile, lg:right-4 on desktop. Rank 3 left-4 unchanged.
Fixed

League & Market Specialists title fits one line on mobile

  • text-xl → text-base on mobile (sm:text-2xl on desktop). No other headings touched.
v0.8.88

Predictors mobile — uppercase grid labels on all 3 tables

Fixed

Capitalized stat labels in mobile card row 2

  • Rankings row 2 already used grid headers; Specialists and Roster converted to same grid-cols-3 pattern. All labels now uppercase (ROI, WIN, BEST WK, BETS, 14D TREND). Desktop untouched.
v0.8.87

Predictors mobile cards — full data, 2-row layout

Fixed

All stats shown on mobile — second row wraps extra data

  • Rankings: Row 1 = rank+avatar+name, Row 2 = ROI / Win Rate / Bets / Best Week / 14D sparkline. Specialists: Row 1 = league+predictor, Row 2 = ROI / Win Rate / Best Week. Roster: Row 1 = avatar+name, Row 2 = ROI / Win Rate / Bets. Desktop tables unchanged.
v0.8.86

Predictors page tables — full mobile card layout

Fixed

All 3 tables replaced with mobile card list on small screens

  • Predictor Rankings, League & Market Specialists, and Predictor Roster now render as flex card rows on mobile (sm:hidden). Desktop table layout unchanged (hidden sm:block). No horizontal scroll on mobile.
v0.8.85

Predictors page mobile polish

Fixed

Champions Podium — correct mobile order (1st, 2nd, 3rd top to bottom)

  • Added order-1/2/3 mobile-only CSS. Desktop 2-1-3 trophy layout preserved via lg:order-*. Gold coin badge given mt-14 clearance on mobile so it no longer overlaps the scope filter.
Fixed

Reduced vertical spacing between Predictors title and Champions Podium on mobile

  • space-y-10 → space-y-4 on mobile (sm:space-y-10 on desktop). Only bottom margin affected; top/left/right padding untouched.
Fixed

Tables auto-wrap on mobile — no horizontal scroll

  • Predictor Rankings: Win Rate and Best Week columns hidden on mobile (sm:table-cell). League & Market Specialists: Win Rate and Best Week Profit columns hidden on mobile. Predictor Roster: already fit. All desktop columns preserved.
v0.8.84

Date picker mobile anchor fix

Fixed

Predictions and results pages

  • Fix: date picker calendar anchored to top-right on mobile (predictions + results pages)
v0.8.83

Mobile market header Row 2: fix left alignment + bigger font

Fixed

Predictions page (mobile only)

  • Row 2 Col 1: -mx-2 cancels MarketSummaryLine px-2 indent so bet details align with bet type above
  • Row 2 font size bumped from 10px to 11px
v0.8.82

Mobile market header: Row1→Row2 spacing, left align, smaller font

Improved

Predictions page (mobile only)

  • More vertical spacing between Row 1 and Row 2 (mt-1.5 → mt-3)
  • Row 2 Col 1 left aligned
  • Row 2 Col 1 font size reduced to 10px via descendant override
v0.8.81

Mobile: market group header 2-row layout

Improved

Predictions page (mobile only)

  • Market header Row 1: bet type label + count badge (left aligned)
  • Market header Row 2: bet details (left, Col1) + triangle only no separator (right, Col2)
  • Desktop header fully isolated via hidden sm:flex
v0.8.80

Mobile predictions: more padding between separator and Row 3

Improved

Predictions page (mobile only)

  • Increased pt-1.5 to pt-3 on Row 3 — more space between the separator line and the bet boxes.
v0.8.79

Mobile predictions Row 1: 3-column layout, no separators

Improved

Predictions page (mobile only)

  • Row 1 is now a 3-column grid: status/time (left) | teams (center) | info button (right)
  • Removed all | separators from Row 1
  • Col 1 and Col 3 are narrow/fit-content; Col 2 takes remaining width
v0.8.78

Best Settled: more spacing between Row 1 and Row 2 (desktop)

Improved

Home page (desktop only)

  • Added pb-1 to league name row for more vertical breathing room above teams row.
v0.8.77

Best Settled Predictions: explicit 5-row desktop grid

Improved

Home page (desktop only)

  • Dedicated desktop grid: 5 rows × 2 cols — league, teams+score/predictor, kickoff/confidence, bet+selection/WIN badge, settled/stake+PL
  • Mobile layout fully isolated via sm:hidden / flex-col blocks
v0.8.76

Mobile P/L: pulsating dot + checkmark (mobile only)

Improved

Predictions page (mobile)

  • Pulsating amber dot on P/L when live/unsettled
  • Green checkmark on P/L when all bets settled
v0.8.75

Hard revert predictions page to v0.8.67 baseline

Fixed

Predictions page

  • Hard revert to 568a5f0 (v0.8.67) — desktop market header fully restored
v0.8.74

Revert desktop market header to 1-row

Fixed

Predictions page

  • Desktop market group header restored to original 1-row layout (broken since v0.8.68)
v0.8.73

Revert desktop font fix

Fixed

Predictions page

  • Restore MarketSummaryLine to text-xs — desktop header row was broken by 10px change
v0.8.72

Fix Row 2 Col 1 font size (10px)

Fixed

Predictions page (mobile)

  • Row 2 Col 1 summary text now correctly renders at 10px (was overridden by component's own text-xs)
v0.8.71

Mobile: live dot + settled checkmark on P/L

Improved

Predictions page (mobile)

  • Pulsating amber dot on P/L when live/unsettled (matches desktop)
  • Green checkmark on P/L when all bets settled (matches desktop)
v0.8.70

Market group header Row 2 polish

Improved

Predictions page

  • Remove separator from Row 2 Col 2 (mobile)
  • Smaller font (10px) for Row 2 Col 1 summary (mobile only)
v0.8.69

Market group header spacing & 2-col Row 2

Improved

Predictions page

  • More vertical padding on market group header
  • Row 2 split into 2 columns: summary left, separator+triangle right
v0.8.68

Market group header polish

Improved

Predictions page

  • Polish market group header: 2-row layout (bet type left, summary right)
v0.8.67

Predictions page mobile match-card layout

Improved

Mobile UI

  • Predictions page: dedicated mobile match-card layout with stacked rows
  • Row 1: status | team flags + names | info button (live/finished)
  • Row 2: score, Row 3: bet type boxes, Row 4: stake/P/L, Row 5: expand
  • Live badge hidden on mobile; separators removed except Row 1 separators
v0.8.66

Home mobile fixture and settled card refinement

Improved

Home mobile cards

  • Upcoming Fixtures now appears before Best Settled Predictions on the Home page.
  • Upcoming Fixtures and Best Settled Predictions now show both home and away teams on mobile.
  • Best Settled Predictions now uses smaller mobile bet-type text and matching muted kickoff/settled datetime sizing.
v0.8.65

Fix Home mobile stacked rows + footer font size

Fixed

Home mobile card layout

  • Best Settled Predictions now uses stacked mobile rows with match details above and model/result details below.
  • Upcoming Fixtures now uses stacked mobile rows with fixture details above and stake chips below.
  • Top WC 2026 and Lifetime predictor rows keep stat labels visible while preserving a single-line mobile main row.
Fixed

Global footer mobile font

  • Increased the mobile footer font clamp while keeping Release Notes and copyright on one compact line.
v0.8.64

Home mobile polish + global footer mobile fix

Improved

Home mobile card layout

  • Best Settled Predictions and Upcoming Fixtures now use compact two-sided mobile rows.
  • Top WC 2026 and Lifetime predictor rows now stay single-line on mobile.
Fixed

Global footer mobile fit

  • Release Notes and copyright now stay on one compact line on mobile without horizontal overflow.
v0.8.63

Fix Leagues Standings desktop grid regression

Fixed

Leagues standings group grid

  • Group standings cards now render 2 per row on desktop as intended — removed erroneous 2xl:grid-cols-3 added during mobile pass.
  • Mobile 1-column stacked layout preserved.
v0.8.62

Fix Predictor Profile hero desktop collapse

Fixed

Predictor Profile hero layout

  • KPI column now uses xl:w-auto to prevent w-full from collapsing the middle name/identity column on desktop.
  • Predictor name, provider, model, and personality badge render at full readable width on desktop.
  • Mobile stacked layout preserved.
v0.8.61

Fix Predictor Rankings table width regression

Fixed

Predictor Rankings desktop table

  • Table wrapper and table element now use w-full so the Rankings table fills the full card width on desktop.
  • Mobile overflow-x-auto scroll guard preserved — min-w-[760px] still prevents mobile clipping.
v0.8.60

Mobile responsive fixes

Improved

Mobile layout audit pass

  • Fixed horizontal overflow risks on home, predictions, results, leagues, and predictor pages at 360-414px widths.
  • Navbar, date filters, fixture cards, and predictor profile hero now size or wrap safely on small screens.
  • Dense standings, ranking, scorer, and predictor profile tables now use mobile scroll guards instead of clipping.
  • Match modal uses mobile-safe width, internal scroll, safer tabs, and larger tap targets.
  • Long team names, predictor names, selections, and rationale text now truncate or wrap safely in compact layouts.
  • Touch targets audited and adjusted for mobile menu, modal tabs, close button, calendar days, and compact action buttons.
v0.8.59

Default language changed to English

Changed

Default language: ID → EN

  • First-load fallback language changed from Indonesian to English.
  • Saved language preferences are preserved — existing users see no change.
  • Language toggle (EN/ID) continues to work as before.
v0.8.58

User Guide — footer fix + ToC active indicator

Fixed

Footer gap removed

  • Removed pb-10 from user-guide page wrapper — footer now flush as expected.
New

ToC active section indicator

  • Table of Contents now highlights the current section as you scroll using IntersectionObserver.
  • Active item shows cyan background, full-opacity number, and a dot indicator on the right.
v0.8.57

User Guide layout fixes

Fixed

Hero description, predictor names, ToC position

  • Hero banner description now spans full width — removed max-w-2xl constraint.
  • Replaced remaining Haruka references in example cards with real predictor name.
  • Swapped layout: Table of Contents now on the LEFT, content on the RIGHT.
v0.8.56

User Guide fixes

Fixed

User Guide hero banner & predictor names

  • Removed extra vertical spacing in hero banner — title and description now flush.
  • Updated all predictor names to match live admin data (Claude Haiku 4.5, Gemini 2.5 Flash, GPT OSS 120B, Owl Alpha, etc.).
  • Removed inactive predictors (Kimi K2.5, MiniMax M2.5, DeepSeek V4 Flash) from the guide.
v0.8.55

User Guide — full rewrite

Improved

User Guide page

  • Complete rewrite of the User Guide with 16 detailed sections.
  • Covers all pages, stake formula with full worked examples, Asian Handicap deep dive, Indonesian odds format, settlement outcomes, ROI metrics, predictor selectivity, and 10 FAQ entries.
  • 1,300+ lines of educational content with color-coded sections, formula blocks, data tables, and example cards.
v0.8.54

User Guide page

New

User Guide

  • Added comprehensive User Guide page covering all markets, stake formula, odds format, settlement types, and predictor mechanics.
  • Guide is accessible from the navbar (Guide icon, after Results).
v0.8.53

Page subtitle cleanup

Changed

Results and Release Notes titles

  • Remove subtitle below Results title and Release Notes title
v0.8.52

Navbar icons

Improved

Navbar

  • Added icons to each public navigation item.
  • Improved navbar readability while keeping the refined Jennie Score theme.
v0.8.51

Navbar visual polish

Improved

Navbar

  • Refined the public navbar with a more professional brand layout.
  • Enlarged the JENNIE SCORE title for stronger visual presence.
  • Added a version badge near the brand title.
v0.8.50

Release Notes history backfill

Improved

Release Notes

  • Backfilled Release Notes with earlier Jennie Score releases from git tags and checkpoints.
  • Added older product milestones so the public history starts from the earliest reliable version found.
  • Kept Release Notes version guard active for future releases.
v0.8.49

Release Notes page

New

Release Notes page

  • Added public Release Notes page at /release-notes
New

Footer link

  • Added footer link to Release Notes
New

Release-note guard

  • Version bumps now require a matching release note entry before build passes
v0.8.48

Logo, nav typo, footer & layout polish

Improved

Navbar logo

  • Updated Jennie Score logo in navbar (64×64)
Fixed

Navigation and footer polish

  • Nav "Prediction" typo corrected to "Predictions"
  • Footer pinned to bottom of content area, aligned to max-w-7xl right edge
  • Predictions and Results pages now remove the last card bottom margin
  • AppShell bottom padding removed to reduce footer gap
v0.8.47

Footer position fix

Fixed

Footer flow

  • Footer now sits below content in flex column flow instead of overlapping cards
v0.8.46

Footer viewport pin attempt

Changed

Footer positioning

  • Footer switched to a fixed bottom position, later reverted in v0.8.47
v0.8.45

Footer added

New

Footer

  • Added footer with dynamic copyright year: shows "© 2026" alone in 2026 and "© 2026 - YYYY" in future years
v0.8.44

Hero banner removed

Changed

Home hero

  • Removed home page hero banner placeholder to make way for a real hero banner
v0.8.43

Logo and favicon

New

Brand assets

  • Added Jennie Score logo to navbar and public/logo.png
  • Generated 32×32 favicon from logo
v0.8.42

AH canonical display labels

Fixed

Asian Handicap labels

  • Asian Handicap labels now use signed handicap lines, such as "Away -2.5"
  • Asian Handicap model prompt updated with correct plus/minus semantics
New

Coverage

  • Added Asian Handicap canonical label test coverage
v0.8.41

Nav reorder + Leaderboard hidden

Changed

Navigation

  • Leaderboard removed from public navigation
Improved

Navigation order

  • Navigation order updated
v0.8.40

Predictor Profile MatchModal polish

Improved

Predictor Profile

  • MatchModal styling improved on Predictor Profile page
v0.8.39

Predictor Profile Predictions pagination + modal behavior

Improved

Predictions list

  • Pagination added to Predictor Profile predictions list
Fixed

Modal behavior

  • Modal open and close behavior fixed on Predictor Profile
v0.8.38

Predictions table fixes + pagination endpoint

Fixed

Predictions table

  • Predictions table display issues fixed
New

Pagination

  • Pagination endpoint added
v0.8.37

Scheduled/Settled Predictions section

New

Predictor Profile sections

  • Scheduled and Settled Predictions sections added to Predictor Profile
v0.8.36

Strengths scope toggle + market abbreviations

Improved

Strengths and markets

  • Strengths section now respects scope toggle
  • Market abbreviations added throughout
v0.8.35

Predictor Profile layout polish

Improved

Predictor Profile layout

  • Predictor Profile page layout and spacing improved
v0.8.34

Momentum/Strengths/tagline/net-profit corrections

Fixed

Predictor Profile metrics

  • Momentum chart data corrected
  • Strengths section logic fixed
  • Tagline and net-profit display fixed
v0.8.33

Momentum chart + Strengths section

New

Predictor Profile insights

  • Momentum chart added to Predictor Profile
  • Strengths section added to Predictor Profile
v0.8.32

Personality label + selectivity

New

Personality label

  • Personality label displayed on Predictor Profile
Improved

Selectivity

  • Selectivity metric added
v0.8.31

Hero KPIs follow selected scope

Improved

Hero KPIs

  • Hero KPI metrics now respond to scope selector
v0.8.30

Tagline color + hero toggle placement

Improved

Hero polish

  • Tagline color updated
  • Hero scope toggle repositioned
v0.8.29

Tagline wrapping

Fixed

Tagline

  • Tagline text wrapping fixed on smaller screens
v0.8.28

Predictor Profile hero polish

Improved

Predictor Profile hero

  • Hero section styling improved on Predictor Profile
v0.8.27

Predictor Profile hero KPI polish

Improved

Predictor Profile hero

  • Removed the outer KPI wrapper box.
  • Added an icon to every KPI card.
  • Set wider minimum KPI card sizing for a more stable hero layout.
v0.8.26

Predictor Profile hero background

Improved

Predictor Profile hero

  • Added a gradient hero background.
  • Updated KPI cards to match the World Cup card style.
  • Fixed Provider and Model baseline alignment.
v0.8.25

Predictor Profile hero baseline fixes

Fixed

Predictor Profile hero

  • Aligned Provider and Model text to the correct baseline.
  • Widened KPI cards.
  • Displayed Rank as an inline "of N" value.
v0.8.24

Predictor Profile hero KPI alignment

Fixed

Predictor Profile hero

  • Top-aligned KPI labels.
  • Anchored the KPI box to the bottom of the hero.
  • Widened the third hero column.
v0.8.23

Predictor Profile hero layout

Improved

Predictor Profile hero

  • Adjusted hero column widths.
  • Moved compact KPIs from the tagline row.
  • Placed Provider and Model side by side.
  • Improved Rank card hierarchy.
v0.8.22

Predictor Profile hero spacing

Fixed

Predictor Profile hero

  • Removed empty hero space.
  • Right-aligned hero KPIs.
  • Added a colored tagline badge.
  • Increased KPI card size.
v0.8.21

Predictor Profile hero refinements

Improved

Predictor Profile hero

  • Increased avatar size.
  • Added a colored tagline badge.
  • Improved KPI row alignment.
v0.8.20

Predictor Profile hero columns

Improved

Predictor Profile hero

  • Reworked the hero into avatar, identity, and All Time KPI columns.
v0.8.19

Predictor Profile page revamp

New

Predictor Profile

  • Revamped Predictor Profile with hero, KPIs, momentum, strengths, and latest predictions.
v0.8.18

All Time count correction

Fixed

Predictor counts

  • All Time prediction count now uses settled predictions only.
v0.8.17

Shared World Cup / All Time scope

Improved

Predictors page

  • Extended the World Cup / All Time toggle to Podium and Roster.
  • Shared one page-level scope across related Predictors sections.
v0.8.16

World Cup / All Time rankings toggle

Changed

Predictor Rankings

  • Replaced the Rankings date filter with a World Cup / All Time toggle.
v0.8.15

Predictor Roster polish

Improved

Predictor Roster

  • Wrapped the roster box layout.
  • Removed Type and Profile columns.
  • Made predictor names clickable.
  • Filtered inactive predictors throughout the roster.
v0.8.14

Predictor Roster table

Changed

Predictor Roster

  • Converted Predictor Roster from cards to a table layout.
v0.8.13

Specialists league cleanup

Fixed

Specialists

  • Removed duplicate World Cup entries.
  • Sorted leagues alphabetically.
v0.8.12

Specialists World Cup and icons

Fixed

Specialists

  • Kept World Cup visible in Specialists.
  • Added league logo icons.
v0.8.11

Specialists label fixes

Fixed

Specialists

  • Fixed Specialists font, format, and label details.
  • Pinned World Cup row in Specialists.
v0.8.10

Specialists visual parity

Fixed

Specialists

  • Matched Specialists styling exactly to Predictor Rankings.
v0.8.9

Specialists styling

Improved

Specialists

  • Matched League and Market Specialists styling to Predictor Rankings.
v0.8.8

Avatar cache-busting

Fixed

Predictors page

  • Added cache-busting for predictor avatars.
  • Added a fallback when avatar images fail to load.
v0.8.7

14D Momentum

Changed

Predictor Rankings

  • Changed Momentum from a 30-day window to a 14-day window.
  • Updated the frontend label to 14D Momentum.
v0.8.6

Settled-only Momentum

Fixed

Predictor Rankings

  • Verified Momentum uses settled profit only.
  • Excluded open bets from the Momentum calculation.
v0.8.5

30D Momentum sparkline

New

Predictor Rankings

  • Added cumulative Momentum sparkline.
  • Added final profit/loss label.
  • Exposed 30D trend total and count fields.
v0.8.4

Best Week formatting

Fixed

Predictor Rankings

  • Removed decimals from Best Week values.
  • Added token suffix formatting.
v0.8.3

Rankings table polish

Improved

Predictor Rankings

  • Polished the Rankings table.
  • Added a 30D trend sparkline column.
v0.8.2

Predictors section spacing

Fixed

Predictors page

  • Unified section gaps across all four Predictors sections.
  • Removed stale spacing overrides.
v0.8.1

Podium-to-rankings spacing

Fixed

Predictors page

  • Reduced the gap between Champions Podium and Rankings.
v0.8.0

Rankings title polish

Improved

Predictor Rankings

  • Matched Rankings title styling to Champions Podium.
  • Added a Rankings title icon.
  • Fixed nearby spacing.
v0.7.9

Rankings header polish

Improved

Predictor Rankings

  • Improved Rankings title hierarchy.
  • Moved subtitle and filters into one row.
  • Tightened header spacing.
v0.7.8

Podium card compression

Fixed

Champions Podium

  • Reduced podium top padding and card height.
  • Moved avatars higher in podium cards.
v0.7.7

Avatar URL and Best Week fixes

Fixed

Champions Podium

  • Normalized avatar URLs.
  • Applied token formatting to Best Week values in the podium.
v0.7.6

Podium stat cleanup

Fixed

Champions Podium

  • Cleaned up podium stat font sizing.
  • Tightened ROI-to-stats spacing.
  • Changed Bets label to Predictions.
v0.7.5

Podium medal fixes

Fixed

Champions Podium

  • Fixed gold coin inner lining.
  • Restored the trophy icon.
v0.7.4

Predictors micro-polish

Improved

Predictors page

  • Removed subtitle and KPI clutter.
  • Restored podium trophy icon.
  • Improved medal inner lining and title spacing.
v0.7.3

Admin icon upload fix

Fixed

Admin Predictors

  • Fixed predictor icon upload by sending the correct multipart FormData request.
v0.7.2

Podium badge placement

Fixed

Champions Podium

  • Tightened title top gap.
  • Moved the #2 ribbon to the top-right.
  • Restored true bronze styling for #3.
v0.7.1

Podium badge sizing

Fixed

Champions Podium

  • Increased podium badge size.
  • Made the #1 card taller.
  • Tightened title spacing.
v0.7.0

Podium layout fixes

Fixed

Champions Podium

  • Made the full gold coin visible.
  • Increased podium card height.
  • Tightened title spacing.
v0.6.99

Podium gradient fix

Fixed

Champions Podium

  • Extended gradient fills to rounded corners.
  • Reduced gold coin size.
v0.6.98

Podium badge simplification

Fixed

Champions Podium

  • Increased badge size.
  • Removed champion and runner-up pills.
  • Removed laurel decoration.
  • Made podium gradient full-width.
v0.6.97

Podium medal badges

New

Champions Podium

  • Added gold coin medal badge for first place.
  • Added silver and bronze ribbon badges.
v0.6.96

Champions Podium revamp

Improved

Champions Podium

  • Reworked Champions Podium into a shared container.
  • Added compact stats row and medal badges.
v0.6.95

Predictors visual polish

Improved

Predictors page

  • Upgraded podium visuals.
  • Added generic AI avatar fallback.
  • Improved page layout hierarchy.
v0.6.94

Predictors page revamp

New

Predictors page

  • Replaced the old predictor grid with Hall of Fame / AI Competition layout.
  • Added KPI summary, podium, sortable rankings, Specialists, and roster sections.
v0.6.93

Draw styling fix

Fixed

Best Settled Predictions

  • Kept both teams bright when a match ends in a draw.
v0.6.92

Home summary performance

Improved

Home API

  • Added missing indexes for home summary queries.
  • Rewrote predictions-today filtering for faster date matching.
v0.6.91

Results default date

New

Results page

  • Added backend-driven default date selection for Results.
  • Kept explicit date URLs as the highest priority.
v0.6.90

World league auto-sync

Improved

League sync

  • Auto-sync now refreshes standings and top scorers for core and world leagues.
  • World Cup 2026 is auto-discovered by the sync flow.
v0.6.89

Sync empty-payload guards

Fixed

Data sync

  • Added empty-payload guards for sync jobs.
  • Refreshed World Cup 2026 data.
v0.6.88

Predictions backend default date

Improved

Predictions page

  • Replaced full-history default-date scan with a backend default-date endpoint.
v0.6.87

Predictions smart default date

Improved

Predictions page

  • Added smart default date selection for Predictions.
v0.6.86

Fixtures nav hidden

Changed

Navigation

  • Removed Fixtures from the main navigation while keeping the route available.
v0.6.85

Top scorers label cleanup

Changed

Top Scorers

  • Removed the Showing Top N Scorers label.
v0.6.84

Top Scorers position and appearances

Fixed

Top Scorers

  • Stored player position and appearances during scorer sync.
  • Exposed position and appearances in the top scorers API.
  • Displayed player position and match count in the table.
v0.6.83

Top Scorers matches column

New

Top Scorers

  • Added a Matches column.
  • Adjusted mobile column priority for Player, Matches, and Goals.
v0.6.82

Top Scorers cleanup

Changed

Top Scorers

  • Removed the medal strip.
  • Removed misleading client-side Last updated text.
  • Normalized the Goals header and removed duplicate player subtitles.
v0.6.81

Top Scorers UI polish

Improved

Top Scorers

  • Added rank accents and stronger goal emphasis.
  • Improved player cells and responsive behavior.
  • Added a WIB refresh timestamp.
v0.6.80

Top Scorers data fix

Fixed

Top Scorers

  • Stopped empty scorer payloads from clearing valid data.
  • Refreshed World Cup 2026 top scorer rows.
  • Added a scorer-specific empty state.
v0.6.79

Group Stage micro-polish

Fixed

Standings

  • Removed Possible Advanced inline badges from Group Stage.
  • Added scoped left padding to Group Stage team cells.
v0.6.78

Standings table polish

Fixed

Standings

  • Removed rank and form columns.
  • Fixed horizontal overflow.
  • Restyled standings sub-menu pills.
v0.6.77

Standings tab revamp

New

Standings

  • Added tournament Group Stage, Knockout Bracket, and Qualified Teams views.
  • Kept domestic leagues on a traditional league table.
  • Detected tournament layouts dynamically.
v0.6.76

Leagues hero metric sizing

Fixed

Leagues hero

  • Reduced large hero metric font sizes.
  • Kept Status card typography overflow-safe.
v0.6.75

Leagues hero team count fix

Fixed

Leagues hero

  • Fixed World Cup team count by deduplicating canonical teams.
  • Adjusted hero metric typography.
v0.6.74

Persistent leagues hero

Changed

Leagues page

  • Moved the league hero above tabs so it appears across all tab views.
  • Fixed Status card overflow.
v0.6.73

Tournament Progress section

New

Leagues Overview

  • Added Tournament Progress milestone strip.
  • Derived stage dates from fixture round data.
  • Hid the section for domestic leagues.
v0.6.72

Premium leagues hero

New

Leagues Overview

  • Replaced the basic league header with a premium tournament hero.
  • Added summary cards for Matches, Teams, Groups or Clubs, and Status.
  • Added host location and tournament date range.
v0.6.71

Leagues modal info parity

Fixed

Leagues modal

  • Loaded full venue, round, referee, elapsed, period, and penalty data for league fixtures.
  • Matched the Leagues modal Info tab with the Results modal.
v0.6.70

Leagues modal unification

Fixed

Leagues modal

  • Reused the exact Results modal in Leagues.
  • Removed league-specific modal overrides.
v0.6.69

Leagues overview interactions

Fixed

Leagues Overview

  • Fixed fixture clickability by fetching prediction counts separately.
  • Removed the Upcoming Fixtures All link.
  • Opened Recent Results in the shared match modal.
v0.6.68

Leagues overview simplification

Changed

Leagues Overview

  • Merged Next Fixture into Upcoming Fixtures.
  • Merged Latest Result into Recent Results.
  • Fixed fixture and result navigation from the overview.
v0.6.67

Leagues overview polish

Improved

Leagues Overview

  • Added WIB datetime formatting to the timeline.
  • Made fixtures and results link to the right destination.
  • Swapped Upcoming Fixtures and Recent Results sections.
  • Removed Competition Information.
v0.6.66

Leagues Overview revamp

New

Leagues Overview

  • Redesigned Overview as a competition dashboard.
  • Added league summary API data.
  • Added hero, progress, timeline, next fixture, latest result, recent results, and upcoming fixture sections.
v0.6.65

Leaderboard polish

Improved

Leaderboard

  • Filtered inactive predictors from leaderboard data.
  • Defaulted the leaderboard league filter to World Cup.
  • Reset now returns to World Cup by default.
v0.6.59

Upcoming fixture stake summary

New

Home page

  • Added per-fixture stake totals to Upcoming Fixtures.
  • Added market-level stake chips for 1X2, AH, O/U, BTTS, and CS.
v0.6.58

Results CTA button

Changed

Home page

  • Replaced the small View All Results link with a full-width Results CTA button.
v0.6.57

Home page predictor polish

Improved

Home page

  • Moved World Cup 2026 predictors before Lifetime predictors.
  • Shortened the World Cup predictors title.
  • Removed the Lifetime section leaderboard link.
v0.6.56

World Cup home predictor section

New

Home page

  • Added Top World Cup 2026 Predictors beside Top Lifetime Predictors.
  • Added backend summary data for World Cup predictor rankings.
  • Added graceful empty state handling.
v0.6.55

Owl Alpha onboarded

New

Predictors

  • Added Owl Alpha as an active predictor.
  • Added Owl Alpha personality and value-betting behavior profile.
  • Auto-initialized budget cycles for newly created predictors.
v0.6.54

Top Predictors cleanup and fixture season fix

Fixed

Home and sync

  • Filtered inactive predictors from homepage rankings.
  • Excluded voided bets from homepage predictor totals.
  • Renamed Top AI Predictors to Top Predictors.
  • Required exact season matches for synced H2H fixtures.
v0.6.53

Runtime and prediction API cleanup

Improved

Platform

  • Aligned ecosystem process names with PM2 runtime.
  • Exposed profit tokens in the Predictions API.
  • Fixed grouped standings React keys.
  • Added settled prediction UI types.
v0.6.52

Admin cron summary proxy

Fixed

Admin cron

  • Removed direct MySQL access from the admin cron route.
  • Added FastAPI cron-summary endpoint.
  • Removed the admin mysql2 dependency.
v0.6.51

Standings refresh throttle fix

Fixed

League sync

  • Reduced standings refresh throttle for event-driven updates.
  • Allowed finished-fixture events to force standings and scorer refreshes.
v0.6.50

Post-score league refresh

New

League sync

  • Auto-refreshed standings and top scorers after score sync.
  • Filtered aggregate World Cup standings rows.
  • Deduplicated standings by API team id.
v0.6.49

World Cup standings and logos

Fixed

Leagues page

  • Added team logo and flag fallbacks.
  • Backfilled national team logos.
  • Fixed grouped standings keys to prevent duplicated rank collisions.
v0.6.48

Best Settled Predictions deep links

New

Home page

  • Made Best Settled Predictions cards clickable.
  • Linked cards to the matching Predictions fixture and date.
  • Kept cards non-clickable when fixture id is unavailable.
v0.6.47

Best Settled Predictions section

New

Home page

  • Replaced Featured AI Picks with Best Settled Predictions.
  • Showed one best profitable settled prediction per fixture.
  • Added compact market, result, stake, and profit display.
v0.6.46

Smart default selections

Improved

Page defaults

  • Defaulted Leagues to World Cup when available.
  • Defaulted Predictions to the nearest upcoming predicted date.
  • Defaulted Results to the latest finished result date.
v0.6.45

Upcoming fixture deep links

Fixed

Home to Predictions

  • Made upcoming fixture cards clickable only when predictions exist.
  • Passed date and fixture id into Predictions links.
  • Auto-selected, expanded, and scrolled to the target fixture.
v0.5.0

Initial public release

New

Foundation

  • Completed API foundation, core betting layer, and AI prediction engine.
  • Added Admin Panel and public website.