BB's Feast: Cadence Arcade
I invented a completely novel interaction model that brings arcade-style gaming dynamics to smart cycling trainers—transforming indoor exercise into genuine entertainment.
After relocating my family from Seattle to Edinburgh, I found myself between jobs with time to solve a problem that had frustrated me for years: indoor cycling trainers are boring. The existing options—Zwift, TrainerRoad, Peloton—all simulate racing or prescribe structured intervals. What if there was a game that felt like an actual game, where the trainer was just a really cool controller?
I designed and built BB's Feast: an endless runner starring a stubborn, food-motivated little dog whose movement players control entirely through pedaling. The game treats cadence and power as direct game inputs—not cycling metrics to be tracked, but joystick axes that control altitude and speed. What started as a solo developer experiment became the technical foundation and proof-of-concept for Cadence Arcade, a planned five-game fitness gaming platform.
It provided me with the perfect project to get deep into AI design and development workflows. I set out to "vibe code" my way into understanding how AI and design might work together, but ended up about 1000 fathoms deeper, as I learned the limitations of LLMs (e.g. very poor memories, unhelpful improv, etc.) and needed to get very creative about debugging an app that interfaces with a variety of different external devices (trainers, power meters, virtual shifters, and on and on). It was a really fun and fulfilling project where I was able to wear pretty much every possible hat there is, from PM to Designer to Dev to Marketing Head to QA.
It was a project that really required me to think deeply about the physics of riding, and how to balance realistic bike-feel with engaging game dynamics and iterate repeatedly to create an enjoyable game. A particular challenge that I hadn't anticipated was just how limited the hardware was. I went in, imagining that trainers were constantly updating the apps, but learned that it actually interacts through less frequent data packets that get sent about every second or so. This really required me to be creative about how to get the maximum effect from the infrequent updates to ensure that users could effectively maneuver to avoid obstacles and catch food.
Despite the limitations of the current trainer hardware, the feedback I have gotten from testers has made me confident that BB's Feast is a postive evolution of gaming for bike training. The ultimate validation: my kids voluntarily requesting to "play the BB game" —making it genuinely fun first, with fitness benefits following naturally.

Role
Solo Designer & Developer — End-to-end product ownership including game concept, mechanics design, audio design, physics engineering, Bluetooth protocol implementation, Flutter development for iOS/Android (with considerable Claude assistance), asset specification and pixel art direction, pattern-based level generation, playtesting, and comprehensive technical documentation.
BB's Feast reimagines what a fitness game can be. Players pedal on smart trainers to control BB—a rotund little dog who sits stubbornly unless properly motivated. Pedal faster and BB rises to collect elevated premium food. Ease off and BB floats gently back to ground level. Power output determines horizontal scroll speed through the game world. This dual-control scheme creates natural interval training without structured prescriptions. Players surge to high cadence to reach elevated treats, then recover at ground level collecting ground food. The game tracks comprehensive statistics and exports FIT files for serious cyclists while maintaining accessibility for non-cyclists through intuitive "pedal faster to go higher" mechanics. Key Innovation: Treating trainer inputs as direct game controls rather than metrics to be displayed separates BB's Feast from all existing trainer software and enables an entirely new category of fitness gaming.
In a Nutshell
Most Fun
Watching my kids enthusiastically demand "trainer time" — the ultimate validation that the game succeeds as genuine entertainment, not gamified exercise.
Biggest Challenge
Engineering responsive elevation physics. Power readings update too slowly for smooth gameplay — the breakthrough was switching to cadence for vertical control, providing instant 1:1 feedback.
In Retrospect
Would have invested in comprehensive Bluetooth hardware testing earlier. Protocol incompatibilities with certain trainer brands emerged late, requiring last-minute workarounds.
BB's Feast gameplay trailer — iPad
Customer Impact
- Product Delivered : Launch-ready iOS/Android app with universal smart trainer compatibility, 60 FPS performance across devices from iPhone 8 equivalent forward, complete asset pipeline with graceful fallback for missing sprites, FIT file export integrating with Strava and training platforms, comprehensive activity tracking and local leaderboards
- Proof of Concept : Validated cadence-as-joystick control scheme works for cycling games, established reusable physics engine and Bluetooth integration for future titles, demonstrated "game-first, workout second" positioning resonates (kids requesting trainer time), created technical foundation enabling rapid development of remaining four Cadence Arcade games
- Personal Achievement : Shipped complete product solo while job hunting and relocating family internationally, proved concept worth investing in as platform, not just single game

