Skip to content
← all projects

Race Compare

A live dashboard for comparing triathlon race splits side by side.

category: technical · tags: Triathlon, PHP, Data viz


Race Compare is a dashboard built to answer a question that comes up constantly in the triathlon community: “how did my splits compare to that other race?” It pulls in swim, bike, and run splits from two or more race results and lays them side by side so you can see exactly where time was gained or lost — going into T1 late, a slower back half of the bike leg, negative-split running, and so on.

What it does

  • Imports race results from CoachCox and raceresult.com, the two timing/results platforms most commonly used by triathlon organizers in this region.
  • Normalizes the imported splits (swim, T1, bike, T2, run) into a common format so results from different timing systems can be compared directly.
  • Renders the comparison as interactive charts, making pacing differences visually obvious rather than requiring a manual spreadsheet diff.
  • Logs usage (visits, imports) and pushes a daily summary notification via a self-hosted ntfy instance — the same notification stack used for the family notification system.

Technology & approach

  • Backend: PHP, running on the same self-hosted infrastructure as the rest of tsyahill.org — no separate hosting, no external SaaS dependency for the core functionality.
  • Data visualization: Chart.js for the split-comparison charts.
  • Import layer: parses/scrapes result data from CoachCox and raceresult.com result pages, since neither platform offers a public API for this — a pragmatic, purpose-built integration rather than a generic one.
  • Logging & notifications: a lightweight PHP logging endpoint plus a daily cron job that summarizes visits/athlete activity and pushes it to ntfy — reusing the same self-hosting pattern (cron + ntfy) used elsewhere on this site rather than building a bespoke analytics stack.

It’s a genuinely live tool — friends and training partners use it to review their own race splits, not just a portfolio demo.

Open Race Compare in a new tab →