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.

Times Table 400: Vibe-Coding, Round Two

Astronaut Mochi, the Times Table 400 mascot, cheering in a watercolor spacesuit
Astronaut Mochi — chief morale officer of Times Table 400.

The Idea

Somewhere along the way, everybody agreed that times tables stop at 10×10. Maybe 12×12 if your teacher was ambitious. And then… nothing. There is an invisible wall at the edge of the multiplication chart, and past it lies the land of “just use a calculator.”

A kid (or an adult!) who can casually knock out 14×16 in their head walks around with a genuine superpower not because those facts come up constantly, but because of what knowing them does to your confidence with numbers.

So that is the app: a multiplication trainer that goes all the way to 20×20. Twenty times twenty is a 400 square grid, hence the name Times Table 400.

Vibe-Coding, Round Two

If you read the Weather Gnome post, you know the setup: I am not a programmer, and I build apps by describing what I want to Anthropic’s Claude Code (the Fable 5 model) the way I would explain a project to a friend, then iterating stubbornly until it exists.

This time it went fast. The whole space-themed skeleton — an astronaut mascot named Mochi, quiz “missions,” a Warp Manual full of mental-math techniques, a Galaxy Chart that tracks your mastery across the grid, a 60-second Hyperspace Sprint mode — went from idea to a working build on my phone in a day. Sounds, celebration screens, the works.

Times Table 400 home screen with Astronaut Mochi, galaxy conquest progress, and four sectors
Mission control: four sectors from the Home System (factors 2–9) out to Deep Space (17–20).

The second app is dramatically easier than the first. Partly because I knew the ritual this time (certificates, provisioning profiles, App Store Connect, the Apple bureaucracy from last time), and partly because the tooling from Weather Gnome carried over. The scripts and checklists we built shipping the first app became a little reusable kit, and app number two got to ride on it.

The Code Was Easy. The Teaching Wasn’t.

Here is the lesson that surprised me: for an education app, writing the code is the fast part. Deciding how to teach is the slow part, and the AI cannot decide that for you.

Does a beginner need every fact introduced with a little step-through derivation, or is that condescending for 2×3? (It is condescending. Early testing made that obvious the app was dutifully teaching facts a kid already knew cold, so we gated the intros to skip trivial and already-mastered material.) When should a missed fact come back around? What does a technique lesson for the 17s even look like? Those are curriculum questions, not code questions. The AI drafted options in seconds; choosing what was actually good for a learner was the real work.

A quiz mission in Times Table 400 asking which number times 14 equals 98
Life beyond the wall: ? × 14 = 98.

Vibe coding has not changed my old conclusion, just sharpened it: the model writes the code, but the judgment is still your job.

Apple Wanted Receipts

Weather Gnome sailed through review in two days. Times Table 400 got stopped at the border.

Instead of an approval, I got a “Guideline 2.1 — Information Needed” letter: seven questions about the app’s purpose, audience, content, and features, plus a request for a screen recording of the full user flow — captured on a physical iPhone, not a simulator.

This turned out to be a great example of where the human is still very much in the loop. Claude drafted a thorough, honest reply to all seven questions in minutes. But no AI could hold my iPhone and record the video that was me, on Do Not Disturb, narrating my way through a first-run setup and a multiplication mission like I was filming a nature documentary.

The other lesson: App Review is a conversation, not a verdict. I replied to the existing review instead of panicking and resubmitting, answered everything directly, attached the video and the review resumed.

Approved!

And then, today: approved, released, live. Times Table 400 is on the App Store, free, no ads, no accounts, works fully offline. An iPad version is already built and queued up next.

Times Table 400 celebration screen with confetti and the words Stellar Run
How it feels when the approval email finally lands.

Some Thoughts

  • Arbitrary limits are often just defaults. Nobody decided 10×10 was the edge of human capability; it is just where the chart in the classroom stopped. Build past the wall in apps and elsewhere!
  • Tools compound. Everything painful about shipping app #1 became a script or a checklist for app #2. The first app is the expensive one.
  • The AI writes the code; you own the curriculum. For anything meant to teach, the design of the learning is the actual product.
  • When Apple asks questions, answer them. Promptly, honestly, with evidence. A review holdup is a request for information, not a rejection.
  • Still budget for the boring 20%. Some things never change.

If Weather Gnome proved that a non-programmer can ship an app, Times Table 400 proved something better: the second one is easier, and the third one will be easier still. The wall is made of paper.

Times Table 400 is on the App Store now — go learn what 13×17 is and feel unreasonably powerful about it!

Weather Gnome: Vibe-Coding My Way Into the App Store

The Idea

For the last year, my sister and I have had a running joke about gnomes. We hid one in her yard after a party, and sure enough a different gnome appeared in our yard a few months later. This running joke spawned an unorthodox idea to create a weather app that felt like a bedtime story instead of a weather spreadsheet.

Enter Vibe Coding

The challenge is I am not an Apple iOS developer, nor am I a programmer. I’ve never shipped an app. Enter “vibe coding” To create the app I used ChatGPT to generate the artwork and then leveraged Anthropic’s Claude Code model Fable 5 to explain my ideas and generate the app. I described what I wanted the same way I’d explain a design project to a friend, and Fable 5 and it wrote the code iteration by iteration. Claude would go build it; I’d squint at the result, play with the beta app, tell Fable what felt off, and we’d run it again, and again. In the end it took 14 iterations to get everything working just right.

The Hard Parts

Should a Weather Gnome app have fireflies floating in the background? Yes it should! That’s vibe coding, you bring the idea and the vision and the model bakes the code for you. It is exactly as fun and empowering as it sounds. I would have a new working feature in twenty minutes and then I would spend two hours arguing with the AI about the app having the wrong temperature or city forecast.

Anybody who tells you the AI can do everything is trying to sell you something. You must trust but verify. Fable 5 could write the app, but it couldn’t click the buttons for me. I still had to wrangle with getting an Apple developer account, working with Xcode, provisioning profiles, certificates, and App Store Connect; a stack of Apple bureaucracy that makes rebuilding a CNC machine look relaxing. (I underestimated the total time. I always underestimate the total time.)

And I made mistakes. There was a stretch where every gnome showed up with the wrong name, and another where a summer beach gnome would appear on a snowy forecast. Vibe coding doesn’t skip the debugging, it just gives you a very patient partner to debug with.

Approved!

I submitted the app for approval to Apple and then two days later it was approved! Then released. Then live! Weather Gnome, a real thing with a real App Store page, made by a guy whose background is decidedly not programming or making apps.

Some Thoughts

  • You don’t need permission to build software anymore.
    If you can describe it clearly and iterate stubbornly, you can build it and you can ship it. It’s time to build!
  • Ideas and testing are the hard part, not programming.
  • The AI writes the code; deciding what’s good is still your job.
    Are gnomes good? The jury is still out!
  • Budget for the boring 20%.
    The last mile; signing, final reviews, the fine details cursed trader takes longer than the fun part.

If you’ve been sitting on an idea telling yourself you “can’t code”, I would gently push back on that presumption. I couldn’t either, really. I just kept describing what I wanted until it existed!

Weather Gnome is on the App Store now! Go find the gnome who lives in your weather!