Ghost Race
Asynchronous competition — race against a recording, anytime.
Self Ghost
Every ride you complete creates a ghost track. On your next ride on the same route, you can race against your previous self.
The AI narrates the gap in real-time:
- “Ghost: +8s AHEAD” — you’re behind the ghost by 8 seconds
- “Overtaken. Leading by 2s.” — you just passed the ghost’s position
Gap updates trigger when the time difference changes by more than 5 seconds.
Friend Ghost Challenge
Share a challenge with anyone:
- Complete a ride
- Tap Share Challenge on the post-ride summary
- A deep link is generated: “Mike rode Riverside Loop in 1:15:42. Can you beat it?”
- Share via any iOS Share Sheet method
When the recipient taps the link:
- Has the app: Opens directly with the ghost pre-loaded
- Doesn’t have the app: Goes to App Store, then opens with the ghost after install
This is Ride Director’s primary growth engine.
How Ghost Position Works
Ghost position is calculated using spatial indexing on the original GPS track, not raw timestamps. This means:
- The gap calculation is accurate even if you take a slightly different line
- Position updates happen based on distance along the route, not clock time
- Minor route variations are handled gracefully
Storage
- Self-ghosts: Stored locally on your device
- Friend ghosts: Uploaded to Cloudflare R2 when you create a challenge, associated with a unique challenge code
- Ghost tracks are automatically deleted 90 days after last access