You are the one who comes back next year.
Everything a captain does before the race happens on a keyboard, with a real screen and reliable internet. Everything a captain does during the race happens on a phone, in the cold, while being asked what time it is. RelayJoe treats those as two different problems.
Build it once, in a browser.
Roster entry is data entry. It does not belong on a phone, so RelayJoe gives captains a proper web app for it.
Pick the race, set the wave
Choose your event and year, then set your team’s start time and time zone. Times render in race-local for everyone, so the runner flying in from Denver whose phone never switched still sees the right clock.
Add runners with a pace estimate
Name, email, rotation slot, and a rough 10K time. The estimate does not have to be good — RelayJoe corrects it against reality after that person’s first leg, and the correction is usually 10 to 20 percent.
Set the rotation, or take the default
The standard rotation derives itself from your team size and the course. Pin a specific person to a specific leg when someone needs the short one, or the one in daylight.
Send join links
Each runner gets their own link, by email or copied into whatever group chat your team already lives in. They tap it, confirm they are Sarah, and they are on the team.
Preview the whole schedule
See every leg with its projected window before anyone books a flight. This is where you find out that leg 19 lands at 3am and Dave should probably not have it.
Write your own phrases
The encouragement a runner sees mid-leg comes from a pool you can extend or replace. Relay teams run on in-jokes; this is where yours go.
Stop being the only person who knows anything.
The captain’s view is everything a runner sees, plus the controls for keeping the race honest when reality diverges from the plan.
You see the full range
Runners get a single be-ready time so they are not doing interval arithmetic in a tent. You get both bounds, because you are the one deciding whether the next van has time to find food.
Fix the missed tap
Someone will forget to hit Finished. Correct the time and move on. Nothing is overwritten — a correction supersedes the original rather than erasing it, so the history stays honest.
Substitute mid-race
Swap a runner and the remaining rotation re-derives from that point. Legs already run stay credited to whoever ran them, and a finished leg cannot be reassigned by accident.
Flag an overdue runner
A leg that runs past its late bound flags itself. Red appears for this and for nothing else in the entire app, so when you see it you already know what it means.
Watch every device sync
See which phones have checked in and how recently. A phone that has been dark for two hours is not a mystery, it is a labelled row.
Revoke a device
Someone loses a phone, or hands one to the wrong person. Pull that device’s access without disturbing anyone else on the team.
Five things it learns, and one thing it refuses to do.
Pace is modelled multiplicatively, which is a technical way of saying that a leg that costs one runner ten percent costs everyone about ten percent. Five terms stack up:
- Base pace
- The 10K time you entered for them. A starting point, and nothing more.
- Leg difficulty
- Pooled across everybody. Every observation of the yellow loop, by any runner on any team, sharpens the estimate for every runner who has not run it yet.
- Runner bias
- The systematic gap between what someone claimed and what they run. The highest-value correction in the model, and estimable from a single leg.
- Fatigue
- How much the team slows per cumulative mile. Fitted at team level, because eight people times three legs is not enough data to fit eight individual curves and pretending otherwise would be dishonest.
- Night penalty
- What running a technical trail in the dark actually costs, applied to legs that fall in darkness.
RelayJoe will not give you a point estimate it cannot defend. Projected times come with an early and a late bound, and the wider that gap gets the less precise the display becomes — from an exact time, to a time with a window, to around 7:30 AM, to Saturday late morning. A number that pretends to be exact and then moves twenty minutes every hour is worse than no number, because you were going to plan sleep around it.
Ranges are also asymmetric on purpose. Blowing up on a night leg is common; dramatically beating your projection is not. A symmetric error bar around a midpoint would be a prettier lie.
One link for the people waiting at the finish.
Generate a spectator link and send it to whoever is asking. It opens in any browser with no account and no app, shows who is out and when the team is projected to finish, and you can rotate it whenever you want.
It is also your fallback for the one person on the team who cannot get the app installed, which there always is.
relayjoe.com/watch/7QK4M2