A race-type-flexible penalty system. Triathlon's penalty box is one preset, not the whole model - it works for any sport. Add time, record a served penalty, log a warning, or change an athlete's status, and watch the ranking refresh on its own.
A penalty can mean three very different things, so RaceTime carries three. A time-added penalty adds seconds to the official result. A served penalty records that the athlete served their time - often with the duration shown - without touching their ranking time. A warning logs an official caution with no time at all. Status decisions - DNF, DSQ, and LAP (lapped - available for multi-stage and multisport races) - are tracked separately from time penalties, so a disqualification is never tangled up with a thirty-second add.
Everything starts at one switchboard. Decide how penalties behave, how they appear to the public, and who gets which job - then officials open a link and start working.
Officials work from a chromeless mobile app - no clutter, just the decision in front of them. They identify themselves first, find the athlete, and issue the penalty. Time penalties over 60 seconds ask for an explicit confirm, and every action is logged with who did it.
A course official issues "bib 1024, 30s to serve". The zone manager runs the countdown on a control screen, and a big field-facing display tells the athlete exactly when they're free to go.
A confirmed time-added penalty refreshes the athlete's adjusted time and re-ranks the field automatically. The public list shows the adjusted official time as the headline, with the raw time underneath as the explanation. Served, warning and pending markers never change time, and a DSQ row never shows a final time at all. In the admin Times Table, a compact penalty column and a "Manage penalties" quick action keep it all one click away.