How it's built

One person, one codebase, six sports.

Oddsix is built and run by one developer working with AI tools. Everything on the site, from the box scores to the model predictions, comes out of a single pipeline that runs every morning. This page explains the machinery.

The data pipeline

Every day at 4 AM the pipeline pulls fresh games, injuries, and odds for the NBA, NFL, MLB, NHL, and top-flight soccer, rebuilds more than thirty data products, and redeploys the site. Historical depth comes from dedicated archives: play-by-play era data going back to 1946 for the NBA, Retrosheet event files parsed for every MLB game since 1910, and full career records for over 50,000 players across the five sports. Bulk data like per player game logs is served from object storage so pages stay fast.

The models

Each sport has its own prediction stack. The NBA model is the most mature: an ensemble over a 500 plus column engineered feature set (Elo ratings, opponent-adjusted form, lineup and injury signals, clutch and pace profiles), with the live model selecting 144 of those features. Other sports run leaner stacks suited to their data. Every model's output is shown on the site clearly labeled as a model view, never mixed into the real statistics.

Validation, honestly

Sports models are easy to fool yourself with, so the rules here are strict. Rolling features only ever see past games. Models are validated walk-forward, meaning every prediction is made with only the data that existed at the time. When an early hot streak made the NBA model look better than it was, we published the honest number from a 6,477 game walk-forward backtest instead of the flattering one. Historical data is verified against canonical records, down to checking that Wilt's 100 point game and Cy Young's 511 wins come out exactly right. Regular season and playoff numbers are never blended.

The stack

Python does the data work and modeling. The site is a static Astro build deployed on Cloudflare Pages, with heavy archives on Cloudflare R2. A test suite of more than 7,000 checks guards the pipeline, the models, and the site data against silent breakage. If a number on this site is wrong, a test probably failed first.