🏃 Race Tracker

Your ultra season,
organized beautifully.

Track races from dream to finish line. Manage your pipeline, plan gear, analyze your calendar, and connect with your running community — all in one place.

Everything you need for race season

Built by ultrarunners, for ultrarunners

🔄 Race Pipeline
Track every race from initial interest through registration to the finish line.
🤔 Considering → ✅ Registered → 🏆 Completed
Western States 100 Goal
Miwok 100K Training
UTMB Dream
📊 Dashboard & Stats
See your entire season at a glance with stats, PRs, and geographic coverage.
5
Registered
12
Completed
847
Miles
Next: Leadville 100 — 42 days Ready
50K PR: 4:32:15 (road) PR
📅 Calendar & Warnings
Visualize your season and get smart warnings about recovery windows.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
⚠ Only 7 days between 100-milers
🎒 Gear & Community
Build race-specific gear lists and follow your friends' race seasons.
✓ Headlamp + spare batteries
✓ Emergency blanket
Drop bag: Mile 62
Crew box supplies
🏃 Race Tracker
Personal race management
  • 📊 Dashboard
  • 🤔 Considering
  • ✨ Someday
  • ✅ Registered
  • 🏆 Completed
  • 🎒 Gear
  • 📅 Calendar
  • 👥 Community
  • ⚙️ Settings
Profile {{ currentUser.display_name?.charAt(0)?.toUpperCase() || '?' }}
{{ currentUser.display_name }}
{{ currentUser.email }}

{{ editingRace ? ('Edit ' + eventCategoryLabel) : ('Add ' + eventCategoryLabel) }}

🔗 Quick Add from URL
{{ fetchError }}
{{ race.name }}
{{ race.distance_miles }} mi · {{ race.location }}{{ race.state ? ', ' + race.state : '' }}{{ race.country !== 'USA' ? ', ' + race.country : '' }}
Public races appear in your followers' Community feed
{{ country }}
▶ Expected Conditions
{{ showEnrichment ? '▼' : '▶' }} Weather & Map
{{ weatherData.conditions === 'Hot' ? '🔥' : weatherData.conditions === 'Warm' ? '☀️' : weatherData.conditions === 'Mild' ? '🌤️' : weatherData.conditions === 'Cool' ? '🌥️' : '❄️' }}
{{ weatherData.temperature_high_f }}°F Low: {{ weatherData.temperature_low_f }}°F
{{ weatherData.conditions }}
{{ weatherData.precipitation_chance }}% chance of rain
Based on {{ weatherData.historical_years }} years
{{ weatherData.error }}
✓ GPX loaded
🔍 Similar Races You've Completed
{{ race.name }}
{{ formatDate(race.date) }} · {{ race.distance_miles }} mi · {{ race.elevation_gain_ft.toLocaleString() }} ft · {{ race.terrain }}
{{ formatTime(race.finish_time_seconds) }}
{{ getStatusLabel(race.status, race.event_category) }}
{{ race.status }}
"{{ race.post_race_notes.substring(0, 150) }}{{ race.post_race_notes.length > 150 ? '...' : '' }}"
🏃 Race Tracker
{{ isRegistering ? 'Create your account' : 'Sign in to continue' }}
{{ authError }}
Don't have an account? Sign up Already have an account? Sign in
🗑️
{{ confirmModal.title }}
{{ confirmModal.message }}

{{ viewingRace?.name }}

{{ getStatusLabel(viewingRace.status, viewingRace.event_category) }} 📅 {{ formatDate(viewingRace.date) }} 📍 {{ viewingRace.location }}, {{ viewingRace.state }}
{{ viewingRace.distance_miles }}
MILES
{{ formatTime(viewingRace.finish_time_seconds) }}
FINISH TIME
{{ viewingRace.elevation_gain_ft.toLocaleString() }}
ELEVATION (FT)
#{{ viewingRace.overall_place }}
OVERALL PLACE
⌚ Garmin Activity View on Garmin →
{{ viewingRace.garmin_avg_hr }}
AVG HR
{{ viewingRace.garmin_max_hr }}
MAX HR
{{ viewingRace.garmin_calories.toLocaleString() }}
CALORIES
{{ viewingRace.garmin_training_effect.toFixed(1) }}
TRAINING EFFECT
🌡️ Conditions
High: {{ viewingRace.temp_high_f }}°F Low: {{ viewingRace.temp_low_f }}°F Humidity: {{ viewingRace.humidity_percent }}%
{{ viewingRace.weather_description }}
📊 Splits
Split Mile Time
{{ split.location }} {{ split.mile }} {{ split.time }}
📝 Notes
{{ viewingRace.post_race_notes }}
🌐 Visit Race Website
📝
No journey entries yet
Document your race experience - pre-race nerves, key moments, finish line feelings
Mile {{ entry.race_mile }} {{ formatTime(entry.race_time_seconds) }}

{{ entry.title }}

{{ entry.entry_type }}

{{ entry.content }}

{{ editingJourneyEntry ? 'Edit Moment' : 'Add Moment' }}

Max 10 photos per entry. JPG, PNG or WebP.
Save the entry first, then you can add photos

Link Garmin Activity

Select an activity from near the race date:

No activities found near this date
{{ activity.name || 'Untitled Activity' }}
{{ activity.type }} • {{ activity.start_time?.split('T')[0] }}
{{ formatGarminDistance(activity.distance_meters) }}
{{ formatGarminDuration(activity.duration_seconds) }}
❤️ {{ activity.avg_hr }} bpm 🔥 {{ activity.calories }} cal ⛰️ {{ Math.round(activity.elevation_gain * 3.28) }} ft
{{ toast.type === 'error' ? '⚠️' : toast.type === 'success' ? '✓' : 'ℹ️' }}
{{ toast.title }}
{{ toast.message }}

Compare Races

{{ race.name }}
Date {{ formatDate(race.date) }}
Distance {{ race.distance_miles }} mi
Time {{ formatTime(race.finish_time_seconds) || '-' }}
Place {{ race.overall_place ? '#' + race.overall_place : '-' }}
High Temp {{ race.temp_high_f }}°F
Max Altitude {{ race.altitude_high_ft.toLocaleString() }} ft
Weather {{ race.weather_description }}
Sleep {{ race.sleep_quality }}
Avg HR {{ race.garmin_avg_hr }} bpm
Max HR {{ race.garmin_max_hr }} bpm
Calories {{ race.garmin_calories.toLocaleString() }}

{{ editingGearTemplate ? 'Edit Template' : 'New Gear Template' }}

Gear for {{ selectedRaceForGear?.name }}

Create a gear list for this race:

Pack Progress:
{{ packedCount }}/{{ currentRaceGear.items.length }} items
{{ item.name }} ×{{ item.quantity }} {{ item.category }} 📦 {{ item.drop_bag_location }}

Post-Race Gear Notes

What Worked
What Didn't
Would Change