← All projects

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.

PythonFastAPIXGBoostReactViteSteam APIDocker

Problem

Live esports decisions need fresh win probabilities during the match, not batch scores that arrive too late.

Architecture

Product flow

Second-screen dashboard for live pro matches. The UI polls for fresh scores, then opens a match for win probability and optional analysis text.

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.