# Ghostbike - race against the ghost of a previous ride

**URL:** <https://dev.unawatch.com/t/ghostbike-race-against-the-ghost-of-a-previous-ride/58>\
**Category:** Showcase\
**Created:** [August 27, 2026, 3:34pm UTC](https://dev.unawatch.com/t/ghostbike-race-against-the-ghost-of-a-previous-ride/58 "2026-08-27T15:34:04Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![lewis\_una](https://yyz2.discourse-cdn.com/flex048/user_avatar/dev.unawatch.com/lewis_una/32/42_2.png) [@lewis\_una](https://dev.unawatch.com/u/lewis_una)\
**Post date:** [August 27, 2026, 3:34pm UTC](https://dev.unawatch.com/t/ghostbike-race-against-the-ghost-of-a-previous-ride/58/1 "2026-08-27T15:34:04Z")

</div>

Ghostbike is an activity app, which allows you to race against a previous bike ride. It’s a fun little app for bike commuters like myself!

Simulator snapshot:

 ![image](https://canada1.discourse-cdn.com/flex048/uploads/unawatch/original/1X/d5a285f2110094278529e28f0ab71b65d6e0206a.png)

I built Ghostbike for a couple of reasons…

1. I commute to UNA HQ almost every morning and I wanted to have an app that showed me in real time if I was ahead or behind my PB.

2. I wanted to try out the development experience and app publishing experience for myself.

I should point out that I’m **not** an experienced C++ developer. My background is in electronics engineering and I’m the CEO here at UNA - which essentially means I’m in charge of admin!! For this exercise, I deliberately refrained from poking Ross and Denys, our firmware developers, on Slack to see how far I could get with the docs (and Claude..)

Anyway, back to development:

The app is a fork of Cycling and maintains all of its features: laps, autopause and .fit file creation all still work. However, in addition, you now have the option of racing against a ghost - a track saved from a previous ride.

The app uses a simple time/distance comparison during the ride, and then has a finish detection feature based on coming within 10m of the end of the track.

I used Claude extensively (almost entirely) to develop Ghostbike. My preferred setup is to use the Claude extension within VS Code.

My process was:

- Provide some UI snapshots and describe the main screens.
- Ask Claude to create a Requirements.md based on my input.
- Review Requirements.md and iterate.
- Ask Claude to generate the UI in the TouchGFX simulator before writing any app logic. Claude can actually drive the simulator as well, but I found I was competing with it for focus, so this needs some refinement. Multiple iterations here.
- Finally, ask Claude to build the logic and complete the .uapp build.

The fact I was able to essentially vibe code this almost entirely is a testament to the SDK documentation and the various md files in the SDK repo. Nice job @Ross_UNA!

On to testing…

Despite being a fairly basic app, there were still a few bugs to iron out. A few laps later, and the app was behaving well.

 ![IMG_6207](https://canada1.discourse-cdn.com/flex048/uploads/unawatch/original/1X/9a013d90cc67505664c72eabf5efcb7260e11ea8.jpeg)

 ![IMG_6212](https://canada1.discourse-cdn.com/flex048/uploads/unawatch/original/1X/ba8962ebc48bf9ff724236b48c4ee3d74e5aebfd.jpeg)

 ![IMG_6213](https://canada1.discourse-cdn.com/flex048/uploads/unawatch/original/1X/5ed796c417da79f10a0bb1d719d0fe14b8f08c61.jpeg)

So, there we are. The app is in the app store - let me know what you think!

My hope is that UNA apps will span a spectrum of tone and purpose, from serious, performance-oriented training tools to more playful experiences like Ghostbike!

---

<div class="post-metadata">

**Author:** ![jon-hybrid-x](https://yyz2.discourse-cdn.com/flex048/user_avatar/dev.unawatch.com/jon-hybrid-x/32/66_2.png) [@jon-hybrid-x](https://dev.unawatch.com/u/jon-hybrid-x)\
**Post date:** [September 22, 2026, 5:34pm UTC](https://dev.unawatch.com/t/ghostbike-race-against-the-ghost-of-a-previous-ride/58/2 "2026-09-22T17:34:21Z")

</div>

Looks awesome can’t wait to try it
