The brief.
Most endurance apps treat training as a calendar of workouts. GhostPacer treats it as a relationship: between your fitness, your fatigue, and the runner you used to be. The product had to feel like a thoughtful coach who quietly remembered everything — without becoming another notification stream.
The Ghost.
The Ghost engine reconstructs synthetic rivals from your own activity history. Pick a route, a target effort, or a memory of a good day, and I generate a pace ribbon you can chase live. I chose your past self over global leaderboards on purpose: comparison should make you fitter, not lonelier.
Real-time analytics.
I rebuild CTL, ATL, and TSB on every sync, then expose the deltas as plain language: fresh enough for hills tomorrow, do not race Saturday. The maths is conventional sports science. The work was making it feel like a friend, not a chart.
Cross-platform craft.
One codebase, three surfaces. A native shell wraps a single reactive UI for Android and Desktop, while the same project deploys to the web. OAuth runs through native deep links so the round-trip feels like one tap, not three browser hops. Secure session storage, biometric unlock, and offline-first caches do the rest.
What I am proud of.
The product feels weirdly calm for a fitness app. No streaks, no shouting, no neon. Just a clean ribbon, a useful number, and a quiet voice that says you are ready. Engagement is high without being addictive — a distinction that matters to me.