I built Ride Cave, a free browser-based virtual cycling app for myself and it sort of ballooned from there. I’m using it personally for all my indoor riding and has replaces Zwift and TrainerRoad for me. You shouldn’t have to pay to ride indoors.
You can ride your Intervals.icu calendar directly in Ride Cave. More on that here.
It runs entirely in the browser, connects directly to smart trainers, and has no install or subscription.
Try it here: https://ridecave.com
It includes 100+ free structured workouts, a buncha mini-challenges, and 18 real-world inspired velodromes you can ride or race (CPU controlled ghost racers for now) on using your own trainer.
What makes it different:
• Real physics - “Newtonian simulation” running hundreds of times per second. Banking angles, air resistance, rolling resistance, inertia, rider weight, and power are all modeled. Physics runs fully client-side and deterministically. Milisecond accuracy.
• Energy (kWh) tracking - In addition to watts and TSS, RideCave tracks cumulative energy output in kilowatt-hours, with real-world equivalents (for example how many times you could charge a phone).
• Browser-native -Uses the Web Bluetooth API to connect directly to FTMS trainers like Wahoo KICKR, Tacx, and Saris. Works in Chrome and Edge on desktop. No plugins or installs.
• Privacy-first - people can ride as guests and data stays in browser. But I recommend you sign up for all the features.
• Track and more - Part mission to bring track racing, workouts, and fun to virtual world with formats like flying 200m sprints, pursuit-style intervals, elimination races, and mini challenges built on a new protocol we invented.
Tech stack: React 19, Vite, Three.js, Web Bluetooth API, Supabase for optional sync.
I’m a cyclist who got tired of paying $20/month for Zwift when I mostly just wanted structured track workouts. Built this for myself and figured I’d share it. May create a paid tier at some point but that’s not why I’m building it now.
Would love feedback, especially on overall UX, product direction, and experience. What would make you use something like this over existing options?
Thank you to David for helping me complete the Intervals.icu integration.




