Back to projects
Full Stack

Sport & Tournament Management System

  • 2023
  • Lead Engineer
  • Shipped

STMS is a full-featured tournament management platform supporting various competition formats with real-time scoring, Elo-based player rankings, and predictive match outcome analytics. Built with a real-time architecture using WebSockets and powered by machine learning for performance forecasting.

LEADERBOARD011842021715031603041541LIVEBRACKETS · ELO · 78% PREDICTIONSport & Tournament Management System

78%

Match prediction accuracy

Real-time

Live scoring + leaderboards

Multi-format

Single & double elim, round robin

01

The Problem

Sports organizers relied on manual spreadsheets and disconnected tools to manage tournaments, resulting in delayed scores, inaccurate rankings, and zero predictive insight into player performance.

Tournament directors were keeping live scores in shared spreadsheets. Three rooms, fifty matches, one source of truth — and it was usually wrong.
02

The Solution

Designed a real-time tournament engine supporting various formats with live scoring, registration, and leaderboards powered by Redis and Django Channels over WebSockets. Implemented a custom Elo algorithm with Celery async task queues. Built a predictive model using Scikit-learn and Pandas for match outcome predictions.

03

Key Decisions

  1. Django Channels + Redis pub/sub for live state

    Live scoring needed sub-second fan-out to leaderboards, brackets, and an admin console at the same time. Channels over Redis pub/sub gave us a single broadcast primitive without standing up a separate WebSocket service.

    Tradeoff: Slightly heavier ops than a flat REST API, but the moment the scorekeeper hit submit, every screen updated.

  2. Custom Elo over off-the-shelf ranking libs

    Wrote a small Elo implementation tuned for tournament formats — initial rating per division, K-factor that decays as match count grows, optional margin-of-victory weighting. Off-the-shelf libs encoded chess-specific assumptions that didn't fit.

    Tradeoff: More code to maintain, but the ratings stayed interpretable for organisers, which mattered when results were contested.

  3. Scikit-learn rather than a deep model

    A gradient-boosted classifier trained on past match features (Elo delta, recent form, head-to-head, surface) hit 78% accuracy with a tiny footprint and explainable predictions. A deep model would have needed more data than the leagues had.

    Tradeoff: Capped at the accuracy of the engineered features — but kept us out of an MLOps rabbit hole.

04

The Impact

Achieved ~78% accuracy in match outcome predictions. Enabled live tournament management with real-time leaderboards, eliminating manual score tracking and reducing organizer workload significantly.

With hindsight

I'd swap the bracket data model for an event-sourced log next time — every score correction, walkover, and re-seed is auditable, which is exactly the thing tournament organisers ask for the moment a final goes sideways.

Built with

DjangoRedisWebSocketsCeleryScikit-learnPandasPostgreSQLDocker