Key Design Decisions
Concept and Character — I was excited by the idea of using trainer input as the primary affordance for the game, and started thinking of game-types that would best use power, cadence, and speed. My vision for Cadence Arcade games was to be reminiscent of old 8-bit console games, so I pretty quickly landed on an endless runner for the first title to really represent the spirit of what I was going for. I had toyed around with other animals (pig, monkey, squirrel) for the main character, but after thinking a bit more about what type of animal would be ideal for scarfing up food, I decided my old dog BB would be the perfect avatar: she was very silly looking so would be fun, she was more food motivated than any dog I had ever known, and who doesn't like dogs?
Sound and Music — I had a blast going through the many different open-source sound libraries to find just the right sounds for the moment. It was really important that all audio was right for the mood of the game, providing the user with both meaningful feedback, but also a hint of fun and levity that would further separate this game from the more "serious" offerings out there for cyclists.
Cadence for Elevation, Power for Speed — The fundamental innovation separating BB's Feast from all trainer software. Power readings from trainers are slow and fluctuate significantly—using them for vertical position created unplayable choppiness. Cadence provides instant feedback that naturally maps to "rising" in cycling. This separation allows independent tuning: responsive elevation for obstacle avoidance, realistic speed physics for workout feel.
Velocity-Based Physics With Momentum — BB doesn't teleport to target heights—she accelerates toward them with vertical momentum that persists between frames. Asymmetric acceleration (faster rising, slower falling) creates intuitive "floaty descent" feel. Adaptive smoothing detects intentional cadence spikes (fast response) vs. steady pedaling (noise filtering). Result: responsive when needed, stable when not.
Patterns Over Randomness — Designed named formations (Log Field, Rock Garden, Choice Pattern) that players recognize and master rather than random generation. Same well-tuned patterns scale across four difficulty levels by adjusting speed, not adding chaos. Creates skill progression and strategic decision-making.
Building the Foundation
The original concept envisioned power controlling both speed and elevation. BB would have five power states: stubborn sitting below 50W, sluggish at low power, happy running at moderate power, floating at high power, and rainbow invincibility at peak effort. This personality-driven design—BB refusing to move unless properly motivated—wasn't arbitrary. It created engagement through character behavior rather than abstract game rules.
Early prototypes established the core architecture using Flutter's rendering system, keyboard controls for testing without hardware, and basic sprite animation showing BB's different movement states. Everything worked smoothly... in debug mode with keyboard input.
Building a Trainer Game Without a Trainer — One of the biggest challenges in the early days of development was the fact that I didn't actually own a bike trainer. I had sold mine prior to the move and didn't really have space in our flat to easily set one up. This forced me to be creative with how I approached development and testing. I fortunately had a generous friend who would let me come over and test on his bike a few times a week, but I needed to be creative to ensure development was moving forward between test sessions.
I accomplished this via two methods for spoofing trainer behavior in the app environment. One of the first things I did as I was developing the app was to create a browser and keyboard debug mode that allowed me to see the game in motion without a trainer. This was key to seeing the character, food, background, and general feel of the game at different power and speed zones. I was able to use arrow keys and numbers to get BB into the appropriate zones to see how she moved, when she went from walking to running to flying, and ensure the parallax motion looked right.
The second tool that helped me really get things off the ground was nRF Connect, which allowed me to create virtual trainers that the game could attempt to pair with. This was absolutely key for working through connection bugs prior to testing on the bike, allowing me to focus on testing gameplay instead of banging my head against connectivity issues.
The Physics Breakthrough
Testing with an actual smart trainer revealed the fundamental flaw. Power-based elevation felt terrible—not because of game design, but because of how trainers work. Bluetooth power updates arrive roughly once per second with natural fluctuations. Power readings would jump: 246W → 268W → 281W → 290W → 285W, producing five distinct jarring vertical movements per second. BB looked like she was riding an elevator, not flying gracefully.
The first attempted fix was power input smoothing using exponential moving average. This helped horizontal speed feel natural but didn't solve elevation choppiness. Even smoothed power still changed frame-to-frame, and directly mapping those changes to position amplified them visually.
The second attempt added elevation position smoothing on top of power smoothing—double-smoothing. This reduced choppiness but created lag that made precise obstacle avoidance frustrating. You'd spike power to dodge a snake, then watch BB slowly drift upward a fraction of a second later.
The Breakthrough — The insight came from questioning the fundamental assumption: why use power for elevation at all?
Cadence (pedaling speed in RPM) provides direct 1:1 feedback from crank rotation. More importantly, cadence naturally maps to altitude in cycling—higher cadence feels "lighter," matching real-world experience. When you spike RPM to dodge an obstacle, the game can detect that instant intent and respond immediately. During steady pedaling, small sensor fluctuations get filtered out.
This led to a complete physics rewrite separating horizontal and vertical systems:
Horizontal movement — Trainers already handle speed nicely, so we simplified things to just use that direct data to control forward movement. Air resistance creates natural equilibrium speeds—100W settles around 22 km/h, 200W around 38 km/h. This matches real cycling feel without artificial limits.
Vertical movement — Cadence determines target elevation across three zones (Ground 0-69 RPM, Flying 70-99 RPM, Rainbow 100+ RPM), but BB doesn't jump directly to that height. Instead, she accelerates toward it with actual vertical momentum that persists between frames. Rising is snappier than falling, creating that "floaty descent" feel. The system uses adaptive smoothing—fast response when you intentionally spike cadence, stable filtering during steady pedaling to prevent wobble.
The result: responsive when you want it, stable when you don't.

