Live Dota 2 win-probability engine
Chronosphere
Second-screen win probability for professional matches: a React dashboard that polls a FastAPI + XGBoost service fed by Steam, PandaScore, and OpenDota.
Problem
Live esports decisions need fresh win probabilities during the match, not batch scores that arrive too late.
Architecture
Product flow
System architecture
Prediction path
My responsibility
I built the prediction path end to end: live match ingest, feature plumbing, XGBoost serving, and the React dashboard that polls for updates.
Decision
Serve FastAPI + XGBoost against Steam live games joined with PandaScore and OpenDota context, and refresh the React UI via HTTP polling on a short interval.
What could fail
Stale or missing live features, uncalibrated outputs when no calibrator artifact is loaded, and third-party API outages mid-match.
How I made it reliable
Heuristic fallback when the model file is missing. Optional Redis cache for raw Steam payloads. Training can fit isotonic calibration when a calibrator is present. Docker Compose keeps API, frontend, and Postgres aligned across environments.
Result
Open-source live prediction engine with pro-match tracking and optional Gemini analysis on match detail.