One app for the whole race. Those who follow it enter it with the code — as crew, with the PIN received from whoever builds the race; as public, with nothing else.
When it opens, the app first asks who you are. “Athlete”: I run. “Crew”: I support someone who runs, I follow their race, I write to them, I get their alerts. “Public”: I follow the race, positions and passages, typing nothing.
The crew enters with the race code and the crew PIN, 6 digits that Le Cairn makes for the race. The person who builds the race has a ready-made message to send: the app link, the PIN, and what it opens — the tracking, check-ins on behalf of the athletes, messaging, and the phone of the person running when they raise an alert. It is for the crew only: nobody publishes it.
The public enters with the code alone. No account, no PIN. A link received through “🔗 Share” leads straight to the race, with the athlete already chosen. And when you come back, the app reopens the last role and the last race on its own, even without network: “↩︎ Resume — Crew on MIETTES26”.
One tab per athlete — “#42 Zoé” — with their gap to the plan, and a sign when needed: 🚨, 🛑, or ⚠ when a cut-off is close. Below, 4 tiles: Current gap, Last CP — or “Last pebble” when a position is fresher than a check-in —, Estimated finish, and Next, with the time left. A 5th one, Your aid station, gives the next point where the crew can go, with a range of times.
Then the list of points. A point passed shows the real time and the gap. A point to come shows 2 times, optimistic and pessimistic, and where they come from: “🪨 last pebble” or “on the plan”. The next one is marked “next”; a threatened point carries “⚠ cut-off”, and a banner warns: “Only 14 min of margin left — Engreux (cut-off 11:30)”.
Checking in a passage: hold 1 second on the point, a bar fills up, and the “actual passage time” window opens. Confirm sends the time to the server, for the athlete on screen. If the athlete checked in too, the 2 check-ins merge: nobody erases the other. The server then tells the crew and the public following this person — “⛺ Zoé #42 · Engreux checked in at 11:12” —, never their own phone.
Writing: the 💬 button opens the messaging, 200 characters per message, signed “Crew”. The message arrives as a notification on the athlete's phone. In version 1.1, cheers from the public pass through it too, preceded by 📣. The person who builds the race can turn messaging off for a race.
The log “📜 Log” replays the race, newest first: “passes Engreux”, “drops a pebble at km 18.2”, “asks for help”, “cancels their alert”, “withdraws at km 23”, and the messages. A marker separates what is new since your last visit. And when the pebbles say the athlete reaches the assistance point in 30 minutes, a banner says so: “🏃 Zoé arrives at Engreux around 11:10”.
The “🚨 Alert my crew” button (the SOS) only exists if the person who builds the race enabled it. When the athlete triggers it, the Crew app opens a window that a simple tap does not close, with a long vibration: “Zoé is asking for help”, the point and the kilometre, “📞 Call Zoé” and “🗺 Open their position”. The “Seen — I'm on it” button records the reading time, which the athlete sees on their side. A red banner stays until the alert is lifted; then “✅ Zoé has cancelled their alert — all is well”. It calls no rescue service: that is written in full in the SOS guide.
A drop-out opens a window, only one: “Zoé has withdrawn”, the person is safe, “Got it”. Their dot freezes on the map. GPS silence: 45 minutes without a position in automatic tracking, and the app warns — “🛰 GPS silence — Zoé”, the last position, and “Perhaps a dead zone — the waiting positions will arrive when the network comes back”. The server sends the same alert, then “✅ is back in touch” when a position comes back.
The same tracking, simpler. A big finish card at the top: the estimated time and the gap, then “🏆 Finish!” once it is done — or “🛑 Withdrawn” and the kilometre. Below, the 3 tiles, the list of points, the pebbles on the map and the profile, the cut-off alert. The public sees neither the weather, nor the SOS, nor the messages, nor “Your aid station”, nor the log.
Cheering, in version 1.1: if the person who builds the race opened it, a 📣 button. “Your message goes to the messages of the person running. They will read it when they can.” A first name, a message, “Send” — and “Cheer sent 💪”, one per minute. Version 1.2 has set them aside: they come back in 1.3, with a way to report a message and block someone. The public writes nothing else and does not read the messages.
Sharing: “🔗 Share” makes the link of this tracking, for this race and this athlete. It goes through the phone's share sheet, otherwise it is copied: “✅ Link copied”. In version 1.1, the public page rereads the race every 20 seconds after a change, then every minute, then every 3 minutes when nothing moves — and right away when you come back to it. In 1.2, in beta, it follows live: a check-in, a pebble or a withdrawal shows within a second.
A trail means many dead zones. On the crew side, the race stays on the phone: without network, it shows again as it was at the last connection, and updates as soon as the connection returns. Check-ins made offline are kept — “⚡ Offline — 2 check-ins waiting, kept on the phone” — and go out on their own when the network returns, even if the app was closed in the meantime. The server then announces only one “checked in”: the furthest point.
The map works without network: tiles already seen are kept. The weather says when it is old: “⚠ Offline — forecast received at 10:20”. And if the crew PIN changed in the meantime, nothing is lost: “Your check-ins are kept: enter the new PIN to send them.”
On the public side, no copy of the race on the phone: only the followed athlete's check-ins remain. A banner says so: “⚡ Offline — info received at 11:20”.
To tell the crew before the start, so they know what to count on — and what not to count on.