// Workshop · LAB-12
MotionBridge.
An iPhone, iPad and Apple Watch app that connects to my indoor bike over Bluetooth, shows the ride live, and logs it to Apple Health and Strava when I'm done.
It's also my first native Swift app and my first project built with OpenAI Codex. Codex wrote the code. I wrote the spec and did the riding.
// Why I'm building it
Sometime between last winter and this one, the app I used with my bike stopped working.
I ride a stationary bike almost only in winter. When I got back on it this year, the app I'd always used still opened, but the service behind it was gone, and without the service the app did nothing. I looked at the free alternatives and didn't love any of them.
What I needed was small. A bridge that pulls the numbers off the bike and puts them where my training already lives, in Apple Health and in Strava, which passes them on to the other services I use. A few years ago that gap meant settling for whatever app was out there. The world has changed enough since then that building my own seemed like the obvious move.
It's for me and nobody else, so there's no App Store release planned. I sideload it onto my iPhone and Watch. It was also my chance to build a fully native app in Swift for the first time.
// What it looks like


// What it does
Power first
Power is the number that matters on a bike, so it gets the biggest type on the screen. Every digit is the same width, so a jump from 99 to 100 doesn't shove the layout around.
Heart rate from the wrist
A companion Apple Watch app launches with the ride and sends my heart rate straight into it.
Rides land where they belong
A finished ride saves to Apple Health and Strava, and Strava passes it along to everything else I use.
Keeps recording in the background
Change a podcast or answer a text mid-ride and the recording carries on.
Honest about stale data
If the bike stops sending, values dim after three seconds and clear after thirty. Ten seconds of silence pauses the recording on its own.
This ride, not the console's lifetime
Bike consoles often keep a running distance. MotionBridge counts only this ride and shows the console total separately, labeled for what it is.
// The design system
Graphite and Signal, where one color means live and everything else stays out of the way.
Graphite surfaces carry the numbers. Signal green means connected and live, red is kept for recording, and amber means paused or stale. No other color competes with the data.
Type is the system font with fixed-width digits and no licensed fonts. The mark is a wheel whose line runs out to a single signal dot, and the dark, light and tinted icons all come from the same drawing.
- Background
- Surface
- Accent
- Recording
- Warning
// Building it with Codex
I've built plenty with Claude by now, but I hadn't tried Codex, and I wanted to see the difference on a real project.
I fell straight back into my old product manager role. I wrote a spec and a solution design, and I researched the bike's make and model and what its console could report, so the app could get the most out of it. Codex wrote all of the code. I enjoyed reading through it and finding the gaps, like the optimizations Xcode flagged that Codex hadn't accounted for.
I was also the test rig. Every change meant getting back on the bike and riding through it to see whether it worked.
What impressed me most was how easily it took on new ideas once the basics ran. An iPad layout came next, then background recording, so the ride keeps going while I change a podcast or answer a text. Then a small Apple Watch app that launches on its own and adds my heart rate to the ride, which the other apps never did well.
// What's next
It's running on my devices today, and I'm still tweaking it.
Next is my water rower. I'm adding it so one simple app covers every indoor workout I do. No ads and no new subscription, just my workout time logged.