The Rogue Echo Bike’s Screen Is the Worst Part: So I Built the App It Should Have Had

Bottom line up front: ZoneCycle reads watts, cadence, calories, and heart rate off your Rogue Echo Bike over Bluetooth and puts them on your phone in big, easy-to-read type, with color-coded heart-rate zones and a voice coach that calls your intervals for you. It is free, with no ads and no subscription.

ZoneCycle dashboard showing 377 watts with a red heart-rate zone
Mid-interval: watts, cadence, and heart rate in big type, with the zone flashing red when you are working hard.
ZoneCycle dashboard showing 118 watts with a green heart-rate zone
Recovery: the same readout, now green, so you can see when it is time to go again.

Fourth in a series on building small iOS apps by describing them to Claude Code, one stubborn idea at a time. Previously: Weather Gnome, Times Table 400, and Softly.

My doctor is the reason there is a bike in my basement

At a checkup last winter, my doctor made the case for high-intensity interval training (short, hard bursts with recovery in between) as one of the most time-efficient things I could do for my heart. So I did what any reasonable person does: I went down an internet rabbit hole and came out having bought a Rogue Echo Bike and a Rogue Echo Rower, and set them up in the basement for a winter of HIIT.

The bike is a beast. Fan-driven, nearly indestructible, the kind of machine you could hand down to your grandkids. There is exactly one bad thing about it.

The Rogue Echo Bike’s screen is the worst part

The stock console is a small, dim, no-backlight LCD. In a bright gym it is merely dated; in a basement, at 6am, mid-interval, with sweat in your eyes, it is nearly useless. You are supposed to be pushing to a target, and instead you are squinting at a gray readout hunting for your heart rate. Search “rogue echo bike display” or “rogue echo bike screen hard to read” and you will find the same complaint on repeat: incredible bike, console from 2005.

Does the Rogue Echo Bike have Bluetooth?

This is the question that decides everything. The newer Echo Bikes (roughly the current console, ~2023 onward) broadcast your ride data over Bluetooth and ANT+ using the standard FTMS (Fitness Machine Service) protocol. Older ones (2017–2023) do not. Rogue sells the M2 monitor upgrade to add it. If your bike broadcasts, any app that speaks FTMS can read your live watts, cadence, calories and heart rate straight off the machine. Which means the display problem is really a software problem. And software problems I can do something about.

So I built the app I wanted

I am not a programmer. I build these apps by describing what I want to Anthropic’s Claude Code and iterating stubbornly until they exist. This time the itch was personal and specific: I wanted the basement bike to have the screen it deserved.

So I built ZoneCycle. It reads watts, cadence, calories and heart rate off the bike over Bluetooth and puts them on your phone in big, readable type, the numbers you are actually chasing, legible from the saddle. Pair a Bluetooth chest strap and it does the thing the stock console never could: it colors the whole screen by heart-rate zone. Green means recover. Orange means work. You know where you are with a glance, not a stare.

Why heart rate, not watts (and why you don’t need the $200 M2)

Here is a thing the fitness-tech world does not love to say out loud: on a fan bike, the watts are a guess. There is one sensor reading the fan’s RPM, and power and calories are estimated from a curve. It is a perfectly fine number to glance at, but it is not the precise, trainable power a road cyclist gets from a crank meter. Chasing “exact watts” on an air bike is chasing fake precision. Your heart rate, though, is real, and it is the number that actually tells you how hard you are working. So ZoneCycle leads with the honest metric: your heart, in color.

There is a second thing worth knowing. Rogue sells a $200 monitor upgrade (the M2), and one of the things it unlocks is on-bike interval coaching. But if you have the current console, your bike is already broadcasting everything over Bluetooth. You do not need a $200 add-on to get coached intervals; you need an app that reads what your bike is already saying. That is the whole idea: ZoneCycle is the free coaching layer for the console you already own.

Training by zones, not by guessing

Here is where ZoneCycle stops being “a nicer screen” and starts being a coach. It sorts your effort into five heart-rate zones based on a percentage of your maximum heart rate, and it estimates that max with the Tanaka formula (208 − 0.7 × your age), which the research finds more accurate for adults than the old 220-minus-age rule. Tell it your fitness level and it shifts the zone bands to match, so “orange” means the right thing for you, not for a 25-year-old athlete.

The workouts are deliberately simple interval structures: a two-minute warm-up, then repeated pushes and recoveries (10 seconds on / 40 off, or 20 on / 60 off) for 5, 10, or 15 minutes, then a cool-down. A voice coach calls the pushes and recoveries on the clock, so you never have to look down. It scores your time in the hard zones, and at cool-down it measures how fast your heart rate drops in the first minute, a genuine marker of fitness that improves as you get fitter. None of this is hand-waving: the app cites its sources in-app (Gibala’s low-volume HIIT research, the Tanaka max-HR paper, Cole’s work on heart-rate recovery, the AHA target-zone chart).

(A few things I am still building: a zone compass, smarter voice feedback when you drift out of your target band, and Apple Health export. Those are in the next update, not the version on the store today.)

What the build actually taught me

The recurring lesson of this series is that the code is the fast part, and every app has some other part that turns out to be the real work. For the weather app it was personality; for the math app, the curriculum. For a bike app, it was the plumbing: live Bluetooth sensor data is messy, drops out, and disagrees with itself, and making a number on screen feel instant and trustworthy took far more care than drawing it did. The second surprise was the zone math: getting “what counts as orange for this person” right is a real question with real research behind it, and honoring that is the difference between a toy and a tool. After several rounds of design and debugging, everything started to come together, and the app finally felt just right.

The surprising part: it is actually fun

