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:

  1. Complete a ride
  2. Tap Share Challenge on the post-ride summary
  3. A deep link is generated: “Mike rode Riverside Loop in 1:15:42. Can you beat it?”
  4. 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
Download Ride Director