Standings after the previous rounds come from chess-results.com, saved into the page by build_data.py. Its tiebreak arithmetic reproduces the official numbers exactly.
Live games for every table are read from the Lichess broadcast API. The page refreshes every 30 seconds, on the clock, the same for everyone. Each refresh reloads the broadcasts holding the top tables and one of the lower-table broadcasts in rotation, so the lower tables refresh about every 3½ minutes. This keeps the page well within Lichess's rate limits.
Evaluations: top-table positions use the Lichess cloud eval when it exists, otherwise Stockfish runs in your browser. Medal contenders' matches get shorter Stockfish runs; the rest get quick scans.
Eval → result odds: the engine score becomes win/draw/loss chances with a logistic model tuned for elite classical games. Draws get wider as material comes off. Early on, a rating edge is added and fades out by about move 40. Finished games are fixed.
Medals: every live game in the round is sampled many times (Monte Carlo). Each run is ranked by match points, then Olympiad Sonneborn-Berger without the lowest opponent, then game points, then the adjusted match-points sum.
Δ is the change against a rating-only projection made before any moves were played.