I expected to build a better gauge. I did not expect the workout to change. Training to a color instead of a number is weirdly freeing: you stop doing math mid-sprint and just chase the orange, and the intervals fly by. The app removes friction to use, provides an easy heads-up display of your data, and seamlessly integrates a motivational coach right where I need it most. I enjoy switching between the coaches from time to time; the coaching personas Sensei and Vicky are my favorites.

This evolution has been the inspiration to adapt the platform beyond the bike: ZoneRow and ZoneRun should be hitting the App Store soon.

Try it

ZoneCycle is free on the App Store, no ads and no subscription. If your Echo Bike (or any FTMS bike) deserves a better screen than the one it shipped with, that is exactly what it is for: riverroadlabs.app/go/6790217662.

If you want more of these, my other apps are on the App Store too: Weather Gnome, Times Table 400, and Softly.

Softly: Vibe-Coding, Round Three

Follow-up to Times Table 400: Vibe-Coding, Round Two

The Idea

Every sleep app I have ever tried wants to fix me with science. Breathing exercises, brainwave frequencies, a subscription. But the most reliable sleep technology ever invented is a lot older than any of that: someone you trust, reading you a story you already know, slowly, while the rain comes down outside.

So that is the concept of my next app: Softly — classic bedtime stories, read aloud in a calm gentle voice, over soft rain or a crackling fireplace, with a sleep timer that fades everything out after you have drifted off. The whole thing is designed to be like your sweet grandmother or mom reading to you by candlelight (with a classic British accent):

Softly welcome screen
Classic stories, cozy ambience, drift off. That is the whole app.

Classic Bedtime Stories

Softly ships with eight books: The Wind in the Willows (1908, all twelve chapters, six and a half hours of narration), five Beatrix Potter tales, The Velveteen Rabbit, and a curated handful of drowsy Robert Louis Stevenson poems. All beautifully written, all timeless, all perfect for bedtime.

The Code Was Easy. Vibe Coding The Sound Wasn’t.

If you have read the earlier posts in this series, you know the setup: I am not a programmer, and I build these apps by describing what I want to Anthropic’s Claude Code (the Fable 5 model) and iterating stubbornly until it exists. And you know the recurring lesson: the code is the fast part, and each app has some other part that turns out to be the real work. For the weather app it was the aesthetic personality. For the math app it was the development of the curriculum. For a bedtime app, it is hitting the mark on the sound.

The narration is AI-generated, a soft British voice I auditioned against several candidates and then slowed to a dreamy 85% pace. Auditioning voices for a bedtime story is exactly as pleasant as it sounds, but it is also genuinely a judgment call: one candidate read beautifully but unevenly, and uneven is fatal at 11 PM. The computer cannot tell you which voice would put a child at ease. You have to listen.

The ambient sound was harder. My first rain loop had a faint electrical hum that surfaced every twenty seconds or so, it turned out to be the seam where the loop restarted, and fixing it properly meant learning more about audio filtering and seamless loops than I ever expected to know. And then there were the crickets. I wanted a summer-night crickets option, and I generated attempt after attempt, and every single one sounded like tinny white noise instead of a meadow. After three rounds I cut the feature entirely. Rain and fireplace made the bar; the crickets did not. Shipping is choosing.

Softly reader with the listening bar
The listening bar: play, rain, fire, a pace turtle, and a sleep timer.

Apple Said No

Weather Gnome sailed through review. Times Table 400 got questioned at the border. Softly got flat-out rejected.

The rejection letter cited “Guideline 4.2.2 — Minimum Functionality” and said the app “only includes links, images, or content aggregated from the Internet” and “does not sufficiently differ from a web browsing experience.”

I contemplated this initial rejection several times. Softly has no links. It has no web view. It makes no network requests at all, every word of every book and every minute of audio is bundled into the app. You can use the whole thing in airplane mode. Whatever the reviewer was describing, it was not the app I shipped. After two rounds of App Review being demanding but basically reasonable, this was my first rejection that was simply wrong.

The Counterpunch

Here is where the earlier lesson — App Review is a conversation, not a verdict — paid off, because the temptation is to either despair or fire off an angry reply. We did neither. We did three things, all in one evening.

First, a calm, factual response in the Resolution Center: no links, no web content, no network use, eight narrated books, native audio engine. No indignation, just receipts.

Second — and this is the part I am proud of — instead of only arguing that the app was native enough, we made it more obviously native. The rejection became the excuse to build the feature a bedtime app should have had anyway: full lock-screen playback controls. Play, pause, skip, scrub, the chapter and book title right there on the lock screen with a little moon artwork. Now the phone itself testifies that this is a real audio app.

Third, the rejection mentioned the review was done on an iPad, and the iPad screenshots were the weakest part of the listing. New ones, same evening.

Resubmitted that night.

Softly library on iPad
The shelf, on the very device the reviewer used.

Approved!

One day later: approved, and Softly is live on the App Store. Free, no ads, no accounts, and — as the review saga established beyond all doubt — it works entirely offline!

Some Thoughts

  • A rejection is not always right. Reviewers are humans moving fast. If the facts are on your side, state them plainly and politely, with evidence. Do not despair and do not vent — neither one ships apps.
  • Turn the rejection into a feature. The best answer to “this does not feel like a real app” was to make it undeniable. The lock-screen controls were on the wish list anyway; Apple just moved them up the schedule.
  • The public domain is a gift. Some of the best bedtime literature in the English language is sitting there, free, waiting to be treated well. (See you in January, Pooh!)
  • Every app has its hard part, and it is never the code. Personality, curriculum, and now sound. The pattern is holding: the model writes the code, and the judgment is still your job.
  • Round three really is easier. The certificates, the screenshots, the submission ritual — what used to take days of head-scratching is muscle memory and a folder of scripts now.

Softly is on the App Store now! Pick a story, light the fireplace, set the sleep timer, and let Mole and Ratty row you to sleep.