Week of Oct 26
- Improved the avatar preview (+ zoom/pan)
- Fixed invites for private events
- Improved road surface textures π₯
- Fixed direction of flowing water
- Fixed world projection precision (props JM)
- Fixed bridge piers poking through deck (props JM)
- Added "poor man's ray tracing"; proper terrain shadowing when riding through valleys
- Added "Rode" column to workout events too
- Revamped auto-steer π₯
- Updated Help Center styling
- Route Editor - redesigned the "Draw a route" area
- Route Editor - "Draw a route" now seamlessly flows into the Route Editor
- Route Editor - brunnels are now automatically detected and annotated
- Route Editor - missing elevation data is filled in automatically
- Route Editor - scoring is now based on the actual ride line
- Route Editor - fixed issues with the "Fix all" button
- Route Editor - warn before navigating away (to prevent data loss)
- Route Editor - reorganized the processing pipeline (props JM + DC)
Week of Oct 19
- Refactored route generation to be simpler and more efficient
- BikeTERROR - ride 5km with others for +1 coin (lap independent)
- Fixed routes page map/grid toggle
- Added MUOV bike support
- Bluetooth - refactored code, much better dropout + reconnect handling π₯
- Bluetooth - prefer FTMS (over FE-C) when available
- Bluetooth - greatly expanded test coverage
- Better error handling when connecting to 3rd party services
- Rides recovered after a crash or a sleeping laptop no longer show inflated time, calories or power
- Workouts started after "quit without saving" now start properly
- Route editor - long routes edit without freezing
- Route editor - smoothing / aligning works around loop boundaries and bridges
- Route editor - failed route saves now show an error
- Fewer stutters and pop-in on iPad
Week of Oct 12
- Signups now open for BikeTERROR, starts on Oct 16th π
- Upgraded to Sveltekit 3
- Event pages - added weighting to Attendance column
- Added support for full-lane race events π₯
- Fixed full-screen toggle UI (props Steven E)
- Topnav - added "Series" and "Collections"
- Topnav - replaced user name with photo
- Tweak: moved cheer text to the left of the cheer button
- Faster ride startup
- Added OpenBikeControl support π₯
- Save route elevations at millimeter precision (props Dan C)
- Cleaned up the keyboard/button input logic
- Event filters - "type" is now a multi-select
- Routes filters - separated "ridden / not ridden" into its own dropdown
- Routes filters - "country" is now a multi-select
- Routes filters - "ride time" is now a slider with 15-minute increments
Week of Oct 5
- Lowered 3D tree caps across all view quality tiers
- Fixed terrain carving near brunnel edges (props JM)
- Cleaned up and unified terrain generation
- Fixed issue with ERG adjustment UI buttons not appearing
- Casual events - display a checkbox beside riders who rode in the event
- Fixed issue with notification bell not appearing
- Added rider list (and results tab) to bot races π₯
- Added event banners
- Tweaked (defrosted) the Tundra biome
- Steering - removed auto-centering; hold current line unless drafting
- Spectators now see the active rider's race clock (for time trials)
- Reduced tree sizes
- Improved tree geo-fencing
- Improved climate detection using aridity π₯
- Added Biketerra and The Black Bibs logos to event barriers
- More top-secret BikeTERROR changes π
- Switched ERG steps to be relative to current power (props Aku)
- Added CYCPLUS BC2 virtual shifter support
Week of Sept 28
- Starting on BikeTERROR... π
- Event listing: default to "All", renamed Group to "Group by series"
- Dashboard: keep event times visible in mobile view
- Live Map: make sure "Spectate" button appears for events
- Fixed rendering of OSM oddball "water" features, e.g. capes (props JM)
- Fixed riders losing progress while the browser tab is minimized
- Fixed terrain when water runs above a tunnel (props JM)
- Salt ponds are now rendered as water
- Re-tuned road rolling resistance (props JM)
- Routes map: improved clustering
- Routes map: clicking a marker shows the route path
- Routes map: when sufficiently zoomed in, hovering over a marker shows the route path
- Routes map: tooltip now displays elevation profile
- Routes map: performance and loading improvements
- Routes map: fixed zoom bug when hovering over a marker
Week of Sept 21
- Added "Cheer" icon to co-riders on activity pages
- Prevent buildings from intersecting bridge decks (props JM)
- Prevent buildings from intersecting tunnels (props JM)
- Improved handling when crossing a race finish line when disconnected
- Included weighted power in activity meta
- Slim down saved activity files by removing zero-value columns
- Included "Draft Percent" in FIT exports
- Fixed a few FIT parsing bugs
- Improved: much lower GPU memory usage (100-300% less) π₯
- Numerous internal 3D optimizations
- See last week's changelog β
Week of Sept 14
- Improved bots! π€
- 3 bot modes - Companions (bots that stay with you), Gran Fondo (bots spread around the route), and Race
- 5 race difficulty levels, which can be changed mid-race
- Bots have situational awareness, will plan and adjust tactics based on the terrain, their energy reserves, etc.
- Each bot has a unique risk tolerance and willingness to cooperate
- Bots are now able to decide when to attack, chase, sit in the draft, take a pull, or let a breakaway go
- Bots save energy for the finale, launch late attacks, and respond to rivalsβ sprints
- Added race position stat beside the lap counter
- Removed unnecessary "Edit" icon from actions menu (bottom left)
- Fixed grass poking through the road at turnaround joins
- Fixed terrain poking through bridge decks
- Fixed bike chain clearance (prevents flickering)
- Added higher res 3D rider models π₯
- Fixed race gaps on out-and-back courses
- Fixed issue when multiple cadence devices are paired
- Fixed rare Power Match bug
- Improved multiplayer smoothness on internet lag
- Support Zwift Ride controller multi-button presses
- Added ride loading indicator...
- Prevent bridge piers from rendering on roads underneath (props JM)
- Improved guardrail detection and implementation (props JM)
- Fixed terrain clipping at tunnel entrances
- Fixed floating roadside foliage
- Fixed flickering far-view terrain, wasn't getting properly culled
- Improved 3D avatar lighting / shading
Week of Sept 7
- Moved streetlights closer to the road, centered lights mid-lane
- Automatically clear device metrics upon dropout / disconnect
- Added Torque UI stat (NΒ·m)
Week of August 31
- Route editor - improved speed of the "Auto-detect brunnels" feature π₯
- Improved roadside grass coloring and blending
- Improved forest ground cover
- Fixed flickering windows at night
- Optimized scene rendering, more efficient "Maximum" view quality
- Added 12 new flora species, including weeping willow, pricky pear, redwood, baobab, etc.
- Increased tree trunk poly count
- In-ride zone chart labels are now prefixed with
PWR or HR - Massively increased view distance (up to 10x!) across all user tiers π₯
- New turnaround statues!
- Fixed multiplayer bug in the old (WebGL) engine
- Hardened race events to prevent spoofing
- Rebuilt the in-ride HUD π₯
- HUD - more customizable stats
- HUD - added online rider positions to the elevation chart
- HUD - cleaned up the rider list
- HUD - better mobile / responsive support
- HUD - added chat "toasts" when the chat box is minimized
- HUD - moved drivetrain settings to "Ride" menu
- HUD - added "Power step" setting to control ERG step (default = 5W)
- Events page - grouped by series AND event type
- Server-side - optimized world datasets
Week of August 24
- Rebuilt the in-ride menu
- Menu is now keyboard accessible (incl. hardware buttons!)
- Native apps - devices now auto-save automatically, and un-save when you manually disconnect them
- More intuitive device pairing UI
- HUD - new "Altitude" stat
- HUD - new "HR zones" stat
- Chat - hidden on page load, the notification dot show unread message count
- Allow for "Teleport to distance" value to be typed in
- Redesigned activity pages, including new "Training Load" stats
- Redesigned athlete profile pages
- Redesigned event detail pages
- Redesigned club detail pages
- Redesigned challenge pages, better description of actual goals
- Redesigned site-wide tables (much more usable)
- Disabled blinking tail lights π¨
- Various website styling tweaks
- Fixed unreadable HTML dropdown choices in Windows
- Route map - reduced cluster density, improved performance
- Added font smoothing
- Patched some edge-case tunnel seams
- Reduce terrain carving around bridges
- Terrain carving improvements
- Added in-ride screenshots πΈ
- Redesigned /events page, enabled series grouping by default
- Redesigned event series pages
- Improved roofs for simple buildings (proper A-frames)
- Removed windows from small, skinny buildings... towers, pillars, etc.
- Some building windows are lit at night
- Added new start arch
- Urban areas: added streetlights, sidewalks
- Menu - clicking a multi-choice setting now opens a dropdown of its options
- Added "Download photo" button to activity pages (saves to PNG)
- Exported filenames now include the activity ID and title
- Styled the export buttons, added progress indicators
- Fixed bug with disappearing bridges / guardrails on short loop routes
Week of August 17
- Ride with others on ANY route! Instantly toggle between Offline and Public modes (top right of ride screen)
- Easier to ride with others! Added a Live Map to see who's riding right now and jump in (subscribers)
- Join a rider - you start by spectating the rider until your devices are ready to go, then click "Start riding" to drop your avatar beside them
- Spectate any populated route
- Click a rider in the rider list to show a context menu: teleport or mute them
- Added a "# riders" badge to routes and events
- Activity detail - new "You rode with" section to easily follow the people you rode alongside with
- Settings - added a Privacy tab with clearer descriptions
- Added subscription details to the Settings page
- Improved the subscriber workflow, show renewal dates
- Added compare page: Indoor Cycling Apps in 2026
- New Facebook URL: https://www.facebook.com/ridebiketerra
- Added Terrance the turtle to route detail pages
- More SEO improvements
Week of August 10
- π₯ Rebuilt trees, shrubs, and grass, now 16 plant species across biomes
- π₯ More realistic leaf shapes, true to each species
- 3D grass now extends beyond the roadside
- Distant trees stay correctly lit as the sun moves through the day
- Reduced stuttering during the first seconds of a ride
- Fixed 2D trees so they blend much better into 3D
- Fixed route quality scores shifting after saving a route
- Fixed grass sprouting behind the start/finish line on looped routes
- π₯ Routes now use real-world climate data instead of hand-picked biome presets
- Improved flora species placement based on real ecology
- Improved spread / clustering of forest tree species
- Improved and simplified logic for snowy tundra routes
- Route editor: prevent smoothing when using "Align elevations"
- Added support for limiting foliage to native ranges (e.g. Saguaro)
- Fixed attendance percentages to handle ongoing events
- SEO improvements (finally)
Week of August 3
- Tons of visual updates from last week, check out full changelog
- New volumetric clouds
- Real star positions (5,000 stars!), thanks to the Yale Bright Star Catalog βοΈ
- Added dynamic moon phase
- Re-balanced ground colors, lowered saturation to more realistic levels
- Added Help Center "Updates" section (newsletter)
- Tweaked Help Center styles
- Added "Calories" stat to activity detail pages
- Raised POV camera to eye level, switched to sticky vertical tilt
- Fixed multiplayer ping regression, props @Rocketman
- Fixed unrealistic cloud movement upon camera rotation
- Fixed fogged terrain clipping clouds
Week of July 27
- Added tooltips to the dashboard chart
- Fixed inline editing on the /settings page
- Fixed social bots not holding pace around you
- Prevented the minimap from re-centering when mouse hovered
- Fixed bots masses (now skewed based on the Ego rider)
- Improved Social bots, they no longer just wheel-suck
- Brighter, more natural daylight, with distinct morning/evening/night moods in every biome
- Rivers and lakes are now flat, level water with real waterlines
- Rivers visibly flow downstream, rushing and churning white on steep drops
- Lakes are calm and glassy at a distance, sparkling up close
- Natural shorelines with sandy shelves, wet edges, and lapping waves β even along roads and under bridges
- Added sun and moon!
- Sky colors are dynamically calculated based on sun position, turbidity, etc.
- Improved shadows, including realistic blue hues at sunset
- Improved haze, water and reflections to match the sky
- Added
Time setting to let you customize the sky + lighting - Added
Time flow setting to enable automatic day/night cycles - Prevent Gran Fondo bots from waiting for the stopped Ego
Week of July 20
- Revamped bots!
- New: bot behavior presets β the rider field will populate automatically
- New: Spicy finales β bots launch late attacks, sprints, and counters in the closing kilometers
- New: Bots now think for themselves β chasing, attacking on climbs, countering moves, and sitting in to draft like a real group
- New: Every bot has its own strengths and style β sprinters, climbers, engines β no two feel the same
- New: Bots spend energy, fade when they've overcooked it, and try to save something for the finish
- Improved: Smoother, more natural terrain and cleaner roadsides
- Improved: Faster, tidier loading
- Fixed bots spawning at zero speed
- Fixed milepost markers on long routes (numbers are now vertical)
- Revamped site filtering
- Dashboard - added filterable trends
Week of July 6
- Added TDF LIVE (livestream of each TDF stage)
- Added building varieties
Week of June 29
- Fixed
Foliage style setting not saving - Fixed distant-scenery flicker
- Route editor: use lerped elevation when adding a point
- Route editor: don't auto-update elevation when dragging a point
- Fixed "moving time" counting paused/stopped gaps as moving
Week of June 15
- Fixed bugs discovered via the crashlog
- Fixed tile-load and grass-generation frame stutters
- Fixed grade Infinity β NaN rider crash spiral at hairpin turns
- Website - reorganized detail pages
- Events - completing an event automatically removes it from your iCal feed
Week of June 8
- Fixed /collections pagination
- Added power meter left/right balance to FIT export
- Added ability to upload JSON routes
- Added "Ambient Roads" UI setting to toggle side roads
- Added ability to "cheer" another rider's activity
Week of June 1
- Route Editor: added button to auto-detect and annotate bridges/tunnels!
- Settings page: fixed issue when applying discounts
- Route editor: improved responsiveness for huge (200k+ point) routes
- Event listing: display the associated series image if available
- Bridges: added split pylons to support roads underneath
- Fixed rowing power fade-out (inactivity timeout never fired)
Week of May 25
- New Route Editor!
- Route Editor: added option to either upload or draw a route
- Route Editor: cleaner UI, bigger edit area
- Route Editor: better overview of route issues
- Route Editor: added a "Fix" button beside each issue
- Route Editor: added a "Fix all" button above the issue list
- Route Editor: simpler flow to add annotations (brunnels, surface types)
- Route Editor: support annotations across loop boundary
- Route Editor: click+drag in elevation area to select, shift+click+drag to zoom
Week of May 18
- Added custom virtual gear ratios (in-ride setting)
- Added power zone UI
- Fixed chat notification dot always blinking
- Fixed missing "Start time" field when creating casual events
- Added "Rowing" control mode
- Added "Rowing power boost" UI setting (to better sync rowing power with cycling power)
- Added power zones chart to activity detail pages
- Added API Key generation to the settings page... more details soon
- Faster terrain loading
Week of May 11
- Added
Calories UI stat (+ added to FIT export files)
Week of May 4
- All 6 featured routes are now online-enabled
- Drafting model V2 (props Mike W)
- Improved slipstream shape, increased tail length
- Fixed issues with motion planning causing periods of 0 draft
- Handle when Cloudflare Turnstile (captcha) is blocked
- Improved tile loading, added retry logic
Week of April 27
- Fixed grass poking through roadside cropland
- Improved tunnel appearance, cleaned up terrain "hole punching"
- Added smoothing to tiny streams
- Fixed lag/freezing when loading buildings in dense urban areas
- Fixed event time weirdness
- Fixed rider angle when stopped and teleporting
- Fixed pressure wave effect for lead riders
- Fixed shadows at sections of singletrack / gravel roads
- Improved bridges
Week of April 20
- GPU memory tuning + crash recovery improvements
- Added memory usage stats to the Debug overlay (SHIFT + Z)
- Improved memory usage of the wireframe mesh mode
- Fixed trees not respawning properly when restoring a tile from cache
- Cleaned up logging
- Switched to better elevation data source
- Tweaked water depths / widths
- Experimental: added /routes/draw page for building new routes
- Fixed duplicate BLE connection attempts for native apps
- Standardized fetch() requests β to make log viewing easier
Week of April 13
- Added automatic GPU crash recovery
- Added more multiplayer latency handling
- Roamer bot FTP is now 55% - 110% user FTP
- Removed unnecessary dependencies, reduced load size
- Modernized site-wide reactivity (Svelte 5)
- Added automatic (and manual) debug log uploading
Week of April 6
- Fixed TTT team assignment for late joiners (hopefully?)
- Reduced Ego resolution to fix jersey distortion
- Updated bot archetypes (they should be smarter now)
- Improved multiplayer latency handling
- Standardized cadence-based stand pedaling across all rider types
- Clarified "Forgot password?" text
- Major internal code cleanup
- New website design (sorry, all the purple got to be too much)
- Fixed end-of-route turnarounds
- Fixed surface types at loop boundaries (props Dan C.)
- Fixed route editor surface type annotations at loop boundaries
- Better GPU frustum culling for grass/trees
- Fixed rider shadows
- Fixed dense urban area freezes β removed expensive building overlap detection, added frame-budget yields
- Removed three.js animation dependencies
- Cap stand-pedaling to 60rpm
- Fixed rider speed issue w/ Maximum view distance β birds exceeded their buffer limit, causing a GPU breakdown
- Added dark mode
- Updated elevation chart colors (based on Jim's feedback)
- Fixed Route Editor's dark mode styling
View the changelog archive β