Polish and Integration
Designing Patterns, Not Randomness — Early food and obstacle generation used random placement. This created three problems: overlaps where obstacles blocked food, uneven distribution with clumps followed by empty stretches, and no learnable patterns for skill development.
The solution was designing specific formations with clear purposes:
Log Field — 50% density ground obstacles requiring moderate weaving.
Rock Garden — Rhythmic spacing matching natural pedaling cadence.
Choice Pattern — Elevated food chain above ground obstacle field—surge high for premium points (high effort, high reward) or navigate ground conservatively (lower score, less demanding).
Food chains award completion bonuses. Elevated chains mix ground and floating items vertically, creating natural intervals: collect ground bones at steady pace → surge to high cadence to grab steaks → drop back down and repeat.
Progressive difficulty emerged from using the same well-tuned patterns at increasing speeds and with premium items appearing after players travel significant distance. One good pattern automatically becomes four difficulty variations without adding randomness.
Universal Trainer Compatibility — Smart trainers don't all speak the same Bluetooth language. Some broadcast FTMS (the official standard), others use the older Cycling Power Service, and some expose both simultaneously. My development trainer—an Elite Suito—only used Cycling Power Service, forcing immediate support for both protocols or the game wouldn't work on my own hardware.
FTMS provides comprehensive metrics in a single data packet. Cycling Power Service requires parsing optional crank revolution data—cumulative revolution count plus timestamp—then calculating RPM from the difference between consecutive readings.
The implementation detects available protocols automatically and falls back gracefully. It also handles cadence decay detection: when players stop pedaling, trainers stop sending data updates. Without decay logic, cadence would freeze at the last value indefinitely. The solution: if no updates for half a second, cadence drops to zero and BB descends smoothly.
Polish and Feel — Real trainers' flywheels decelerate quickly when power drops—physically accurate for the trainer, but it doesn't match outdoor cycling where body mass provides momentum. The solution separates what affects scoring from what affects visuals. Distance accumulation for points uses actual trainer speed, but screen scrolling uses smoothed visual velocity. This creates realistic "coasting" feel while maintaining workout accuracy.
The HUD evolved from text-heavy labels to a clean segmented power bar with color-coded zones and minimal text. Activity history tracks cumulative statistics and individual sessions, with FIT file export bridging arcade gaming and serious training platforms like Strava.
Preparing for Launch
Beta testing targets diverse hardware (multiple trainer brands and firmware versions) and user types (serious cyclists, casual exercisers, children, non-cyclists). Structured feedback surveys explore session duration preferences, difficulty appropriateness, physics feel, and feature priorities.
Comprehensive technical documentation serves as a template for the remaining four Cadence Arcade games. Every solved problem—physics engine structure, Bluetooth integration, pattern generation frameworks, scoring systems—becomes reusable infrastructure.
What I Learned
Use AI Like a Team — I used Claude and Claude Code throughout to work through this project. I encountered a lot of issues that helped me to refine my process and came to a workflow that worked really nicely to utilize the strengths of each to good effect. Specifically, I leaned heavily on Claude as my conceptual partner to work through any fundamental ideas around gameplay, interaction design, marketing, etc. since its Projects structure allowed it to have deep knowledge of my goals and the history for the project. This was quite different from Claude Code, which had a ton of knowledge of the code base, but very little project knowledge. In the end, I found a good rhythm of working out ideas in Claude, having Claude help develop prompts to feed to Claude Code to implement our ideas. This helped me maintain incredibly fast momentum, with less (though not zero) bad assumptions about what I was trying to accomplish.
Hardware diversity matters early — Protocol incompatibilities with certain trainer models emerged late in development. Earlier testing across the full hardware matrix would have surfaced edge cases sooner.
Player validation trumps metrics — Make the experience great and success will follow. Kids enthusiastically demanding trainer time confirmed the concept better than any analytics dashboard could. Make it fun first; fitness follows naturally.
Document for future-you — Comprehensive guides for physics tuning, Bluetooth integration, and pattern design are paying dividends as I build the remaining Cadence Arcade games. Every solved problem becomes reusable infrastructure.