Loading race day...
Spectating is not available for this runner.
{{ spectatorRunnerName ? spectatorRunnerName.charAt(0).toUpperCase() : '?' }}
{{ spectatorRunnerName }}
Lap {{ currentLap - 1 > 0 ? currentLap - 1 : 0 }}
/ {{ targetLaps }}
{{ formatRaceClock(raceElapsedSeconds) }}
{{ spectatorMoodDisplay.icon }} {{ spectatorMoodDisplay.label }}
{{ spectatorNutritionStatus }}
⏱
■
{{ raceStatus === 'dnf' ? 'DNF' : 'Race Ended' }}
— {{ laps.length }} laps completed
Back to Command Center
End Race
How would you like to mark this race?
Mark as Finished
Mark as DNF
Cancel
Race Day Dashboard
{{ formatRaceClock(raceElapsedSeconds) }}
Lap {{ currentLap }}
of {{ targetLaps }} target
{{ currentLapPaceLabel }}
→
Next: {{ nextLapPaceLabel }}
Next lap in
{{ formatCountdown(countdownSeconds) }}
{{ isOnline ? 'Connected' : 'Offline' }}
Runner In
Log Lap
Rest-window to-do
Lap {{ restWindowLapNumber }}
{{ restWindowTodosSummary.done }} / {{ restWindowTodosSummary.total }}
{{ group.label }}
{{ task.name }}
{{ task.notes }}
Race Nutrition
{{ macro.label }}
{{ macro.cumulative }} / {{ macro.target }}{{ macro.unit }}
Last lap: {{ macro.lastLap }}{{ macro.unit }} / {{ macro.perLapTarget }}{{ macro.unit }}
Last Lap (Lap {{ lastLap.lapNumber }})
{{ lastLap.split }}
Split
{{ lastLap.rest }}
Rest
{{ moodLabel(lastLap.mood) }}
Mood
{{ lastLap.carbs }}g
Carbs
{{ lastLap.fluids }}ml
Fluids
Intake Trend (3-Lap Avg)
{{ trend.label }}
{{ trend.avg }}{{ trend.unit }}
{{ trend.arrow }}
Per-Lap Breakdown
▼
Lap {{ lap.lapNumber }}
{{ lap.carbs }}g / {{ lap.fluids }}ml / {{ lap.sodium }}mg
Carbs
Fluids
Sodium
Crew Panel
Race Feed
👏
{{ totalCheers }}
👏
Send Cheer
+
New Post
New Post
×
🎵
{{ media.file.name }}
×
📷 Photo
🎥 Video
🎵 Audio
{{ composerError }}
Uploading {{ composerUploadIndex + 1 }} of {{ composerMedia.length }}...
{{ mediaUploading ? 'Posting...' : 'Post' }}
Post a Photo
×
Choose Photo from Gallery
×
Lap {{ currentLap }} · {{ photoFile.name }}
{{ photoUploadError }}
{{ photoUploading ? 'Uploading...' : 'Post Photo' }}
{{ feedNewActivityCount }} new {{ feedNewActivityCount === 1 ? 'item' : 'items' }} ↑
Loading feed...
No activity yet. Send a cheer to get things started!
📣
Cheers received
{{ totalCheers }}
· {{ cheerMeterTarget - totalCheers }} to go
📌 Pinned
⋯
{{ entry.pinned ? 'Unpin from top' : 'Pin to top' }}
Edit text
Remove media
Delete post
{{ feedEntryIcon(entry) }} {{ entry.type }}
Lap {{ entry.lap_number }}
{{ feedTimestamp(entry) }}
🔖
{{ entry.author_name }}
Cancel
{{ modBusy[entry.id] ? 'Saving…' : 'Save' }}
{{ entry.payload.summary.totalLaps }} laps
·
{{ entry.payload.summary.elapsedFormatted }}
· Mood {{ entry.payload.summary.avgMood }}/5
· {{ entry.payload.summary.totals.carbs }}g carbs
· {{ entry.payload.summary.totals.fluids }}ml fluids
{{ em }}
{{ getReactionSummary(entry.id).names.join(', ') }}
and {{ getReactionSummary(entry.id).others }} other{{ getReactionSummary(entry.id).others === 1 ? '' : 's' }}
{{ getReactionSummary(entry.id).total }} reaction{{ getReactionSummary(entry.id).total === 1 ? '' : 's' }}
✓✓ Seen by runner
🔥
React
💬
Comment
{{ getCommentCount(entry.id) }}
↗
Share
View {{ getTopLevelComments(entry.id).length - 2 }} more comment{{ getTopLevelComments(entry.id).length - 2 === 1 ? '' : 's' }}
{{ getAvatarInitials(c.author_name) }}
{{ c.author_name }}
{{ formatCommentTime(c.created_at) }}
Reply
×
{{ getAvatarInitials(reply.author_name) }}
{{ reply.author_name }}
{{ formatCommentTime(reply.created_at) }}
×
▶
▶
{{ feedLoading ? 'Loading...' : 'Load More' }}
Offline — feed frozen at last known state
{{ formatClockTime(lapClockElapsed) }}
{{ lapClockRunning ? 'Pause' : (lapClockElapsed > 0 ? 'Resume' : 'Start') }}
Lap
Reset
Lap
Split
Elapsed
{{ entry.lap_number }}
{{ formatClockTime(entry.split_seconds) }}
{{ formatClockTime(entry.elapsed_seconds) }}
No laps recorded yet. Start the clock and tap Lap to record splits.
👏
💪
🔥
...
Send
Slow down — you can cheer again in a moment
{{ reaction.emoji }}
👏
Send Cheer
👏
{{ cheerToastMessage }}
×
🏆
{{ milestoneToastData?.label }}
×
{{ milestoneToastData.message }}
{{ milestoneToastSummaryText() }}
Crew Panel
Lap {{ currentLap }} · Rest:
{{ formatRestTimer(restSeconds) }}
×
⚙ Sections
{{ crewSectionLabel(key) }}
☑
Prep Checklist
{{ checklistProgress.done }}/{{ checklistProgress.total }}
{{ checklistProgress.percent }}%
Loading checklist...
No checklist items configured. Add items in the Plan wizard.
{{ item.label }}
{{ item.completed_by }}
⚠
Alerts
{{ crewAlerts.filter(a => !isAlertFaded(a.id)).length }}
No alerts. All metrics within target range.
{{ alertSeverityIcon(alert.severity) }}
{{ alert.title }}
{{ alert.severity }}
{{ alert.message }}
🌎
GPS Map
{{ gpxTrackDistance }}
~{{ Math.round(gpxEstimatedPosition.fractionComplete * 100) }}% through lap
Tap to expand map
No GPX track uploaded
Loading map...
Collapse Map
📝
Previous Lap Notes
No laps completed yet.
Lap {{ lap.lapNumber }}
{{ getMoodIcon(lap.mood) }}
✎
{{ tag }}
{{ lap.voiceNote || lap.notes }}
No notes for this lap
Save
Cancel
Show More Laps
🏃
RUNNER IN
Lap {{ crewRunnerInFlashLap }}
Rest timer started
Open Crew Panel
Dismiss
Logging Lap {{ currentLap }}
{{ formatCountdown(countdownSeconds) }}
Runner In
Starts rest timer & notifies crew
Lap {{ currentLap }}
Rest:
{{ formatRestTimer(restSeconds) }}
{{ target.current }}{{ target.unit }}
/ {{ target.total }}{{ target.unit }}
{{ projectedText(target) }}
{{ target.label }}
{{ guidanceHint }}
Quick Log Presets
{{ preset.name }}
{{ preset.summary }}
{{ preset.carbs }}g / {{ preset.fluids }}ml
Quick picks
By frequency
{{ fuelItemInitialsLog(item.name) }}
{{ item.name }}
{{ fuelItemBoost(item) }}
{{ m.value }}
{{ m.unit }}
−
{{ fmtFrac(selectedItems[item.id].qty) }}
1/n
+
¼
⅓
½
Updates live as you log more items.
{{ cat.name }}
{{ fuelItemInitialsLog(item.name) }}
{{ item.name }}
{{ fuelItemBoost(item) }}
{{ m.value }}
{{ m.unit }}
−
{{ fmtFrac(selectedItems[item.id].qty) }}
1/n
+
¼
⅓
½
Mood
{{ m.icon }}
{{ m.label }}
Crew notes
Visible to crew, private
{{ voiceText }}
{{ voiceDuration }}
{{ voiceTranscript }}
{{ displayQty(id) }}
{{ item.name }}
Tap items above to build your lap
{{ total.value }}{{ total.unit }}
/ {{ total.target }}{{ total.unit }} target
{{ total.label }}
⚠
{{ summaryNudge }}
Confirm & Log Lap
Lap {{ successData.lap }} Logged
{{ successData.carbs }}g
carbs
{{ successData.fluids }}ml
fluids
{{ successData.sodium }}mg
sodium
Rest time:
{{ successData.rest }}
To-do this lap
{{ group.label }}
{{ task.name }}
{{ task.notes }}
Back to Dashboard
Lap logged.
Undo?
Undo