Inspiration

I love working out, and sharing what I’ve done with friends on social media helps me stay accountable. But a screenshot of workout stats rarely captures how it felt to be there. I built Rushes to bring the route and stats into my own videos, making it easier to share the effort, the place, and the moment.

How I built it

Rushes reads workouts and routes through HealthKit on iOS. In a SwiftUI editor, you can place stats and an animated route over a photo or video, adjust their appearance and timing, and export the result. Metal renders the routes and effects; AVFoundation handles the video pipeline. Rushes also creates monthly and yearly workout recaps, showing all your workout routes for a month and year.

The hard parts

  • Video export: I use AVAssetReader and AVAssetWriter to decode the source video and write the finished one. Each frame passes through a Metal render pipeline before it reaches the writer. Keeping video, overlays, animation, and audio aligned took careful work.
  • Route simplification: GPS tracks can contain thousands of points, including inaccurate fixes. I filter bad locations, project the coordinates into metres, and use an iterative Ramer–Douglas–Peucker algorithm to keep the turns that define the route. Different path budgets keep full-size routes and small recap routes efficient.
  • Preview and export consistency: The editor must show the same placement and animation that the exported file will contain. I had to make both paths use the same underlying geometry and timing rules.
  • Performance: Rendering video and animated graphics together puts sustained pressure on the GPU and memory. That shaped decisions such as caching textures and running exports one at a time.

What I learned

Building Rushes taught me how much technical work goes into making a creative tool feel simple. The result I care about is personal: finishing a workout, turning it into something I’m proud to share, and giving my friends one more reason to get out there too.

Built With

Share this project:

Updates

Submission history